diff options
| author | Sean Callanan <scallanan@apple.com> | 2012-03-22 01:10:50 +0000 |
|---|---|---|
| committer | Sean Callanan <scallanan@apple.com> | 2012-03-22 01:10:50 +0000 |
| commit | 3f85b3205a17a6347b22e1cfcca46d021daf367f (patch) | |
| tree | 8aa11be440e95ae6c0d6a9841e58410674204288 /lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp | |
| parent | 9fe8098e29666cf9ef0c9ce38890284f44074958 (diff) | |
| download | bcm5719-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.cpp | 67 |
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; } |

