@@ -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;
@@ -1301,11 +1299,9 @@ std::unique_ptr<clang::CompilerInvocation> ClangImporter::createClangInvocation(
1301
1299
return CI;
1302
1300
}
1303
1301
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) {
1309
1305
std::unique_ptr<ClangImporter> importer{
1310
1306
new ClangImporter (ctx, tracker, dwarfImporterDelegate)};
1311
1307
auto &importerOpts = ctx.ClangImporterOpts ;
@@ -1791,15 +1787,24 @@ bool ClangImporter::importHeader(StringRef header, ModuleDecl *adapter,
1791
1787
off_t expectedSize, time_t expectedModTime,
1792
1788
StringRef cachedContents, SourceLoc diagLoc) {
1793
1789
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
+ }
1803
1808
}
1804
1809
1805
1810
// 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,
1809
1814
1810
1815
if (!cachedContents.empty () && cachedContents.back () == ' \0 ' )
1811
1816
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);
1815
1819
return Impl.importHeader (adapter, header, diagLoc, /* trackParsedSymbols=*/ false ,
1816
1820
std::move (sourceBuffer), true );
1817
1821
}
0 commit comments