Skip to content

Commit a667847

Browse files
committed
[ClangImporter] Prefer serialized bridging headers in LLDB.
Especially in an explicit modules project, LLDB might not know all the search paths needed to imported the on disk header. rdar://157063577
1 parent 0597fd9 commit a667847

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
@@ -1106,6 +1106,10 @@ namespace swift {
11061106
/// When set, don't enforce warnings with -Werror.
11071107
bool DebuggerSupport = false;
11081108

1109+
/// Prefer the serialized preprocessed header over the one on disk.
1110+
/// Used by LLDB.
1111+
bool PreferSerializedBridgingHeader = false;
1112+
11091113
/// When set, ClangImporter is disabled, and all requests go to the
11101114
/// DWARFImporter delegate.
11111115
bool DisableSourceImport = false;

include/swift/ClangImporter/ClangImporter.h

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

166166
bool requiresBuiltinHeadersInSystemModules = false;
167167

168-
ClangImporter(ASTContext &ctx,
169-
DependencyTracker *tracker,
168+
ClangImporter(ASTContext &ctx, DependencyTracker *tracker,
170169
DWARFImporterDelegate *dwarfImporterDelegate);
171170

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

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;
@@ -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

Comments
 (0)