From 4b95aa4c6fce491e3ffc126cc840a367094f71b9 Mon Sep 17 00:00:00 2001 From: Johnny Chen Date: Thu, 12 May 2011 22:25:53 +0000 Subject: [PATCH] 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 --- .../Disassembler/llvm/DisassemblerLLVM.cpp | 35 +++++++++++-------- .../Disassembler/llvm/DisassemblerLLVM.h | 4 +-- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp index 9b28266b59d0..e8284a729795 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); diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h index 953f5f492b12..0d2d920bb706 100644 --- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h +++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.h @@ -22,7 +22,7 @@ public: InstructionLLVM (const lldb_private::Address &addr, lldb_private::AddressClass addr_class, EDDisassemblerRef disassembler, - bool force_raw); + llvm::Triple::ArchType arch_type); virtual ~InstructionLLVM(); @@ -46,7 +46,7 @@ public: protected: EDDisassemblerRef m_disassembler; EDInstRef m_inst; - bool m_force_raw; + llvm::Triple::ArchType m_arch_type; }; -- GitLab