diff --git a/lldb/include/lldb/Target/ABI.h b/lldb/include/lldb/Target/ABI.h --- a/lldb/include/lldb/Target/ABI.h +++ b/lldb/include/lldb/Target/ABI.h @@ -126,6 +126,20 @@ virtual lldb::addr_t FixDataAddress(lldb::addr_t pc) { return pc; } /// @} + /// Use this method when you do not know, or do not care what kind of address + /// you are fixing. On platforms where there would be a difference between the + /// two types, it will pick the safest option. + /// + /// Its purpose is to signal that no specific choice was made and provide an + /// alternative to randomly picking FixCode/FixData address. Which could break + /// platforms where there is a difference (only Arm Thumb at this time). + virtual lldb::addr_t FixAnyAddress(lldb::addr_t pc) { + // On Arm Thumb fixing a code address zeroes the bottom bit, so FixData is + // the safe choice. On any other platform (so far) code and data addresses + // are fixed in the same way. + return FixDataAddress(pc); + } + llvm::MCRegisterInfo &GetMCRegisterInfo() { return *m_mc_register_info_up; } virtual void diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp --- a/lldb/source/Commands/CommandObjectMemory.cpp +++ b/lldb/source/Commands/CommandObjectMemory.cpp @@ -1683,7 +1683,7 @@ // address size, etc.), the end of mappable memory will be lower // than that. So if we find any non-address bit set, we must be // at the end of the mappable range. - (abi && (abi->FixDataAddress(load_addr) != load_addr))) { + (abi && (abi->FixAnyAddress(load_addr) != load_addr))) { result.AppendErrorWithFormat("'%s' takes one argument:\nUsage: %s\n", m_cmd_name.c_str(), m_cmd_syntax.c_str()); return false; diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -5870,7 +5870,7 @@ Status Process::GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info) { if (const lldb::ABISP &abi = GetABI()) - load_addr = abi->FixDataAddress(load_addr); + load_addr = abi->FixAnyAddress(load_addr); return DoGetMemoryRegionInfo(load_addr, range_info); } @@ -5905,7 +5905,7 @@ range_end != LLDB_INVALID_ADDRESS && // If we have non-address bits and some are set then the end // is at or beyond the end of mappable memory. - !(abi && (abi->FixDataAddress(range_end) != range_end))); + !(abi && (abi->FixAnyAddress(range_end) != range_end))); return error; }