@@ -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;
@@ -1301,11 +1299,9 @@ std::unique_ptr<clang::CompilerInvocation> ClangImporter::createClangInvocation(
13011299 return CI;
13021300}
13031301
1304- std::unique_ptr<ClangImporter>
1305- ClangImporter::create (ASTContext &ctx,
1306- std::string swiftPCHHash, DependencyTracker *tracker,
1307- DWARFImporterDelegate *dwarfImporterDelegate,
1308- bool ignoreFileMapping) {
1302+ std::unique_ptr<ClangImporter> ClangImporter::create (
1303+ ASTContext &ctx, std::string swiftPCHHash, DependencyTracker *tracker,
1304+ DWARFImporterDelegate *dwarfImporterDelegate, bool ignoreFileMapping) {
13091305 std::unique_ptr<ClangImporter> importer{
13101306 new ClangImporter (ctx, tracker, dwarfImporterDelegate)};
13111307 auto &importerOpts = ctx.ClangImporterOpts ;
@@ -1791,15 +1787,24 @@ bool ClangImporter::importHeader(StringRef header, ModuleDecl *adapter,
17911787 off_t expectedSize, time_t expectedModTime,
17921788 StringRef cachedContents, SourceLoc diagLoc) {
17931789 clang::FileManager &fileManager = Impl.Instance ->getFileManager ();
1794- auto headerFile = fileManager.getFile (header, /* OpenFile=*/ true );
1795- // Prefer importing the header directly if the header content matches by
1796- // checking size and mod time. This allows correct import if some no-modular
1797- // headers are already imported into clang importer. If mod time is zero, then
1798- // the module should be built from CAS and there is no mod time to verify.
1799- if (headerFile && (*headerFile)->getSize () == expectedSize &&
1800- (expectedModTime == 0 ||
1801- (*headerFile)->getModificationTime () == expectedModTime)) {
1802- return importBridgingHeader (header, adapter, diagLoc, false , true );
1790+ // Especially in an explicit modules project, LLDB might not know all the
1791+ // search paths needed to imported the on disk header, so prefer the
1792+ // serialized preprocessed contents when debugger support is on.
1793+ if (!Impl.SwiftContext .ClangImporterOpts .PreferSerializedBridgingHeader ||
1794+ cachedContents.empty ()) {
1795+ auto headerFile = fileManager.getFile (header, /* OpenFile=*/ true );
1796+ // Prefer importing the header directly if the header content matches by
1797+ // checking size and mod time. This allows correct import if some no-modular
1798+ // headers are already imported into clang importer. If mod time is zero,
1799+ // then the module should be built from CAS and there is no mod time to
1800+ // verify. LLDB prefers the serialized bridging header because, in an
1801+ // explicit modules project, LLDB might not know all the search paths needed
1802+ // to imported the on disk header.
1803+ if (headerFile && (*headerFile)->getSize () == expectedSize &&
1804+ (expectedModTime == 0 ||
1805+ (*headerFile)->getModificationTime () == expectedModTime)) {
1806+ return importBridgingHeader (header, adapter, diagLoc, false , true );
1807+ }
18031808 }
18041809
18051810 // If we've made it to here, this is some header other than the bridging
@@ -1809,9 +1814,8 @@ bool ClangImporter::importHeader(StringRef header, ModuleDecl *adapter,
18091814
18101815 if (!cachedContents.empty () && cachedContents.back () == ' \0 ' )
18111816 cachedContents = cachedContents.drop_back ();
1812- std::unique_ptr<llvm::MemoryBuffer> sourceBuffer{
1813- llvm::MemoryBuffer::getMemBuffer (cachedContents, header)
1814- };
1817+ std::unique_ptr<llvm::MemoryBuffer> sourceBuffer =
1818+ llvm::MemoryBuffer::getMemBufferCopy (cachedContents, header);
18151819 return Impl.importHeader (adapter, header, diagLoc, /* trackParsedSymbols=*/ false ,
18161820 std::move (sourceBuffer), true );
18171821}
0 commit comments