summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp')
-rw-r--r--lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp34
1 files changed, 29 insertions, 5 deletions
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
index 9f2ddd845e7..3b10a343209 100644
--- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
+++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
@@ -31,8 +31,8 @@ using namespace lldb;
using namespace lldb_private;
-static
-int DataExtractorByteReader(uint8_t *byte, uint64_t address, void *arg)
+static int
+DataExtractorByteReader(uint8_t *byte, uint64_t address, void *arg)
{
DataExtractor &extractor = *((DataExtractor *)arg);
@@ -66,7 +66,7 @@ static int IPRegisterReader(uint64_t *value, unsigned regID, void* arg)
uint64_t instructionPointer = ((RegisterReaderArg*)arg)->instructionPointer;
EDDisassemblerRef disassembler = ((RegisterReaderArg*)arg)->disassembler;
- if(EDRegisterIsProgramCounter(disassembler, regID)) {
+ if (EDRegisterIsProgramCounter(disassembler, regID)) {
*value = instructionPointer;
return 0;
}
@@ -371,13 +371,26 @@ DisassemblerLLVM::CreateInstance(const ArchSpec &arch)
DisassemblerLLVM::DisassemblerLLVM(const ArchSpec &arch) :
Disassembler (arch),
- m_disassembler (NULL)
+ m_disassembler (NULL),
+ m_disassembler_thumb (NULL) // For ARM only
{
const std::string &arch_triple = arch.GetTriple().str();
if (!arch_triple.empty())
{
if (EDGetDisassembler(&m_disassembler, arch_triple.c_str(), SyntaxForArchSpec (arch)))
m_disassembler = NULL;
+ llvm::Triple::ArchType llvm_arch = arch.GetTriple().getArch();
+ if (llvm_arch == llvm::Triple::arm)
+ {
+ if (EDGetDisassembler(&m_disassembler_thumb, "thumb-apple-darwin", kEDAssemblySyntaxARMUAL))
+ m_disassembler_thumb = NULL;
+ }
+ else if (llvm_arch == llvm::Triple::thumb)
+ {
+ m_disassembler_thumb = m_disassembler;
+ if (EDGetDisassembler(&m_disassembler, "arm-apple-darwin-unknown", kEDAssemblySyntaxARMUAL))
+ m_disassembler = NULL;
+ }
}
}
@@ -405,7 +418,18 @@ DisassemblerLLVM::DecodeInstructions
{
Address inst_addr (base_addr);
inst_addr.Slide(data_offset);
- InstructionSP inst_sp (new InstructionLLVM(m_disassembler, inst_addr));
+
+ bool use_thumb = false;
+ // If we have a thumb disassembler, then we have an ARM architecture
+ // so we need to check what the instruction address class is to make
+ // sure we shouldn't be disassembling as thumb...
+ if (m_disassembler_thumb)
+ {
+ if (inst_addr.GetAddressClass () == eAddressClassCodeAlternateISA)
+ use_thumb = true;
+ }
+ InstructionSP inst_sp (new InstructionLLVM (use_thumb ? m_disassembler_thumb : m_disassembler,
+ inst_addr));
size_t inst_byte_size = inst_sp->Extract (data, data_offset);
OpenPOWER on IntegriCloud