summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Disassembler/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/Disassembler/llvm')
-rw-r--r--lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp6
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);
OpenPOWER on IntegriCloud