DavidSpickett created this revision. Herald added a subscriber: kristof.beyls. Herald added a project: All. DavidSpickett requested review of this revision. Herald added a project: LLDB. Herald added a subscriber: lldb-commits.
FixAnyAddress is to be used when we don't know or don't care whether we're fixing a code or data address. By using FixAnyAddress over the others, you document that no specific choice was made. On all existing platforms apart from Arm Thumb, you could use either FixCodeAddress or FixDataAddress and be fine. Up until now I've chosen to use FixDataAddress but if I had chosen to use FixCodeAddress that would have broken Arm Thumb. Hence FixAnyAddress, to give you the "safest" option when you're in generic code. Uses of FixDataAddress in memory region code have been changed to FixAnyAddress. The functionality is unchanged. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D124000 Files: lldb/include/lldb/Target/ABI.h lldb/source/Commands/CommandObjectMemory.cpp lldb/source/Target/Process.cpp Index: lldb/source/Target/Process.cpp =================================================================== --- lldb/source/Target/Process.cpp +++ 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; } Index: lldb/source/Commands/CommandObjectMemory.cpp =================================================================== --- lldb/source/Commands/CommandObjectMemory.cpp +++ 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; Index: lldb/include/lldb/Target/ABI.h =================================================================== --- lldb/include/lldb/Target/ABI.h +++ 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
Index: lldb/source/Target/Process.cpp =================================================================== --- lldb/source/Target/Process.cpp +++ 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; } Index: lldb/source/Commands/CommandObjectMemory.cpp =================================================================== --- lldb/source/Commands/CommandObjectMemory.cpp +++ 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; Index: lldb/include/lldb/Target/ABI.h =================================================================== --- lldb/include/lldb/Target/ABI.h +++ 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
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits