summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/Disassembler.cpp
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2013-03-02 00:26:47 +0000
committerJim Ingham <jingham@apple.com>2013-03-02 00:26:47 +0000
commit0f063ba6b41276a18f3f60380ce16fcd58b20484 (patch)
tree19e25c2ecef13047a0fe0ec382961b0d4d98d027 /lldb/source/Core/Disassembler.cpp
parentb1caf3c30e6a72b37379600872e253da4d18178e (diff)
downloadbcm5719-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.cpp50
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);
}
//----------------------------------------------------------------------
OpenPOWER on IntegriCloud