diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp b/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp index d06a68bab1142..040c4e4784857 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp +++ b/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp @@ -84,7 +84,7 @@ swift::remote::RemoteAddress LLDBMemoryReader::getSymbolAddress(const std::string &name) { lldbassert(!name.empty()); if (name.empty()) - return swift::remote::RemoteAddress(nullptr); + return swift::remote::RemoteAddress(); Log *log = GetLog(LLDBLog::Types); @@ -97,7 +97,7 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) { name_cs, lldb::eSymbolTypeAny, sc_list); if (!sc_list.GetSize()) { LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name); - return swift::remote::RemoteAddress(nullptr); + return swift::remote::RemoteAddress(); } SymbolContext sym_ctx; @@ -118,14 +118,15 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) { if (sym_ctx.symbol) { auto load_addr = sym_ctx.symbol->GetLoadAddress(&m_process.GetTarget()); LLDB_LOGV(log, "[MemoryReader] symbol resolved to {0:x}", load_addr); - return swift::remote::RemoteAddress(load_addr); + return swift::remote::RemoteAddress( + load_addr, swift::remote::RemoteAddress::DefaultAddressSpace); } } // Empty list, resolution failed. if (sc_list.GetSize() == 0) { LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name); - return swift::remote::RemoteAddress(nullptr); + return swift::remote::RemoteAddress(); } // If there's a single symbol, then we're golden. If there's more than @@ -140,11 +141,12 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) { load_addr, m_process.GetAddressByteSize(), 0, error, true); if (sym_value != other_sym_value) { LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name); - return swift::remote::RemoteAddress(nullptr); + return swift::remote::RemoteAddress(); } } LLDB_LOGV(log, "[MemoryReader] symbol resolved to {0}", load_addr); - return swift::remote::RemoteAddress(load_addr); + return swift::remote::RemoteAddress( + load_addr, swift::remote::RemoteAddress::DefaultAddressSpace); } static std::unique_ptr @@ -229,7 +231,8 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address, // to a tagged address so further memory reads originating from it benefit // from the file-cache optimization. swift::remote::RemoteAbsolutePointer process_pointer{ - swift::remote::RemoteAddress{readValue}}; + swift::remote::RemoteAddress{ + readValue, swift::remote::RemoteAddress::DefaultAddressSpace}}; if (!readMetadataFromFileCacheEnabled()) return process_pointer; @@ -295,7 +298,8 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address, } swift::remote::RemoteAbsolutePointer tagged_pointer{ - swift::remote::RemoteAddress{tagged_address}}; + swift::remote::RemoteAddress{ + tagged_address, swift::remote::RemoteAddress::DefaultAddressSpace}}; if (tagged_address != (uint64_t)signedPointerStripper(tagged_pointer) .getResolvedAddress() @@ -455,6 +459,41 @@ bool LLDBMemoryReader::readString(swift::remote::RemoteAddress address, return false; } +uint64_t LLDBMemoryReader::getPtrauthMask() { + auto initializePtrauthMask = [&]() -> uint64_t { + uint8_t pointerSize = 0; + if (!queryDataLayout(DataLayoutQueryType::DLQ_GetPointerSize, nullptr, + &pointerSize)) + return ~0ull; + + if (pointerSize == 4) { + uint32_t ptrauthMask32 = 0; + if (queryDataLayout(DataLayoutQueryType::DLQ_GetPtrAuthMask, nullptr, + &ptrauthMask32)) + return (uint64_t)ptrauthMask32; + } else if (pointerSize == 8) { + uint64_t ptrauthMask64 = 0; + if (queryDataLayout(DataLayoutQueryType::DLQ_GetPtrAuthMask, nullptr, + &ptrauthMask64)) + return ptrauthMask64; + } + return ~0ull; + }; + if (!m_ptrauth_mask) + m_ptrauth_mask = initializePtrauthMask(); + return m_ptrauth_mask; +} + +swift::reflection::RemoteAddress +LLDBMemoryReader::stripSignedPointer(swift::reflection::RemoteAddress P) { + // Only virtual addresses are signed. + if (P.getAddressSpace() != 0) + return P; + + auto ptrauth_mask = getPtrauthMask(); + return P & ptrauth_mask; +} + MemoryReaderLocalBufferHolder::~MemoryReaderLocalBufferHolder() { if (m_memory_reader) m_memory_reader->popLocalBuffer(); @@ -540,7 +579,7 @@ LLDBMemoryReader::addModuleToAddressMap(ModuleSP module, if (module_end_address != signedPointerStripper( swift::remote::RemoteAbsolutePointer{ - swift::remote::RemoteAddress{module_end_address}}) + swift::remote::RemoteAddress{module_end_address, 0}}) .getResolvedAddress() .getAddressData()) { LLDB_LOG(GetLog(LLDBLog::Types), @@ -620,7 +659,7 @@ LLDBMemoryReader::resolveRemoteAddress( return {}; lldb::addr_t addr = lldb_address->GetLoadAddress(&m_process.GetTarget()); if (addr != LLDB_INVALID_ADDRESS) - return swift::reflection::RemoteAddress(addr); + return swift::reflection::RemoteAddress(addr, 0); return {}; } diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h b/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h index ae23fcb74ec8b..127c9d873a0dd 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h +++ b/lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h @@ -51,8 +51,6 @@ class MemoryReaderLocalBufferHolder { class LLDBMemoryReader : public swift::remote::MemoryReader { public: - - LLDBMemoryReader(Process &p, std::function @@ -86,6 +84,9 @@ class LLDBMemoryReader : public swift::remote::MemoryReader { bool readString(swift::remote::RemoteAddress address, std::string &dest) override; + swift::reflection::RemoteAddress + stripSignedPointer(swift::reflection::RemoteAddress P) override; + MemoryReaderLocalBufferHolder pushLocalBuffer(uint64_t local_buffer, uint64_t local_buffer_size); /// Adds the module to the list of modules we're tracking using tagged @@ -122,7 +123,8 @@ class LLDBMemoryReader : public swift::remote::MemoryReader { std::optional
resolveRemoteAddressFromSymbolObjectFile(uint64_t address) const; -private: + uint64_t getPtrauthMask(); + Process &m_process; size_t m_max_read_amount; @@ -147,6 +149,8 @@ class LLDBMemoryReader : public swift::remote::MemoryReader { /// object file instead of the main object file. llvm::SmallSet m_modules_with_metadata_in_symbol_obj_file; + uint64_t m_ptrauth_mask; + /// The bit used to tag LLDB's virtual addresses as such. See \c /// m_range_module_map. const static uint64_t LLDB_FILE_ADDRESS_BIT = 0x2000000000000000; diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/ReflectionContext.cpp b/lldb/source/Plugins/LanguageRuntime/Swift/ReflectionContext.cpp index ee0e5505c6d7d..01d0e0a834bd5 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/ReflectionContext.cpp +++ b/lldb/source/Plugins/LanguageRuntime/Swift/ReflectionContext.cpp @@ -223,7 +223,10 @@ class TargetReflectionContext : public ReflectionContextInterface { lldb::addr_t instance, swift::remote::TypeInfoProvider *provider, swift::reflection::DescriptorFinder *descriptor_finder) override { auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder); - auto *ti = m_reflection_ctx.getInstanceTypeInfo(instance, provider); + auto *ti = m_reflection_ctx.getInstanceTypeInfo( + swift::remote::RemoteAddress( + instance, swift::remote::RemoteAddress::DefaultAddressSpace), + provider); if (!ti) return llvm::createStringError("could not get instance type info"); return *ti; @@ -273,7 +276,9 @@ class TargetReflectionContext : public ReflectionContextInterface { auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder); // Guard against faulty self-referential metadata. unsigned limit = 256; - auto md_ptr = m_reflection_ctx.readMetadataFromInstance(pointer); + auto md_ptr = + m_reflection_ctx.readMetadataFromInstance(swift::remote::RemoteAddress( + pointer, swift::remote::RemoteAddress::DefaultAddressSpace)); if (!md_ptr) return false; @@ -345,7 +350,10 @@ class TargetReflectionContext : public ReflectionContextInterface { bool skip_artificial_subclasses) override { auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder); if (auto *tr = m_reflection_ctx.readTypeFromMetadata( - metadata_address, skip_artificial_subclasses)) + swift::remote::RemoteAddress( + metadata_address, + swift::remote::RemoteAddress::DefaultAddressSpace), + skip_artificial_subclasses)) return *tr; return llvm::createStringError("could not read type from metadata"); } @@ -356,7 +364,9 @@ class TargetReflectionContext : public ReflectionContextInterface { bool skip_artificial_subclasses) override { auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder); auto metadata_address = - m_reflection_ctx.readMetadataFromInstance(instance_address); + m_reflection_ctx.readMetadataFromInstance(swift::remote::RemoteAddress( + instance_address, + swift::remote::RemoteAddress::DefaultAddressSpace)); if (!metadata_address) return llvm::createStringError( llvm::formatv("could not read heap metadata for object at {0:x}", @@ -370,7 +380,8 @@ class TargetReflectionContext : public ReflectionContextInterface { std::optional ReadPointer(lldb::addr_t instance_address) override { - auto ptr = m_reflection_ctx.readPointer(instance_address); + auto ptr = m_reflection_ctx.readPointer(swift::remote::RemoteAddress( + instance_address, swift::remote::RemoteAddress::DefaultAddressSpace)); return ptr; } @@ -399,7 +410,9 @@ class TargetReflectionContext : public ReflectionContextInterface { asyncTaskInfo(lldb::addr_t AsyncTaskPtr, unsigned ChildTaskLimit, unsigned AsyncBacktraceLimit) override { auto [error, task_info] = m_reflection_ctx.asyncTaskInfo( - AsyncTaskPtr, ChildTaskLimit, AsyncBacktraceLimit); + swift::remote::RemoteAddress( + AsyncTaskPtr, swift::remote::RemoteAddress::DefaultAddressSpace), + ChildTaskLimit, AsyncBacktraceLimit); if (error) return llvm::createStringError(*error); diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.cpp index dd6c4a3a586b2..0d897401e4527 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.cpp @@ -584,8 +584,11 @@ bool SwiftLanguageRuntime::AddJitObjectFileToReflectionContext( auto *Buf = malloc(size); std::memcpy(Buf, data.begin(), size); - swift::remote::RemoteRef remote_ref(section->GetFileAddress(), - Buf); + swift::remote::RemoteRef remote_ref( + swift::remote::RemoteAddress( + section->GetFileAddress(), + swift::remote::RemoteAddress::DefaultAddressSpace), + Buf); return {remote_ref, size}; } @@ -723,7 +726,10 @@ std::optional SwiftLanguageRuntime::AddObjectFileToReflectionContext( section_list->GetSectionAtIndex(0)->GetFileAddress(); assert(address <= end_address && "Address outside of range!"); - swift::remote::RemoteRef remote_ref(address, Buf); + swift::remote::RemoteRef remote_ref( + swift::remote::RemoteAddress( + address, swift::remote::RemoteAddress::DefaultAddressSpace), + Buf); return {remote_ref, size}; } } @@ -794,18 +800,23 @@ bool SwiftLanguageRuntime::AddModuleToReflectionContext( const uint8_t *file_data = extractor.GetDataStart(); llvm::sys::MemoryBlock file_buffer((void *)file_data, size); info_id = m_reflection_ctx->ReadELF( - swift::remote::RemoteAddress(load_ptr), + swift::remote::RemoteAddress( + load_ptr, swift::remote::RemoteAddress::DefaultAddressSpace), std::optional(file_buffer), likely_module_names); } else if (read_from_file_cache && obj_file->GetPluginName() == "mach-o") { info_id = AddObjectFileToReflectionContext(module_sp, likely_module_names); if (!info_id) - info_id = m_reflection_ctx->AddImage(swift::remote::RemoteAddress(load_ptr), - likely_module_names); + info_id = m_reflection_ctx->AddImage( + swift::remote::RemoteAddress( + load_ptr, swift::remote::RemoteAddress::DefaultAddressSpace), + likely_module_names); } else { - info_id = m_reflection_ctx->AddImage(swift::remote::RemoteAddress(load_ptr), - likely_module_names); + info_id = m_reflection_ctx->AddImage( + swift::remote::RemoteAddress( + load_ptr, swift::remote::RemoteAddress::DefaultAddressSpace), + likely_module_names); } if (!info_id) { diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp b/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp index 155d4f74f3415..99f047e560753 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp +++ b/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp @@ -1438,7 +1438,7 @@ llvm::Expected SwiftLanguageRuntime::GetEnumCaseName( auto *eti = llvm::cast(ti); auto buffer_holder = PushLocalBuffer((int64_t)data.GetDataStart(), data.GetByteSize()); - RemoteAddress addr(data.GetDataStart()); + RemoteAddress addr = RemoteAddress((uint64_t)data.GetDataStart(), 0); int case_index; if (eti->projectEnumValue(*GetMemoryReader(), addr, &case_index)) return eti->getCases()[case_index].Name; @@ -1551,7 +1551,7 @@ SwiftLanguageRuntime::ProjectEnum(ValueObject &valobj) { } } - swift::reflection::RemoteAddress remote_addr(addr); + auto remote_addr = swift::reflection::RemoteAddress(addr, 0); int case_index; auto *eti = llvm::cast(ti); if (!eti->projectEnumValue(*GetMemoryReader(), remote_addr, &case_index)) @@ -2292,7 +2292,8 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Existential( existential_address, llvm::expectedToOptional(in_value.GetByteSize()).value_or(0)); - swift::remote::RemoteAddress remote_existential(existential_address); + auto remote_existential = swift::remote::RemoteAddress( + existential_address, swift::remote::RemoteAddress::DefaultAddressSpace); ThreadSafeReflectionContext reflection_ctx = GetReflectionContext(); if (!reflection_ctx) @@ -2317,7 +2318,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Existential( } const swift::reflection::TypeRef *typeref; - swift::remote::RemoteAddress out_address(nullptr); + swift::remote::RemoteAddress out_address; std::tie(typeref, out_address) = *pair; auto ts = tss->GetTypeSystemSwiftTypeRef(); @@ -2829,7 +2830,9 @@ Value::ValueType SwiftLanguageRuntime::GetValueType( // Read the value witness table and check if the data is inlined in // the existential container or not. - swift::remote::RemoteAddress remote_existential(existential_address); + auto remote_existential = swift::remote::RemoteAddress( + existential_address, + swift::remote::RemoteAddress::DefaultAddressSpace); if (ThreadSafeReflectionContext reflection_ctx = GetReflectionContext()) { std::optional is_inlined = reflection_ctx->IsValueInlinedInExistentialContainer( diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeRemoteAST.cpp b/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeRemoteAST.cpp index 2f3bd5151e73e..c1df5aa2bd13e 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeRemoteAST.cpp +++ b/lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeRemoteAST.cpp @@ -106,7 +106,7 @@ std::optional SwiftLanguageRuntime::GetMemberVariableOffsetRemoteAST( // Dig out metadata describing the type, if it's easy to find. // FIXME: the Remote AST library should make this easier. - swift::remote::RemoteAddress optmeta(nullptr); + swift::remote::RemoteAddress optmeta; const swift::TypeKind type_kind = swift_type->getKind(); switch (type_kind) { case swift::TypeKind::Class: @@ -119,7 +119,8 @@ std::optional SwiftLanguageRuntime::GetMemberVariableOffsetRemoteAST( lldb::addr_t pointer = instance->GetPointerValue(); if (!pointer || pointer == LLDB_INVALID_ADDRESS) break; - swift::remote::RemoteAddress address(pointer); + auto address = swift::remote::RemoteAddress( + pointer, swift::remote::RemoteAddress::DefaultAddressSpace); if (auto metadata = remote_ast->getHeapMetadataForObject(address)) optmeta = metadata.getValue(); } @@ -201,8 +202,9 @@ ConstString SwiftLanguageRuntime::GetDynamicTypeName_ClassRemoteAST( return {}; auto &remote_ast = GetRemoteASTContext(*swift_ast_ctx); - auto remote_ast_metadata_address = remote_ast.getHeapMetadataForObject( - swift::remote::RemoteAddress(instance_ptr)); + auto remote_ast_metadata_address = + remote_ast.getHeapMetadataForObject(swift::remote::RemoteAddress( + instance_ptr, swift::remote::RemoteAddress::DefaultAddressSpace)); if (remote_ast_metadata_address) { auto instance_type = remote_ast.getTypeForRemoteTypeMetadata( remote_ast_metadata_address.getValue(), @@ -239,7 +241,8 @@ SwiftLanguageRuntime::GetDynamicTypeAndAddress_ExistentialRemoteAST( if (!swift_ast_ctx) return {}; - swift::remote::RemoteAddress remote_existential(existential_address); + auto remote_existential = swift::remote::RemoteAddress( + existential_address, swift::remote::RemoteAddress::DefaultAddressSpace); auto &remote_ast = GetRemoteASTContext(*swift_ast_ctx); auto swift_type = llvm::expectedToStdOptional(swift_ast_ctx->GetSwiftType(existential_type)) @@ -377,7 +380,9 @@ SwiftLanguageRuntime::BindGenericTypeParametersRemoteAST( ->getAs(); auto underlying_type_result = remote_ast.getUnderlyingTypeForOpaqueType( - swift::remote::RemoteAddress(addr), + swift::remote::RemoteAddress( + addr, + swift::remote::RemoteAddress::DefaultAddressSpace), opaque_type->getSubstitutions(), genericParam->getIndex()); @@ -474,8 +479,9 @@ CompilerType SwiftLanguageRuntime::MetadataPromise::FulfillTypePromise( } auto &remote_ast = m_swift_runtime.GetRemoteASTContext(*swift_ast_ctx); swift::remoteAST::Result result = - remote_ast.getTypeForRemoteTypeMetadata( - swift::remote::RemoteAddress(m_metadata_location)); + remote_ast.getTypeForRemoteTypeMetadata(swift::remote::RemoteAddress( + m_metadata_location, + swift::remote::RemoteAddress::DefaultAddressSpace)); if (result) { m_compiler_type = {swift_ast_ctx->weak_from_this(), diff --git a/lldb/source/Plugins/LanguageRuntime/Swift/SwiftMetadataCache.cpp b/lldb/source/Plugins/LanguageRuntime/Swift/SwiftMetadataCache.cpp index 292dada5832b0..cca8163cd7b55 100644 --- a/lldb/source/Plugins/LanguageRuntime/Swift/SwiftMetadataCache.cpp +++ b/lldb/source/Plugins/LanguageRuntime/Swift/SwiftMetadataCache.cpp @@ -172,8 +172,9 @@ SwiftMetadataCache::generateHashTableBlob( auto &mangled_name = std::get<1>(pair); if (mangled_name.empty()) continue; - auto offset = field_descriptor.getAddressData() - - field_descriptors.startAddress().getAddressData(); + auto offset = + field_descriptor.getAddressData().getAddressData() - + field_descriptors.startAddress().getAddressData().getAddressData(); table_generator.insert(mangled_name, offset, m_info); } diff --git a/lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp b/lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp index 988371236c2f0..89140165ab356 100644 --- a/lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp +++ b/lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp @@ -1053,7 +1053,6 @@ void SwiftASTContext::SetCompilerInvocationLLDBOverrides() { // When loading Swift types that conform to ObjC protocols that have // been renamed with NS_SWIFT_NAME the DwarfImporterDelegate will crash // during protocol conformance checks as the underlying type cannot be - // found. Allowing module compilation to proceed with compiler // errors will prevent crashing, instead we will have empty type info // for the protocol conforming types. lang_opts.AllowModuleWithCompilerErrors = true; @@ -1080,19 +1079,15 @@ void SwiftASTContext::SetCompilerInvocationLLDBOverrides() { } SwiftASTContext::~SwiftASTContext() { -#ifndef NDEBUG - m_ast_context_mutex.lock(); if (swift::ASTContext *ctx = m_ast_context_ap.get()) // A RemoteASTContext associated with this swift::ASTContext has // to be destroyed before the swift::ASTContext is destroyed. assert(!GetASTMap().Lookup(ctx) && "ast context still in global map"); - m_ast_context_mutex.unlock(); -#endif } SwiftASTContextForModule::~SwiftASTContextForModule() { - if (auto ctx = GetASTContext()) - GetASTMap().Erase(*ctx); + if (swift::ASTContext *ctx = m_ast_context_ap.get()) + GetASTMap().Erase(ctx); } /// This code comes from CompilerInvocation.cpp (setRuntimeResourcePath).