summaryrefslogtreecommitdiffstats
path: root/lldb/source/Commands/CommandObjectDisassemble.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/Commands/CommandObjectDisassemble.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/Commands/CommandObjectDisassemble.cpp')
-rw-r--r--lldb/source/Commands/CommandObjectDisassemble.cpp49
1 files changed, 47 insertions, 2 deletions
diff --git a/lldb/source/Commands/CommandObjectDisassemble.cpp b/lldb/source/Commands/CommandObjectDisassemble.cpp
index 8478541828c..7a4d1e727c0 100644
--- a/lldb/source/Commands/CommandObjectDisassemble.cpp
+++ b/lldb/source/Commands/CommandObjectDisassemble.cpp
@@ -46,6 +46,7 @@ CommandObjectDisassemble::CommandOptions::CommandOptions (CommandInterpreter &in
at_pc (false),
frame_line (false),
plugin_name (),
+ flavor_string(),
arch(),
some_location_specified (false)
{
@@ -125,6 +126,18 @@ CommandObjectDisassemble::CommandOptions::SetOptionValue (uint32_t option_idx, c
plugin_name.assign (option_arg);
break;
+ case 'F':
+ {
+ Target *target = m_interpreter.GetExecutionContext().GetTargetPtr();
+ if (target->GetArchitecture().GetTriple().getArch() == llvm::Triple::x86
+ || target->GetArchitecture().GetTriple().getArch() == llvm::Triple::x86_64)
+ {
+ flavor_string.assign (option_arg);
+ }
+ else
+ error.SetErrorStringWithFormat("Disassembler flavors are currently only supported for x86 and x86_64 targets.");
+ break;
+ }
case 'r':
raw = true;
break;
@@ -162,6 +175,26 @@ CommandObjectDisassemble::CommandOptions::OptionParsingStarting ()
end_addr = LLDB_INVALID_ADDRESS;
raw = false;
plugin_name.clear();
+
+ Target *target = m_interpreter.GetExecutionContext().GetTargetPtr();
+
+ // This is a hack till we get the ability to specify features based on architecture. For now GetDisassemblyFlavor
+ // is really only valid for x86 (and for the llvm assembler plugin, but I'm papering over that since that is the
+ // only disassembler plugin we have...
+ if (target)
+ {
+ if (target->GetArchitecture().GetTriple().getArch() == llvm::Triple::x86
+ || target->GetArchitecture().GetTriple().getArch() == llvm::Triple::x86_64)
+ {
+ flavor_string.assign(target->GetDisassemblyFlavor());
+ }
+ else
+ flavor_string.assign ("default");
+
+ }
+ else
+ flavor_string.assign("default");
+
arch.Clear();
some_location_specified = false;
}
@@ -189,6 +222,9 @@ CommandObjectDisassemble::CommandOptions::g_option_table[] =
{ LLDB_OPT_SET_ALL, false, "mixed" , 'm', no_argument , NULL, 0, eArgTypeNone, "Enable mixed source and assembly display."},
{ LLDB_OPT_SET_ALL, false, "raw" , 'r', no_argument , NULL, 0, eArgTypeNone, "Print raw disassembly with no symbol information."},
{ LLDB_OPT_SET_ALL, false, "plugin" , 'P', required_argument , NULL, 0, eArgTypePlugin, "Name of the disassembler plugin you want to use."},
+{ LLDB_OPT_SET_ALL, false, "flavor" , 'F', required_argument , NULL, 0, eArgTypeDisassemblyFlavor, "Name of the disassembly flavor you want to use. "
+ "Currently the only valid options are default, and for Intel"
+ " architectures, att and intel."},
{ LLDB_OPT_SET_ALL, false, "arch" , 'a', required_argument , NULL, 0, eArgTypeArchitecture,"Specify the architecture to use from cross disassembly."},
{ LLDB_OPT_SET_1 |
LLDB_OPT_SET_2 , true , "start-address", 's', required_argument , NULL, 0, eArgTypeAddressOrExpression,"Address at which to start disassembling."},
@@ -245,20 +281,26 @@ CommandObjectDisassemble::DoExecute (Args& command, CommandReturnObject &result)
}
const char *plugin_name = m_options.GetPluginName ();
- DisassemblerSP disassembler = Disassembler::FindPlugin(m_options.arch, plugin_name);
+ const char *flavor_string = m_options.GetFlavorString();
+
+ DisassemblerSP disassembler = Disassembler::FindPlugin(m_options.arch, flavor_string, plugin_name);
if (!disassembler)
{
if (plugin_name)
- result.AppendErrorWithFormat ("Unable to find Disassembler plug-in named '%s' that supports the '%s' architecture.\n",
+ {
+ result.AppendErrorWithFormat ("Unable to find Disassembler plug-in named '%s' that supports the '%s' architecture.\n",
plugin_name,
m_options.arch.GetArchitectureName());
+ }
else
result.AppendErrorWithFormat ("Unable to find Disassembler plug-in for the '%s' architecture.\n",
m_options.arch.GetArchitectureName());
result.SetStatus (eReturnStatusFailed);
return false;
}
+ else if (flavor_string != NULL && !disassembler->FlavorValidForArchSpec(m_options.arch, flavor_string))
+ result.AppendWarningWithFormat("invalid disassembler flavor \"%s\", using default.\n", flavor_string);
result.SetStatus (eReturnStatusSuccessFinishResult);
@@ -293,6 +335,7 @@ CommandObjectDisassemble::DoExecute (Args& command, CommandReturnObject &result)
if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
m_options.arch,
plugin_name,
+ flavor_string,
m_exe_ctx,
name,
NULL, // Module *
@@ -413,6 +456,7 @@ CommandObjectDisassemble::DoExecute (Args& command, CommandReturnObject &result)
if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
m_options.arch,
plugin_name,
+ flavor_string,
m_exe_ctx,
range.GetBaseAddress(),
m_options.num_instructions,
@@ -459,6 +503,7 @@ CommandObjectDisassemble::DoExecute (Args& command, CommandReturnObject &result)
if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
m_options.arch,
plugin_name,
+ flavor_string,
m_exe_ctx,
range,
m_options.num_instructions,
OpenPOWER on IntegriCloud