Index: lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp =================================================================== --- lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp +++ lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp @@ -9,6 +9,7 @@ #include "AppleObjCClassDescriptorV2.h" #include "lldb/Expression/FunctionCaller.h" +#include "lldb/Target/ABI.h" #include "lldb/Utility/Log.h" using namespace lldb; @@ -73,6 +74,10 @@ m_flags = (uint8_t)(data_NEVER_USE & (lldb::addr_t)3); m_data_ptr = data_NEVER_USE & GetClassDataMask(process); + if (ABISP abi_sp = process->GetABI()) { + m_isa = abi_sp->FixCodeAddress(m_isa); + m_superclass = abi_sp->FixCodeAddress(m_superclass); + } return true; } @@ -105,6 +110,8 @@ m_flags = extractor.GetU32_unchecked(&cursor); m_version = extractor.GetU32_unchecked(&cursor); m_ro_ptr = extractor.GetAddress_unchecked(&cursor); + if (ABISP abi_sp = process->GetABI()) + m_ro_ptr = abi_sp->FixCodeAddress(m_ro_ptr); m_method_list_ptr = extractor.GetAddress_unchecked(&cursor); m_properties_ptr = extractor.GetAddress_unchecked(&cursor); m_firstSubclass = extractor.GetAddress_unchecked(&cursor); @@ -120,6 +127,8 @@ process->GetByteOrder(), process->GetAddressByteSize()); m_ro_ptr = extractor.GetAddress_unchecked(&cursor); + if (ABISP abi_sp = process->GetABI()) + m_ro_ptr = abi_sp->FixCodeAddress(m_ro_ptr); } return true; @@ -231,6 +240,8 @@ DataBufferHeap buffer(size, '\0'); Status error; + if (ABISP abi_sp = process->GetABI()) + addr = abi_sp->FixCodeAddress(addr); process->ReadMemory(addr, buffer.GetBytes(), size, error); if (error.Fail()) { return false; Index: lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp =================================================================== --- lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp +++ lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp @@ -1445,13 +1445,21 @@ return objc_class_sp; objc_class_sp = GetClassDescriptorFromISA(isa); - if (isa && !objc_class_sp) { - Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_TYPES)); - LLDB_LOGF(log, - "0x%" PRIx64 ": AppleObjCRuntimeV2::GetClassDescriptor() ISA was " - "not in class descriptor cache 0x%" PRIx64, - isa_pointer, isa); + if (!objc_class_sp) { + if (ABISP abi_sp = process->GetABI()) { + isa = abi_sp->FixCodeAddress(isa); + objc_class_sp = GetClassDescriptorFromISA(isa); + } } + + if (objc_class_sp) + return objc_class_sp; + + Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_TYPES)); + LLDB_LOGF(log, + "0x%" PRIx64 ": AppleObjCRuntimeV2::GetClassDescriptor() ISA was " + "not in class descriptor cache 0x%" PRIx64, + isa_pointer, isa); return objc_class_sp; } @@ -2695,6 +2703,13 @@ return nullptr; actual_class_descriptor_sp = m_runtime.GetClassDescriptorFromISA((ObjCISA)slot_data); + if (!actual_class_descriptor_sp) { + if (ABISP abi_sp = process->GetABI()) { + ObjCISA fixed_isa = abi_sp->FixCodeAddress((ObjCISA)slot_data); + actual_class_descriptor_sp = + m_runtime.GetClassDescriptorFromISA(fixed_isa); + } + } if (!actual_class_descriptor_sp) return ObjCLanguageRuntime::ClassDescriptorSP(); m_cache[slot] = actual_class_descriptor_sp; Index: lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp =================================================================== --- lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp +++ lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp @@ -12,6 +12,7 @@ #include "lldb/Expression/DiagnosticManager.h" #include "lldb/Expression/FunctionCaller.h" #include "lldb/Expression/UtilityFunction.h" +#include "lldb/Target/ABI.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" #include "lldb/Target/Thread.h" @@ -134,6 +135,10 @@ target_addr_value); m_impl_function->DeallocateFunctionResults(exc_ctx, m_args_addr); lldb::addr_t target_addr = target_addr_value.GetScalar().ULongLong(); + + if (ABISP abi_sp = GetThread().GetProcess()->GetABI()) { + target_addr = abi_sp->FixCodeAddress(target_addr); + } Address target_so_addr; target_so_addr.SetOpcodeLoadAddress(target_addr, exc_ctx.GetTargetPtr()); Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_STEP));