summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/Disassembler.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-03-25 18:03:16 +0000
committerGreg Clayton <gclayton@apple.com>2011-03-25 18:03:16 +0000
commit1080edbcdd7d24ad5213749e396e23b54c1a3040 (patch)
tree25cb5d0a1e62ba603df46e3376cdf4dfeb1969ca /lldb/source/Core/Disassembler.cpp
parent6f4c9425eb5b689a2a4bfa19531ef9ab4c5c6e5d (diff)
downloadbcm5719-llvm-1080edbcdd7d24ad5213749e396e23b54c1a3040.tar.gz
bcm5719-llvm-1080edbcdd7d24ad5213749e396e23b54c1a3040.zip
Cleaned up the Disassembler code a bit more. You can now request a disassembler
plugin by name on the command line for when there is more than one disassembler plugin. Taught the Opcode class to dump itself so that "disassembler -b" will dump the bytes correctly for each opcode type. Modified all places that were passing the opcode bytes buffer in so that the bytes could be displayed to just pass in a bool that indicates if we should dump the opcode bytes since the opcode now lives inside llvm_private::Instruction. llvm-svn: 128290
Diffstat (limited to 'lldb/source/Core/Disassembler.cpp')
-rw-r--r--lldb/source/Core/Disassembler.cpp141
1 files changed, 80 insertions, 61 deletions
diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp
index efd70815f10..9f3897752fe 100644
--- a/lldb/source/Core/Disassembler.cpp
+++ b/lldb/source/Core/Disassembler.cpp
@@ -34,20 +34,36 @@ using namespace lldb_private;
Disassembler*
-Disassembler::FindPlugin (const ArchSpec &arch)
+Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name)
{
Timer scoped_timer (__PRETTY_FUNCTION__,
- "Disassembler::FindPlugin (arch = %s)",
- arch.GetArchitectureName());
+ "Disassembler::FindPlugin (arch = %s, plugin_name = %s)",
+ arch.GetArchitectureName(),
+ plugin_name);
std::auto_ptr<Disassembler> disassembler_ap;
- DisassemblerCreateInstance create_callback;
- for (uint32_t idx = 0; (create_callback = PluginManager::GetDisassemblerCreateCallbackAtIndex(idx)) != NULL; ++idx)
+ DisassemblerCreateInstance create_callback = NULL;
+
+ if (plugin_name)
+ {
+ create_callback = PluginManager::GetDisassemblerCreateCallbackForPluginName (plugin_name);
+ if (create_callback)
+ {
+ disassembler_ap.reset (create_callback(arch));
+
+ if (disassembler_ap.get())
+ return disassembler_ap.release();
+ }
+ }
+ else
{
- disassembler_ap.reset (create_callback(arch));
+ for (uint32_t idx = 0; (create_callback = PluginManager::GetDisassemblerCreateCallbackAtIndex(idx)) != NULL; ++idx)
+ {
+ disassembler_ap.reset (create_callback(arch));
- if (disassembler_ap.get())
- return disassembler_ap.release();
+ if (disassembler_ap.get())
+ return disassembler_ap.release();
+ }
}
return NULL;
}
@@ -59,6 +75,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
SymbolContextList &sc_list,
uint32_t num_instructions,
@@ -79,8 +96,16 @@ Disassembler::Disassemble
break;
if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, range))
{
- if (Disassemble (debugger, arch, exe_ctx, range, num_instructions,
- num_mixed_context_lines, show_bytes, raw, strm))
+ if (Disassemble (debugger,
+ arch,
+ plugin_name,
+ exe_ctx,
+ range,
+ num_instructions,
+ num_mixed_context_lines,
+ show_bytes,
+ raw,
+ strm))
{
++success_count;
strm.EOL();
@@ -95,6 +120,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const ConstString &name,
Module *module,
@@ -137,6 +163,7 @@ Disassembler::Disassemble
{
return Disassemble (debugger,
arch,
+ plugin_name,
exe_ctx,
sc_list,
num_instructions,
@@ -153,6 +180,7 @@ lldb::DisassemblerSP
Disassembler::DisassembleRange
(
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const AddressRange &range
)
@@ -160,7 +188,7 @@ Disassembler::DisassembleRange
lldb::DisassemblerSP disasm_sp;
if (range.GetByteSize() > 0 && range.GetBaseAddress().IsValid())
{
- disasm_sp.reset (Disassembler::FindPlugin(arch));
+ disasm_sp.reset (Disassembler::FindPlugin(arch, plugin_name));
if (disasm_sp)
{
@@ -179,6 +207,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const AddressRange &disasm_range,
uint32_t num_instructions,
@@ -190,7 +219,7 @@ Disassembler::Disassemble
{
if (disasm_range.GetByteSize())
{
- std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch));
+ std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch, plugin_name));
if (disasm_ap.get())
{
@@ -216,23 +245,18 @@ Disassembler::Disassemble
DataExtractor data;
size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, range, data);
if (bytes_disassembled == 0)
- {
return false;
- }
- else
- {
- return PrintInstructions (disasm_ap.get(),
- data,
- debugger,
- arch,
- exe_ctx,
- disasm_range.GetBaseAddress(),
- num_instructions,
- num_mixed_context_lines,
- show_bytes,
- raw,
- strm);
- }
+
+ return PrintInstructions (disasm_ap.get(),
+ debugger,
+ arch,
+ exe_ctx,
+ disasm_range.GetBaseAddress(),
+ num_instructions,
+ num_mixed_context_lines,
+ show_bytes,
+ raw,
+ strm);
}
}
return false;
@@ -243,6 +267,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
const Address &start_address,
uint32_t num_instructions,
@@ -254,7 +279,7 @@ Disassembler::Disassemble
{
if (num_instructions > 0)
{
- std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch));
+ std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch, plugin_name));
Address addr = start_address;
if (disasm_ap.get())
@@ -279,23 +304,17 @@ Disassembler::Disassemble
DataExtractor data;
size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, addr, num_instructions, data);
if (bytes_disassembled == 0)
- {
return false;
- }
- else
- {
- return PrintInstructions (disasm_ap.get(),
- data,
- debugger,
- arch,
- exe_ctx,
- addr,
- num_instructions,
- num_mixed_context_lines,
- show_bytes,
- raw,
- strm);
- }
+ return PrintInstructions (disasm_ap.get(),
+ debugger,
+ arch,
+ exe_ctx,
+ addr,
+ num_instructions,
+ num_mixed_context_lines,
+ show_bytes,
+ raw,
+ strm);
}
}
return false;
@@ -305,7 +324,6 @@ bool
Disassembler::PrintInstructions
(
Disassembler *disasm_ptr,
- DataExtractor &data,
Debugger &debugger,
const ArchSpec &arch,
const ExecutionContext &exe_ctx,
@@ -407,12 +425,10 @@ Disassembler::PrintInstructions
if (num_mixed_context_lines)
strm.IndentMore ();
strm.Indent();
- size_t inst_byte_size = inst->GetByteSize();
- inst->Dump(&strm, true, show_bytes ? &data : NULL, offset, &exe_ctx, raw);
+ inst->Dump(&strm, true, show_bytes, &exe_ctx, raw);
strm.EOL();
- offset += inst_byte_size;
- addr.SetOffset (addr.GetOffset() + inst_byte_size);
+ addr.Slide(inst->GetOpcode().GetByteSize());
if (num_mixed_context_lines)
strm.IndentLess ();
@@ -434,6 +450,7 @@ Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
+ const char *plugin_name,
const ExecutionContext &exe_ctx,
uint32_t num_instructions,
uint32_t num_mixed_context_lines,
@@ -463,19 +480,21 @@ Disassembler::Disassemble
range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
}
- return Disassemble(debugger, arch, exe_ctx, range, num_instructions, num_mixed_context_lines, show_bytes, raw, strm);
+ return Disassemble (debugger,
+ arch,
+ plugin_name,
+ exe_ctx,
+ range,
+ num_instructions,
+ num_mixed_context_lines,
+ show_bytes,
+ raw,
+ strm);
}
-Instruction::Instruction(const Address &addr) :
- m_addr (addr)
-{
- ::memset (&m_opcode, 0, sizeof (m_opcode));
-}
-
-
-Instruction::Instruction(const Address &addr, const Opcode &opcode) :
- m_addr (addr),
- m_opcode (opcode)
+Instruction::Instruction(const Address &address) :
+ m_address (address),
+ m_opcode()
{
}
OpenPOWER on IntegriCloud