summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
diff options
context:
space:
mode:
authorJohnny Chen <johnny.chen@apple.com>2011-05-12 22:25:53 +0000
committerJohnny Chen <johnny.chen@apple.com>2011-05-12 22:25:53 +0000
commit4b95aa4c6fce491e3ffc126cc840a367094f71b9 (patch)
tree40e55e36b7b6b86fbabecad6d8e713977a387f2a /lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
parent2ce1630c9261c93d67001c993950ff4aa35bb6b9 (diff)
downloadbcm5719-llvm-4b95aa4c6fce491e3ffc126cc840a367094f71b9.tar.gz
bcm5719-llvm-4b95aa4c6fce491e3ffc126cc840a367094f71b9.zip
Fix the InstructionLLVM::Dump() so that for Triple::arm, PC reads as the address
of the current instruction plus 8. And for Triple::thumb, it is plus 4. rdar://problem/9170971 lldb disassembly's symbol information not correct (off by 2?) llvm-svn: 131256
Diffstat (limited to 'lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp')
-rw-r--r--lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp35
1 files changed, 20 insertions, 15 deletions
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
index 9b28266b59d..e8284a72979 100644
--- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
+++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
@@ -77,10 +77,10 @@ static int IPRegisterReader(uint64_t *value, unsigned regID, void* arg)
InstructionLLVM::InstructionLLVM (const Address &addr,
AddressClass addr_class,
EDDisassemblerRef disassembler,
- bool force_raw) :
+ llvm::Triple::ArchType arch_type) :
Instruction (addr, addr_class),
m_disassembler (disassembler),
- m_force_raw (force_raw)
+ m_arch_type (arch_type)
{
}
@@ -154,8 +154,13 @@ InstructionLLVM::Dump
int numTokens = -1;
+ // FIXME!!!
+ /* Remove the following section of code related to force_raw .... */
+ bool force_raw = m_arch_type == llvm::Triple::arm ||
+ m_arch_type == llvm::Triple::thumb;
if (!raw)
- raw = m_force_raw;
+ raw = force_raw;
+ /* .... when we fix the edis for arm/thumb. */
if (!raw)
numTokens = EDNumTokens(m_inst);
@@ -173,7 +178,16 @@ InstructionLLVM::Dump
if (base_addr == LLDB_INVALID_ADDRESS)
base_addr = GetAddress().GetFileAddress ();
- RegisterReaderArg rra(base_addr + EDInstByteSize(m_inst), m_disassembler);
+ lldb::addr_t PC = base_addr + EDInstByteSize(m_inst);
+
+ // When executing an ARM instruction, PC reads as the address of the
+ // current instruction plus 8. And for Thumb, it is plus 4.
+ if (m_arch_type == llvm::Triple::arm)
+ PC = base_addr + 8;
+ else if (m_arch_type == llvm::Triple::thumb)
+ PC = base_addr + 4;
+
+ RegisterReaderArg rra(PC, m_disassembler);
printTokenized = true;
@@ -488,20 +502,11 @@ DisassemblerLLVM::DecodeInstructions
if (inst_address_class == eAddressClassCodeAlternateISA)
use_thumb = true;
}
- bool force_raw = false;
- switch (m_arch.GetMachine())
- {
- case llvm::Triple::arm:
- case llvm::Triple::thumb:
- force_raw = true;
- break;
- default:
- break;
- }
+
InstructionSP inst_sp (new InstructionLLVM (inst_addr,
inst_address_class,
use_thumb ? m_disassembler_thumb : m_disassembler,
- force_raw));
+ m_arch.GetMachine()));
size_t inst_byte_size = inst_sp->Decode (*this, data, data_offset);
OpenPOWER on IntegriCloud