summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2012-03-22 01:10:50 +0000
committerSean Callanan <scallanan@apple.com>2012-03-22 01:10:50 +0000
commit3f85b3205a17a6347b22e1cfcca46d021daf367f (patch)
tree8aa11be440e95ae6c0d6a9841e58410674204288 /lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
parent9fe8098e29666cf9ef0c9ce38890284f44074958 (diff)
downloadbcm5719-llvm-3f85b3205a17a6347b22e1cfcca46d021daf367f.tar.gz
bcm5719-llvm-3f85b3205a17a6347b22e1cfcca46d021daf367f.zip
Fixed a bug in the disassembler where we did
not properly print the load addresses for PC-relative jumps. llvm-svn: 153233
Diffstat (limited to 'lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp')
-rw-r--r--lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp67
1 files changed, 38 insertions, 29 deletions
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
index cd8a1352d19..2666475adcb 100644
--- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
+++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
@@ -356,11 +356,20 @@ protected:
disasm_context = m_disasm.m_disasm_context;
m_comment_stream.Clear();
-
- size_t inst_size = ::LLVMDisasmInstruction(disasm_context,
- const_cast<uint8_t*>(data_start) + data_offset,
- extractor.GetByteSize() - data_offset,
- address.GetFileAddress(),
+
+ lldb::addr_t pc = LLDB_INVALID_ADDRESS;
+
+ if (exe_scope)
+ if (TargetSP target_sp = exe_scope->CalculateTarget())
+ pc = m_address.GetLoadAddress(target_sp.get());
+
+ if (pc == LLDB_INVALID_ADDRESS)
+ pc = m_address.GetFileAddress();
+
+ size_t inst_size = ::LLVMDisasmInstruction(disasm_context,
+ const_cast<uint8_t*>(data_start) + data_offset,
+ extractor.GetByteSize() - data_offset,
+ pc,
out_string.data(),
out_string.size());
@@ -384,32 +393,32 @@ protected:
{
if (!inst_size)
return false;
+ }
- PopulateOpcode(extractor, data_offset, inst_size);
-
- m_raw_bytes.resize(inst_size);
- memcpy(m_raw_bytes.data(), data_start + data_offset, inst_size);
-
- if (!s_regex_compiled)
- {
- ::regcomp(&s_regex, "[ \t]*([^ ^\t]+)[ \t]*([^ ^\t].*)?", REG_EXTENDED);
- s_regex_compiled = true;
- }
-
- ::regmatch_t matches[3];
-
- const char *out_data = out_string.data();
-
- if (!::regexec(&s_regex, out_data, sizeof(matches) / sizeof(::regmatch_t), matches, 0))
- {
- if (matches[1].rm_so != -1)
- m_opcode_name.assign(out_data + matches[1].rm_so, matches[1].rm_eo - matches[1].rm_so);
- if (matches[2].rm_so != -1)
- m_mnemocics.assign(out_data + matches[2].rm_so, matches[2].rm_eo - matches[2].rm_so);
- }
-
- m_is_valid = true;
+ PopulateOpcode(extractor, data_offset, inst_size);
+
+ m_raw_bytes.resize(inst_size);
+ memcpy(m_raw_bytes.data(), data_start + data_offset, inst_size);
+
+ if (!s_regex_compiled)
+ {
+ ::regcomp(&s_regex, "[ \t]*([^ ^\t]+)[ \t]*([^ ^\t].*)?", REG_EXTENDED);
+ s_regex_compiled = true;
+ }
+
+ ::regmatch_t matches[3];
+
+ const char *out_data = out_string.data();
+
+ if (!::regexec(&s_regex, out_data, sizeof(matches) / sizeof(::regmatch_t), matches, 0))
+ {
+ if (matches[1].rm_so != -1)
+ m_opcode_name.assign(out_data + matches[1].rm_so, matches[1].rm_eo - matches[1].rm_so);
+ if (matches[2].rm_so != -1)
+ m_mnemocics.assign(out_data + matches[2].rm_so, matches[2].rm_eo - matches[2].rm_so);
}
+
+ m_is_valid = true;
return true;
}
OpenPOWER on IntegriCloud