Skip to content

Commit aa3b062

Browse files
Merge pull request #83526 from adrian-prantl/157063577-6.2
[ClangImporter] Prefer serialized bridging headers in LLDB.
2 parents 99a2db3 + 95ad22e commit aa3b062

File tree

3 files changed

+32
-25
lines changed

3 files changed

+32
-25
lines changed

include/swift/Basic/LangOptions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,10 @@ namespace swift {
10931093
/// When set, don't enforce warnings with -Werror.
10941094
bool DebuggerSupport = false;
10951095

1096+
/// Prefer the serialized preprocessed header over the one on disk.
1097+
/// Used by LLDB.
1098+
bool PreferSerializedBridgingHeader = false;
1099+
10961100
/// When set, ClangImporter is disabled, and all requests go to the
10971101
/// DWARFImporter delegate.
10981102
bool DisableSourceImport = false;

include/swift/ClangImporter/ClangImporter.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,7 @@ class ClangImporter final : public ClangModuleLoader {
163163

164164
bool requiresBuiltinHeadersInSystemModules = false;
165165

166-
ClangImporter(ASTContext &ctx,
167-
DependencyTracker *tracker,
166+
ClangImporter(ASTContext &ctx, DependencyTracker *tracker,
168167
DWARFImporterDelegate *dwarfImporterDelegate);
169168

170169
/// Creates a clone of Clang importer's compiler instance that has been
@@ -196,8 +195,8 @@ class ClangImporter final : public ClangModuleLoader {
196195
/// \returns a new Clang module importer, or null (with a diagnostic) if
197196
/// an error occurred.
198197
static std::unique_ptr<ClangImporter>
199-
create(ASTContext &ctx,
200-
std::string swiftPCHHash = "", DependencyTracker *tracker = nullptr,
198+
create(ASTContext &ctx, std::string swiftPCHHash = "",
199+
DependencyTracker *tracker = nullptr,
201200
DWARFImporterDelegate *dwarfImporterDelegate = nullptr,
202201
bool ignoreFileMapping = false);
203202

lib/ClangImporter/ClangImporter.cpp

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

454452
ClangImporter::~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

Comments
 (0)