summaryrefslogtreecommitdiffstats
path: root/lldb/source/Commands/CommandObjectDisassemble.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2010-06-30 23:03:03 +0000
committerGreg Clayton <gclayton@apple.com>2010-06-30 23:03:03 +0000
commitdda4f7b520827fb1cce38dbef9a00758067df99a (patch)
tree622c1e19dfdda4764cb606030d83e030c22a92e0 /lldb/source/Commands/CommandObjectDisassemble.cpp
parent56f2e34a6a0810f28fa4d7ab171a9e12415e29a3 (diff)
downloadbcm5719-llvm-dda4f7b520827fb1cce38dbef9a00758067df99a.tar.gz
bcm5719-llvm-dda4f7b520827fb1cce38dbef9a00758067df99a.zip
Centralized all disassembly into static functions in source/Core/Disassembler.cpp.
Added the ability to read memory from the target's object files when we aren't running, so disassembling works before you run! Cleaned up the API to lldb_private::Target::ReadMemory(). Cleaned up the API to the Disassembler to use actual "lldb_private::Address" objects instead of just an "addr_t". This is nice because the Address objects when resolved carry along their section and module which can get us the object file. This allows Target::ReadMemory to be used when we are not running. Added a new lldb_private::Address dump style: DumpStyleDetailedSymbolContext This will show a full breakdown of what an address points to. To see some sample output, execute a "image lookup --address <addr>". Fixed SymbolContext::DumpStopContext(...) to not require a live process in order to be able to print function and symbol offsets. llvm-svn: 107350
Diffstat (limited to 'lldb/source/Commands/CommandObjectDisassemble.cpp')
-rw-r--r--lldb/source/Commands/CommandObjectDisassemble.cpp258
1 files changed, 62 insertions, 196 deletions
diff --git a/lldb/source/Commands/CommandObjectDisassemble.cpp b/lldb/source/Commands/CommandObjectDisassemble.cpp
index c5fbbea0b41..4bf392c094f 100644
--- a/lldb/source/Commands/CommandObjectDisassemble.cpp
+++ b/lldb/source/Commands/CommandObjectDisassemble.cpp
@@ -152,135 +152,6 @@ CommandObjectDisassemble::~CommandObjectDisassemble()
{
}
-void
-CommandObjectDisassemble::Disassemble
-(
- CommandInterpreter &interpreter,
- CommandReturnObject &result,
- Disassembler *disassembler,
- const SymbolContextList &sc_list
-)
-{
- const size_t count = sc_list.GetSize();
- SymbolContext sc;
- AddressRange range;
- for (size_t i=0; i<count; ++i)
- {
- if (sc_list.GetContextAtIndex(i, sc) == false)
- break;
- if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, range))
- {
- lldb::addr_t addr = range.GetBaseAddress().GetLoadAddress(interpreter.GetDebugger().GetExecutionContext().process);
- if (addr != LLDB_INVALID_ADDRESS)
- {
- lldb::addr_t end_addr = addr + range.GetByteSize();
- Disassemble (interpreter, result, disassembler, addr, end_addr);
- }
- }
- }
-}
-
-void
-CommandObjectDisassemble::Disassemble
-(
- CommandInterpreter &interpreter,
- CommandReturnObject &result,
- Disassembler *disassembler,
- lldb::addr_t addr,
- lldb::addr_t end_addr
-)
-{
- if (addr == LLDB_INVALID_ADDRESS)
- return;
-
- if (end_addr == LLDB_INVALID_ADDRESS || addr >= end_addr)
- end_addr = addr + DEFAULT_DISASM_BYTE_SIZE;
-
- ExecutionContext exe_ctx (interpreter.GetDebugger().GetExecutionContext());
- DataExtractor data;
- size_t bytes_disassembled = disassembler->ParseInstructions (&exe_ctx, eAddressTypeLoad, addr, end_addr - addr, data);
- if (bytes_disassembled == 0)
- {
- // Nothing got disassembled...
- }
- else
- {
- // We got some things disassembled...
- size_t num_instructions = disassembler->GetInstructionList().GetSize();
- uint32_t offset = 0;
- Stream &output_stream = result.GetOutputStream();
- SymbolContext sc;
- SymbolContext prev_sc;
- AddressRange sc_range;
- if (m_options.show_mixed)
- output_stream.IndentMore ();
-
- for (size_t i=0; i<num_instructions; ++i)
- {
- Disassembler::Instruction *inst = disassembler->GetInstructionList().GetInstructionAtIndex (i);
- if (inst)
- {
- lldb::addr_t curr_addr = addr + offset;
- if (m_options.show_mixed)
- {
- Process *process = interpreter.GetDebugger().GetExecutionContext().process;
- if (!sc_range.ContainsLoadAddress (curr_addr, process))
- {
- prev_sc = sc;
- Address curr_so_addr;
- if (process && process->ResolveLoadAddress (curr_addr, curr_so_addr))
- {
- if (curr_so_addr.GetSection())
- {
- Module *module = curr_so_addr.GetSection()->GetModule();
- uint32_t resolved_mask = module->ResolveSymbolContextForAddress(curr_so_addr, eSymbolContextEverything, sc);
- if (resolved_mask)
- {
- sc.GetAddressRange (eSymbolContextEverything, sc_range);
- if (sc != prev_sc)
- {
- if (offset != 0)
- output_stream.EOL();
-
- sc.DumpStopContext(&output_stream, process, curr_so_addr);
- output_stream.EOL();
- if (sc.comp_unit && sc.line_entry.IsValid())
- {
- interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (
- sc.line_entry.file,
- sc.line_entry.line,
- m_options.num_lines_context,
- m_options.num_lines_context,
- m_options.num_lines_context ? "->" : "",
- &output_stream);
- }
- }
- }
- }
- }
- }
- }
- if (m_options.show_mixed)
- output_stream.IndentMore ();
- output_stream.Indent();
- size_t inst_byte_size = inst->GetByteSize();
- inst->Dump(&output_stream, curr_addr, m_options.show_bytes ? &data : NULL, offset, exe_ctx, m_options.raw);
- output_stream.EOL();
- offset += inst_byte_size;
- if (m_options.show_mixed)
- output_stream.IndentLess ();
- }
- else
- {
- break;
- }
- }
- if (m_options.show_mixed)
- output_stream.IndentLess ();
-
- }
-}
-
bool
CommandObjectDisassemble::Execute
(
@@ -316,100 +187,95 @@ CommandObjectDisassemble::Execute
result.SetStatus (eReturnStatusSuccessFinishResult);
- lldb::addr_t addr = LLDB_INVALID_ADDRESS;
- lldb::addr_t end_addr = LLDB_INVALID_ADDRESS;
- ConstString name;
- const size_t argc = command.GetArgumentCount();
- if (argc != 0)
+ if (command.GetArgumentCount() != 0)
{
result.AppendErrorWithFormat ("\"disassemble\" doesn't take any arguments.\n");
result.SetStatus (eReturnStatusFailed);
return false;
}
-
- if (m_options.m_start_addr != LLDB_INVALID_ADDRESS)
+ ExecutionContext exe_ctx(interpreter.GetDebugger().GetExecutionContext());
+
+ if (m_options.show_mixed && m_options.num_lines_context == 0)
+ m_options.num_lines_context = 3;
+
+ if (!m_options.m_func_name.empty())
{
- addr = m_options.m_start_addr;
- if (m_options.m_end_addr != LLDB_INVALID_ADDRESS)
+ ConstString name(m_options.m_func_name.c_str());
+
+ if (Disassembler::Disassemble (interpreter.GetDebugger(),
+ arch,
+ exe_ctx,
+ name,
+ NULL, // Module *
+ m_options.show_mixed ? m_options.num_lines_context : 0,
+ m_options.show_bytes,
+ result.GetOutputStream()))
{
- end_addr = m_options.m_end_addr;
- if (end_addr < addr)
- {
- result.AppendErrorWithFormat ("End address before start address.\n");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ result.SetStatus (eReturnStatusSuccessFinishResult);
}
else
- end_addr = addr + DEFAULT_DISASM_BYTE_SIZE;
- }
- else if (!m_options.m_func_name.empty())
- {
- ConstString tmpname(m_options.m_func_name.c_str());
- name = tmpname;
+ {
+ result.AppendErrorWithFormat ("Unable to find symbol with name '%s'.\n", name.GetCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
}
else
{
- ExecutionContext exe_ctx(interpreter.GetDebugger().GetExecutionContext());
- if (exe_ctx.frame)
+ AddressRange range;
+ if (m_options.m_start_addr != LLDB_INVALID_ADDRESS)
{
- SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
- if (sc.function)
- {
- addr = sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress(exe_ctx.process);
- if (addr != LLDB_INVALID_ADDRESS)
- end_addr = addr + sc.function->GetAddressRange().GetByteSize();
- }
- else if (sc.symbol && sc.symbol->GetAddressRangePtr())
+ range.GetBaseAddress().SetOffset (m_options.m_start_addr);
+ if (m_options.m_end_addr != LLDB_INVALID_ADDRESS)
{
- addr = sc.symbol->GetAddressRangePtr()->GetBaseAddress().GetLoadAddress(exe_ctx.process);
- if (addr != LLDB_INVALID_ADDRESS)
+ if (m_options.m_end_addr < m_options.m_start_addr)
{
- end_addr = addr + sc.symbol->GetAddressRangePtr()->GetByteSize();
- if (addr == end_addr)
- end_addr += DEFAULT_DISASM_BYTE_SIZE;
+ result.AppendErrorWithFormat ("End address before start address.\n");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
+ range.SetByteSize (m_options.m_end_addr - m_options.m_start_addr);
}
else
- {
- addr = exe_ctx.frame->GetPC().GetLoadAddress(exe_ctx.process);
- if (addr != LLDB_INVALID_ADDRESS)
- end_addr = addr + DEFAULT_DISASM_BYTE_SIZE;
- }
- }
+ range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
+ }
else
{
- result.AppendError ("invalid frame");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
- }
-
- if (!name.IsEmpty())
- {
- SymbolContextList sc_list;
-
- if (target->GetImages().FindFunctions(name,
- eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
- sc_list))
- {
- Disassemble (interpreter, result, disassembler, sc_list);
+ if (exe_ctx.frame)
+ {
+ SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
+ if (sc.function)
+ range = sc.function->GetAddressRange();
+ else if (sc.symbol && sc.symbol->GetAddressRangePtr())
+ range = *sc.symbol->GetAddressRangePtr();
+ else
+ range.GetBaseAddress() = exe_ctx.frame->GetPC();
+ }
+ else
+ {
+ result.AppendError ("invalid frame");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
}
- else if (target->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list))
+ if (range.GetByteSize() == 0)
+ range.SetByteSize(DEFAULT_DISASM_BYTE_SIZE);
+
+ if (Disassembler::Disassemble (interpreter.GetDebugger(),
+ arch,
+ exe_ctx,
+ range,
+ m_options.show_mixed ? m_options.num_lines_context : 0,
+ m_options.show_bytes,
+ result.GetOutputStream()))
{
- Disassemble (interpreter, result, disassembler, sc_list);
+ result.SetStatus (eReturnStatusSuccessFinishResult);
}
else
{
- result.AppendErrorWithFormat ("Unable to find symbol with name '%s'.\n", name.GetCString());
- result.SetStatus (eReturnStatusFailed);
- return false;
+ result.AppendErrorWithFormat ("Failed to disassemble memory at 0x%8.8llx.\n", m_options.m_start_addr);
+ result.SetStatus (eReturnStatusFailed);
}
}
- else
- {
- Disassemble (interpreter, result, disassembler, addr, end_addr);
- }
return result.Succeeded();
}
OpenPOWER on IntegriCloud