diff options
Diffstat (limited to 'source/Plugins/Architecture/Arm')
-rw-r--r-- | source/Plugins/Architecture/Arm/ArchitectureArm.cpp | 30 | ||||
-rw-r--r-- | source/Plugins/Architecture/Arm/ArchitectureArm.h | 6 |
2 files changed, 36 insertions, 0 deletions
diff --git a/source/Plugins/Architecture/Arm/ArchitectureArm.cpp b/source/Plugins/Architecture/Arm/ArchitectureArm.cpp index 1b7ecc88c35e..6993222ba5d4 100644 --- a/source/Plugins/Architecture/Arm/ArchitectureArm.cpp +++ b/source/Plugins/Architecture/Arm/ArchitectureArm.cpp @@ -126,3 +126,33 @@ void ArchitectureArm::OverrideStopInfo(Thread &thread) const { } } } + +addr_t ArchitectureArm::GetCallableLoadAddress(addr_t code_addr, + AddressClass addr_class) const { + bool is_alternate_isa = false; + + switch (addr_class) { + case AddressClass::eData: + case AddressClass::eDebug: + return LLDB_INVALID_ADDRESS; + case AddressClass::eCodeAlternateISA: + is_alternate_isa = true; + break; + default: break; + } + + if ((code_addr & 2u) || is_alternate_isa) + return code_addr | 1u; + return code_addr; +} + +addr_t ArchitectureArm::GetOpcodeLoadAddress(addr_t opcode_addr, + AddressClass addr_class) const { + switch (addr_class) { + case AddressClass::eData: + case AddressClass::eDebug: + return LLDB_INVALID_ADDRESS; + default: break; + } + return opcode_addr & ~(1ull); +} diff --git a/source/Plugins/Architecture/Arm/ArchitectureArm.h b/source/Plugins/Architecture/Arm/ArchitectureArm.h index 484c4a52fcc6..1a052c76b2c9 100644 --- a/source/Plugins/Architecture/Arm/ArchitectureArm.h +++ b/source/Plugins/Architecture/Arm/ArchitectureArm.h @@ -25,6 +25,12 @@ public: void OverrideStopInfo(Thread &thread) const override; + lldb::addr_t GetCallableLoadAddress(lldb::addr_t load_addr, + AddressClass addr_class) const override; + + lldb::addr_t GetOpcodeLoadAddress(lldb::addr_t load_addr, + AddressClass addr_class) const override; + private: static std::unique_ptr<Architecture> Create(const ArchSpec &arch); ArchitectureArm() = default; |