Skip to content

Commit 20be84c

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

File tree

11 files changed

+70
-0
lines changed

11 files changed

+70
-0
lines changed

lldb/include/lldb/Core/ModuleList.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class ModuleListProperties : public Properties {
8686
bool GetSwiftLoadConformances() const;
8787
SwiftModuleLoadingMode GetSwiftModuleLoadingMode() const;
8888
bool SetSwiftModuleLoadingMode(SwiftModuleLoadingMode);
89+
bool GetSwiftPreferSerializedBridgingHeader() const;
8990

9091
bool GetEnableSwiftMetadataCache() const;
9192
uint64_t GetSwiftMetadataCacheMaxByteSize();

lldb/source/Core/CoreProperties.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ let Definition = "modulelist" in {
4040
DefaultEnumValue<"eSwiftModuleLoadingModePreferSerialized">,
4141
EnumValues<"OptionEnumValues(g_swift_module_loading_mode_enums)">,
4242
Desc<"The module loading mode to use when loading modules for Swift.">;
43+
def SwiftPreferSerializedBridgingHeader: Property<"swift-prefer-serialized-bridging-header", "Boolean">,
44+
DefaultTrue,
45+
Desc<"Prefer serialized preprocessed bridging headers in Swift modules over on-disk headers.">;
4346
def EnableSwiftMetadataCache: Property<"enable-swift-metadata-cache", "Boolean">,
4447
Global,
4548
DefaultTrue,

lldb/source/Core/ModuleList.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ bool ModuleListProperties::SetSwiftModuleLoadingMode(SwiftModuleLoadingMode mode
224224
return SetPropertyAtIndex(idx, mode);
225225
}
226226

227+
bool ModuleListProperties::GetSwiftPreferSerializedBridgingHeader() const {
228+
const uint32_t idx = ePropertySwiftPreferSerializedBridgingHeader;
229+
return GetPropertyAtIndexAs<bool>(
230+
idx, g_modulelist_properties[idx].default_uint_value != 0);
231+
}
232+
227233
FileSpec ModuleListProperties::GetSwiftMetadataCachePath() const {
228234
return m_collection_sp
229235
->GetPropertyAtIndexAsOptionValueFileSpec(ePropertySwiftMetadataCachePath)

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3472,6 +3472,8 @@ swift::ClangImporterOptions &SwiftASTContext::GetClangImporterOptions() {
34723472
if (FileSystem::Instance().Exists(clang_dir_spec))
34733473
clang_importer_options.OverrideResourceDir = clang_dir_spec.GetPath();
34743474
clang_importer_options.DebuggerSupport = true;
3475+
clang_importer_options.PreferSerializedBridgingHeader =
3476+
props.GetSwiftPreferSerializedBridgingHeader();
34753477

34763478
clang_importer_options.DisableSourceImport =
34773479
!props.GetUseSwiftClangImporter();

lldb/test/API/lang/swift/clangimporter/extra_clang_flags/TestSwiftExtraClangFlags.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def test_extra_clang_flags(self):
2929
# Because the bridging header isn't precompiled or in a module
3030
# we don't have DWARF type information for the types it contains.
3131
self.expect("settings set symbols.swift-typesystem-compiler-fallback true")
32+
self.expect("settings set symbols.swift-prefer-serialized-bridging-header false")
3233

3334
# FIXME: this doesn't work if LLDB's build dir contains a space.
3435
overlay = self.getBuildArtifact('overlay.yaml')
@@ -71,6 +72,7 @@ def test_invalid_extra_clang_flags(self):
7172
self.addTearDownHook(
7273
lambda: self.runCmd("settings clear target.swift-extra-clang-flags"))
7374

75+
self.expect("settings set symbols.swift-prefer-serialized-bridging-header false")
7476
self.expect('settings set target.swift-extra-clang-flags -- -v')
7577

7678
lldbutil.run_to_source_breakpoint(self, "break here",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
struct M { int j; };
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
SWIFT_SOURCES := main.swift
2+
SWIFT_ENABLE_EXPLICIT_MODULES := Yes
3+
SWIFT_BRIDGING_HEADER := bridging.h
4+
SWIFTFLAGS_EXTRAS = -Xcc -I$(BUILDDIR)/secret
5+
6+
all: secret.h $(EXE)
7+
8+
include Makefile.rules
9+
10+
.PHONY: secret.h
11+
12+
secret.h:
13+
mkdir -p $(BUILDDIR)/secret
14+
echo "struct S { int i; };" > $(BUILDDIR)/secret/secret.h
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import lldb
2+
from lldbsuite.test.decorators import *
3+
import lldbsuite.test.lldbtest as lldbtest
4+
import lldbsuite.test.lldbutil as lldbutil
5+
6+
7+
class TestSwiftExplicitModules(lldbtest.TestBase):
8+
NO_DEBUG_INFO_TESTCASE = True
9+
@swiftTest
10+
def test(self):
11+
"""Test explicit Swift modules with bridging headers"""
12+
self.build()
13+
secret = self.getBuildArtifact("secret")
14+
import shutil
15+
shutil.rmtree(secret)
16+
17+
target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(
18+
self, 'Set breakpoint here', lldb.SBFileSpec('main.swift'))
19+
log = self.getBuildArtifact("types.log")
20+
self.expect('log enable lldb types -f "%s"' % log)
21+
22+
self.expect("frame variable s", substrs=['i = 23'])
23+
self.expect("frame variable m", substrs=['j = 42'])
24+
self.expect("expression s", substrs=['i = 23'])
25+
self.expect("expression m", substrs=['j = 42'])
26+
self.filecheck('platform shell cat "%s"' % log, __file__)
27+
# CHECK: LogConfiguration
28+
# CHECK-NOT: secret
29+
# CHECK: Import
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// A non-modular header.
2+
#include "secret.h"
3+
// A modular header.
4+
#include "M.h"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
func main() {
2+
let s = S(i: 23)
3+
let m = M(j: 42)
4+
print(s) // Set breakpoint here
5+
}
6+
7+
main()

0 commit comments

Comments
 (0)