@@ -444,12 +444,10 @@ bool ClangImporter::Implementation::shouldIgnoreBridgeHeaderTopLevelDecl(
444
444
return importer::isForwardDeclOfType (D);
445
445
}
446
446
447
- ClangImporter::ClangImporter (ASTContext &ctx,
448
- DependencyTracker *tracker,
447
+ ClangImporter::ClangImporter (ASTContext &ctx, DependencyTracker *tracker,
449
448
DWARFImporterDelegate *dwarfImporterDelegate)
450
449
: ClangModuleLoader(tracker),
451
- Impl(*new Implementation(ctx, tracker, dwarfImporterDelegate)) {
452
- }
450
+ Impl(*new Implementation(ctx, tracker, dwarfImporterDelegate)) {}
453
451
454
452
ClangImporter::~ClangImporter () {
455
453
delete &Impl;
@@ -1298,11 +1296,9 @@ std::unique_ptr<clang::CompilerInvocation> ClangImporter::createClangInvocation(
1298
1296
return CI;
1299
1297
}
1300
1298
1301
- std::unique_ptr<ClangImporter>
1302
- ClangImporter::create (ASTContext &ctx,
1303
- std::string swiftPCHHash, DependencyTracker *tracker,
1304
- DWARFImporterDelegate *dwarfImporterDelegate,
1305
- bool ignoreFileMapping) {
1299
+ std::unique_ptr<ClangImporter> ClangImporter::create (
1300
+ ASTContext &ctx, std::string swiftPCHHash, DependencyTracker *tracker,
1301
+ DWARFImporterDelegate *dwarfImporterDelegate, bool ignoreFileMapping) {
1306
1302
std::unique_ptr<ClangImporter> importer{
1307
1303
new ClangImporter (ctx, tracker, dwarfImporterDelegate)};
1308
1304
auto &importerOpts = ctx.ClangImporterOpts ;
@@ -1788,15 +1784,24 @@ bool ClangImporter::importHeader(StringRef header, ModuleDecl *adapter,
1788
1784
off_t expectedSize, time_t expectedModTime,
1789
1785
StringRef cachedContents, SourceLoc diagLoc) {
1790
1786
clang::FileManager &fileManager = Impl.Instance ->getFileManager ();
1791
- auto headerFile = fileManager.getFile (header, /* OpenFile=*/ true );
1792
- // Prefer importing the header directly if the header content matches by
1793
- // checking size and mod time. This allows correct import if some no-modular
1794
- // headers are already imported into clang importer. If mod time is zero, then
1795
- // the module should be built from CAS and there is no mod time to verify.
1796
- if (headerFile && (*headerFile)->getSize () == expectedSize &&
1797
- (expectedModTime == 0 ||
1798
- (*headerFile)->getModificationTime () == expectedModTime)) {
1799
- return importBridgingHeader (header, adapter, diagLoc, false , true );
1787
+ // Especially in an explicit modules project, LLDB might not know all the
1788
+ // search paths needed to imported the on disk header, so prefer the
1789
+ // serialized preprocessed contents when debugger support is on.
1790
+ if (!Impl.SwiftContext .ClangImporterOpts .PreferSerializedBridgingHeader ||
1791
+ cachedContents.empty ()) {
1792
+ auto headerFile = fileManager.getFile (header, /* OpenFile=*/ true );
1793
+ // Prefer importing the header directly if the header content matches by
1794
+ // checking size and mod time. This allows correct import if some no-modular
1795
+ // headers are already imported into clang importer. If mod time is zero,
1796
+ // then the module should be built from CAS and there is no mod time to
1797
+ // verify. LLDB prefers the serialized bridging header because, in an
1798
+ // explicit modules project, LLDB might not know all the search paths needed
1799
+ // to imported the on disk header.
1800
+ if (headerFile && (*headerFile)->getSize () == expectedSize &&
1801
+ (expectedModTime == 0 ||
1802
+ (*headerFile)->getModificationTime () == expectedModTime)) {
1803
+ return importBridgingHeader (header, adapter, diagLoc, false , true );
1804
+ }
1800
1805
}
1801
1806
1802
1807
// If we've made it to here, this is some header other than the bridging
@@ -1806,9 +1811,8 @@ bool ClangImporter::importHeader(StringRef header, ModuleDecl *adapter,
1806
1811
1807
1812
if (!cachedContents.empty () && cachedContents.back () == ' \0 ' )
1808
1813
cachedContents = cachedContents.drop_back ();
1809
- std::unique_ptr<llvm::MemoryBuffer> sourceBuffer{
1810
- llvm::MemoryBuffer::getMemBuffer (cachedContents, header)
1811
- };
1814
+ std::unique_ptr<llvm::MemoryBuffer> sourceBuffer =
1815
+ llvm::MemoryBuffer::getMemBufferCopy (cachedContents, header);
1812
1816
return Impl.importHeader (adapter, header, diagLoc, /* trackParsedSymbols=*/ false ,
1813
1817
std::move (sourceBuffer), true );
1814
1818
}
0 commit comments