diff options
author | Johnny Chen <johnny.chen@apple.com> | 2011-05-12 22:25:53 +0000 |
---|---|---|
committer | Johnny Chen <johnny.chen@apple.com> | 2011-05-12 22:25:53 +0000 |
commit | 4b95aa4c6fce491e3ffc126cc840a367094f71b9 (patch) | |
tree | 40e55e36b7b6b86fbabecad6d8e713977a387f2a /lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp | |
parent | 2ce1630c9261c93d67001c993950ff4aa35bb6b9 (diff) | |
download | bcm5719-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.cpp | 35 |
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); |