@@ -444,12 +444,10 @@ bool ClangImporter::Implementation::shouldIgnoreBridgeHeaderTopLevelDecl(
444444 return importer::isForwardDeclOfType (D);
445445}
446446
447- ClangImporter::ClangImporter (ASTContext &ctx,
448- DependencyTracker *tracker,
447+ ClangImporter::ClangImporter (ASTContext &ctx, DependencyTracker *tracker,
449448 DWARFImporterDelegate *dwarfImporterDelegate)
450449 : ClangModuleLoader(tracker),
451- Impl(*new Implementation(ctx, tracker, dwarfImporterDelegate)) {
452- }
450+ Impl(*new Implementation(ctx, tracker, dwarfImporterDelegate)) {}
453451
454452ClangImporter::~ClangImporter () {
455453 delete &Impl;
@@ -1298,11 +1296,9 @@ std::unique_ptr<clang::CompilerInvocation> ClangImporter::createClangInvocation(
12981296 return CI;
12991297}
13001298
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) {
13061302 std::unique_ptr<ClangImporter> importer{
13071303 new ClangImporter (ctx, tracker, dwarfImporterDelegate)};
13081304 auto &importerOpts = ctx.ClangImporterOpts ;
@@ -1788,15 +1784,24 @@ bool ClangImporter::importHeader(StringRef header, ModuleDecl *adapter,
17881784 off_t expectedSize, time_t expectedModTime,
17891785 StringRef cachedContents, SourceLoc diagLoc) {
17901786 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+ }
18001805 }
18011806
18021807 // 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,
18061811
18071812 if (!cachedContents.empty () && cachedContents.back () == ' \0 ' )
18081813 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);
18121816 return Impl.importHeader (adapter, header, diagLoc, /* trackParsedSymbols=*/ false ,
18131817 std::move (sourceBuffer), true );
18141818}
0 commit comments