diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp b/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp index 2d5b7aab67f54..403cb091232c2 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp +++ b/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp @@ -605,6 +605,19 @@ LLDBMemoryReader::getFileAddressAndModuleForTaggedAddress( return {{file_address, module}}; } +std::optional +LLDBMemoryReader::resolveRemoteAddress( + swift::reflection::RemoteAddress address) const { + std::optional
lldb_address = + LLDBMemoryReader::resolveRemoteAddress(address.getAddressData()); + if (!lldb_address) + return {}; + lldb::addr_t addr = lldb_address->GetLoadAddress(&m_process.GetTarget()); + if (addr != LLDB_INVALID_ADDRESS) + return swift::reflection::RemoteAddress(addr); + return {}; +} + std::optional
LLDBMemoryReader::resolveRemoteAddress(uint64_t address) const { Log *log(GetLog(LLDBLog::Types)); diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h b/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h index 3d3a50153c912..ae23fcb74ec8b 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h +++ b/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h @@ -77,6 +77,9 @@ class LLDBMemoryReader : public swift::remote::MemoryReader { resolvePointer(swift::remote::RemoteAddress address, uint64_t readValue) override; + std::optional + resolveRemoteAddress(swift::remote::RemoteAddress address) const override; + bool readBytes(swift::remote::RemoteAddress address, uint8_t *dest, uint64_t size) override; diff --git a/lldb/test/API/lang/swift/observation/Makefile b/lldb/test/API/lang/swift/observation/Makefile new file mode 100644 index 0000000000000..cb73d9276d0ed --- /dev/null +++ b/lldb/test/API/lang/swift/observation/Makefile @@ -0,0 +1,2 @@ +SWIFT_SOURCES := main.swift +include Makefile.rules diff --git a/lldb/test/API/lang/swift/observation/TestSwiftObservation.py b/lldb/test/API/lang/swift/observation/TestSwiftObservation.py new file mode 100644 index 0000000000000..42814478d0917 --- /dev/null +++ b/lldb/test/API/lang/swift/observation/TestSwiftObservation.py @@ -0,0 +1,21 @@ +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +import lldbsuite.test.lldbutil as lldbutil + +class TestSwiftObservation(TestBase): + NO_DEBUG_INFO_TESTCASE = True + @swiftTest + def test(self): + """Test that types with private discriminators read from the file cache work""" + self.build() + lldbutil.run_to_source_breakpoint(self, 'break here', + lldb.SBFileSpec('main.swift')) + # FIXME: Private discriminators are UUIDs in DWARF and pointers + # in Reflection metafdata, making tham not comparable. + # rdar://74374120 + self.expect("settings set symbols.swift-validate-typesystem false") + self.expect("settings set target.experimental.swift-read-metadata-from-file-cache true") + r = self.frame().FindVariable("r") + extent = r.GetChildAtIndex(0) + self.assertEqual(extent.GetName(), "extent") diff --git a/lldb/test/API/lang/swift/observation/main.swift b/lldb/test/API/lang/swift/observation/main.swift new file mode 100644 index 0000000000000..f7b1f4e99645d --- /dev/null +++ b/lldb/test/API/lang/swift/observation/main.swift @@ -0,0 +1,8 @@ +import Observation + +func f() { + let r = ObservationRegistrar() + print("break here") +} + +f()