diff options
author | Johnny Chen <johnny.chen@apple.com> | 2011-08-03 04:50:37 +0000 |
---|---|---|
committer | Johnny Chen <johnny.chen@apple.com> | 2011-08-03 04:50:37 +0000 |
commit | 9bfd9144e69750a3826e4e474841a86912e292b0 (patch) | |
tree | cab4cf8e665b18573aff8a17deef8be0b60b9ea7 /lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp | |
parent | fad9eef23bb17c79ef2cb124f21c4507c8358439 (diff) | |
download | bcm5719-llvm-9bfd9144e69750a3826e4e474841a86912e292b0.tar.gz bcm5719-llvm-9bfd9144e69750a3826e4e474841a86912e292b0.zip |
Fixed an issue of wrong (by +2) branch target calculation in the disassembler's symbolic information output.
A8.6.23 BLX (immediate T2)
Target Address = Align(PC, 4) + offset value
rdar://problem/9885678
llvm-svn: 136766
Diffstat (limited to 'lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp')
-rw-r--r-- | lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp index 972d9a3ad16..a027201f6b8 100644 --- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp +++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp @@ -146,6 +146,7 @@ Align(Stream *s, const char *str, size_t opcodeColWidth, size_t operandColWidth) PadString(s, p.second, operandColWidth); } +#define AlignPC(pc_val) (pc_val & 0xFFFFFFFC) void InstructionLLVM::Dump ( @@ -355,6 +356,11 @@ InstructionLLVM::Dump const char *pos = NULL; operands.Clear(); comment.Clear(); if (EDGetInstString(&inst_str, m_inst) == 0 && (pos = strstr(inst_str, "#")) != NULL) { + if (m_arch_type == llvm::Triple::thumb && opcode.GetString() == "blx") { + // A8.6.23 BLX (immediate) + // Target Address = Align(PC,4) + offset value + PC = AlignPC(PC); + } uint64_t operand_value = PC + atoi(++pos); // Put the address value into the comment. comment.Printf("0x%llx ", operand_value); |