diff options
author | Jim Ingham <jingham@apple.com> | 2013-03-02 00:26:47 +0000 |
---|---|---|
committer | Jim Ingham <jingham@apple.com> | 2013-03-02 00:26:47 +0000 |
commit | 0f063ba6b41276a18f3f60380ce16fcd58b20484 (patch) | |
tree | 19e25c2ecef13047a0fe0ec382961b0d4d98d027 /lldb/source/Core/Disassembler.cpp | |
parent | b1caf3c30e6a72b37379600872e253da4d18178e (diff) | |
download | bcm5719-llvm-0f063ba6b41276a18f3f60380ce16fcd58b20484.tar.gz bcm5719-llvm-0f063ba6b41276a18f3f60380ce16fcd58b20484.zip |
Convert from the C-based LLVM Disassembler shim to the full MC Disassembler API's.
Calculate "can branch" using the MC API's rather than our hand-rolled regex'es.
As extra credit, allow setting the disassembly flavor for x86 based architectures to intel or att.
<rdar://problem/11319574>
<rdar://problem/9329275>
llvm-svn: 176392
Diffstat (limited to 'lldb/source/Core/Disassembler.cpp')
-rw-r--r-- | lldb/source/Core/Disassembler.cpp | 50 |
1 files changed, 39 insertions, 11 deletions
diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp index b74238c65e6..8bbd8b51b2a 100644 --- a/lldb/source/Core/Disassembler.cpp +++ b/lldb/source/Core/Disassembler.cpp @@ -45,7 +45,7 @@ using namespace lldb_private; DisassemblerSP -Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name) +Disassembler::FindPlugin (const ArchSpec &arch, const char *flavor, const char *plugin_name) { Timer scoped_timer (__PRETTY_FUNCTION__, "Disassembler::FindPlugin (arch = %s, plugin_name = %s)", @@ -59,7 +59,7 @@ Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name) create_callback = PluginManager::GetDisassemblerCreateCallbackForPluginName (plugin_name); if (create_callback) { - DisassemblerSP disassembler_sp(create_callback(arch)); + DisassemblerSP disassembler_sp(create_callback(arch, flavor)); if (disassembler_sp.get()) return disassembler_sp; @@ -69,7 +69,7 @@ Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name) { for (uint32_t idx = 0; (create_callback = PluginManager::GetDisassemblerCreateCallbackAtIndex(idx)) != NULL; ++idx) { - DisassemblerSP disassembler_sp(create_callback(arch)); + DisassemblerSP disassembler_sp(create_callback(arch, flavor)); if (disassembler_sp.get()) return disassembler_sp; @@ -78,6 +78,20 @@ Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name) return DisassemblerSP(); } +DisassemblerSP +Disassembler::FindPluginForTarget(const TargetSP target_sp, const ArchSpec &arch, const char *flavor, const char *plugin_name) +{ + if (target_sp && flavor == NULL) + { + // FIXME - we don't have the mechanism in place to do per-architecture settings. But since we know that for now + // we only support flavors on x86 & x86_64, + if (arch.GetTriple().getArch() == llvm::Triple::x86 + || arch.GetTriple().getArch() == llvm::Triple::x86_64) + flavor = target_sp->GetDisassemblyFlavor(); + } + return FindPlugin(arch, flavor, plugin_name); +} + static void ResolveAddress (const ExecutionContext &exe_ctx, @@ -114,6 +128,7 @@ Disassembler::Disassemble Debugger &debugger, const ArchSpec &arch, const char *plugin_name, + const char *flavor, const ExecutionContext &exe_ctx, SymbolContextList &sc_list, uint32_t num_instructions, @@ -137,6 +152,7 @@ Disassembler::Disassemble if (Disassemble (debugger, arch, plugin_name, + flavor, exe_ctx, range, num_instructions, @@ -158,6 +174,7 @@ Disassembler::Disassemble Debugger &debugger, const ArchSpec &arch, const char *plugin_name, + const char *flavor, const ExecutionContext &exe_ctx, const ConstString &name, Module *module, @@ -204,6 +221,7 @@ Disassembler::Disassemble return Disassemble (debugger, arch, plugin_name, + flavor, exe_ctx, sc_list, num_instructions, @@ -220,6 +238,7 @@ Disassembler::DisassembleRange ( const ArchSpec &arch, const char *plugin_name, + const char *flavor, const ExecutionContext &exe_ctx, const AddressRange &range ) @@ -227,7 +246,7 @@ Disassembler::DisassembleRange lldb::DisassemblerSP disasm_sp; if (range.GetByteSize() > 0 && range.GetBaseAddress().IsValid()) { - disasm_sp = Disassembler::FindPlugin(arch, plugin_name); + disasm_sp = Disassembler::FindPluginForTarget(exe_ctx.GetTargetSP(), arch, flavor, plugin_name); if (disasm_sp) { @@ -244,6 +263,7 @@ Disassembler::DisassembleBytes ( const ArchSpec &arch, const char *plugin_name, + const char *flavor, const Address &start, const void *bytes, size_t length, @@ -254,7 +274,7 @@ Disassembler::DisassembleBytes if (bytes) { - disasm_sp = Disassembler::FindPlugin(arch, plugin_name); + disasm_sp = Disassembler::FindPlugin(arch, flavor, plugin_name); if (disasm_sp) { @@ -278,6 +298,7 @@ Disassembler::Disassemble Debugger &debugger, const ArchSpec &arch, const char *plugin_name, + const char *flavor, const ExecutionContext &exe_ctx, const AddressRange &disasm_range, uint32_t num_instructions, @@ -288,7 +309,7 @@ Disassembler::Disassemble { if (disasm_range.GetByteSize()) { - lldb::DisassemblerSP disasm_sp (Disassembler::FindPlugin(arch, plugin_name)); + lldb::DisassemblerSP disasm_sp (Disassembler::FindPluginForTarget(exe_ctx.GetTargetSP(), arch, flavor, plugin_name)); if (disasm_sp.get()) { @@ -319,6 +340,7 @@ Disassembler::Disassemble Debugger &debugger, const ArchSpec &arch, const char *plugin_name, + const char *flavor, const ExecutionContext &exe_ctx, const Address &start_address, uint32_t num_instructions, @@ -329,7 +351,7 @@ Disassembler::Disassemble { if (num_instructions > 0) { - lldb::DisassemblerSP disasm_sp (Disassembler::FindPlugin(arch, plugin_name)); + lldb::DisassemblerSP disasm_sp (Disassembler::FindPluginForTarget(exe_ctx.GetTargetSP(), arch, flavor, plugin_name)); if (disasm_sp.get()) { Address addr; @@ -473,6 +495,7 @@ Disassembler::Disassemble Debugger &debugger, const ArchSpec &arch, const char *plugin_name, + const char *flavor, const ExecutionContext &exe_ctx, uint32_t num_instructions, uint32_t num_mixed_context_lines, @@ -506,6 +529,7 @@ Disassembler::Disassemble return Disassemble (debugger, arch, plugin_name, + flavor, exe_ctx, range, num_instructions, @@ -594,7 +618,7 @@ Instruction::Dump (lldb_private::Stream *s, ss.PutCString (m_opcode_name.c_str()); ss.FillLastLineToColumn (opcode_pos + opcode_column_width, ' '); - ss.PutCString (m_mnemocics.c_str()); + ss.PutCString (m_mnemonics.c_str()); if (!m_comment.empty()) { @@ -1121,12 +1145,16 @@ Disassembler::ParseInstructions //---------------------------------------------------------------------- // Disassembler copy constructor //---------------------------------------------------------------------- -Disassembler::Disassembler(const ArchSpec& arch) : +Disassembler::Disassembler(const ArchSpec& arch, const char *flavor) : m_arch (arch), m_instruction_list(), - m_base_addr(LLDB_INVALID_ADDRESS) + m_base_addr(LLDB_INVALID_ADDRESS), + m_flavor () { - + if (flavor == NULL) + m_flavor.assign("default"); + else + m_flavor.assign(flavor); } //---------------------------------------------------------------------- |