130fdc8d8SChris Lattner //===-- CommandObjectDisassemble.cpp ----------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "CommandObjectDisassemble.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner // C Includes
1330fdc8d8SChris Lattner // C++ Includes
1430fdc8d8SChris Lattner // Other libraries and framework includes
1530fdc8d8SChris Lattner // Project includes
1630fdc8d8SChris Lattner #include "lldb/Core/AddressRange.h"
1740af72e1SJim Ingham #include "lldb/Interpreter/Args.h"
1830fdc8d8SChris Lattner #include "lldb/Interpreter/CommandCompletions.h"
1930fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
2030fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
2130fdc8d8SChris Lattner #include "lldb/Core/Disassembler.h"
2240af72e1SJim Ingham #include "lldb/Interpreter/Options.h"
2330fdc8d8SChris Lattner #include "lldb/Core/SourceManager.h"
2430fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
2530fdc8d8SChris Lattner #include "lldb/Symbol/Symbol.h"
2630fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2730fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner #define DEFAULT_DISASM_BYTE_SIZE 32
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner using namespace lldb;
3230fdc8d8SChris Lattner using namespace lldb_private;
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::CommandOptions () :
3530fdc8d8SChris Lattner     Options(),
3630fdc8d8SChris Lattner     m_func_name(),
378651121cSJim Ingham     m_start_addr(),
388651121cSJim Ingham     m_end_addr ()
3930fdc8d8SChris Lattner {
4030fdc8d8SChris Lattner     ResetOptionValues();
4130fdc8d8SChris Lattner }
4230fdc8d8SChris Lattner 
4330fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::~CommandOptions ()
4430fdc8d8SChris Lattner {
4530fdc8d8SChris Lattner }
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner Error
4830fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::SetOptionValue (int option_idx, const char *option_arg)
4930fdc8d8SChris Lattner {
5030fdc8d8SChris Lattner     Error error;
5130fdc8d8SChris Lattner 
5230fdc8d8SChris Lattner     char short_option = (char) m_getopt_table[option_idx].val;
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner     switch (short_option)
5530fdc8d8SChris Lattner     {
5630fdc8d8SChris Lattner     case 'm':
5730fdc8d8SChris Lattner         show_mixed = true;
5830fdc8d8SChris Lattner         break;
5930fdc8d8SChris Lattner 
6030fdc8d8SChris Lattner     case 'c':
6130fdc8d8SChris Lattner         num_lines_context = Args::StringToUInt32(option_arg, 0, 0);
6230fdc8d8SChris Lattner         break;
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner     case 'b':
6530fdc8d8SChris Lattner         show_bytes = true;
6630fdc8d8SChris Lattner         break;
6730fdc8d8SChris Lattner 
688651121cSJim Ingham     case 's':
698651121cSJim Ingham         m_start_addr = Args::StringToUInt64(optarg, LLDB_INVALID_ADDRESS, 0);
708651121cSJim Ingham         if (m_start_addr == LLDB_INVALID_ADDRESS)
718651121cSJim Ingham             m_start_addr = Args::StringToUInt64(optarg, LLDB_INVALID_ADDRESS, 16);
7230fdc8d8SChris Lattner 
738651121cSJim Ingham         if (m_start_addr == LLDB_INVALID_ADDRESS)
748651121cSJim Ingham             error.SetErrorStringWithFormat ("Invalid start address string '%s'.\n", optarg);
758651121cSJim Ingham         break;
768651121cSJim Ingham     case 'e':
778651121cSJim Ingham         m_end_addr = Args::StringToUInt64(optarg, LLDB_INVALID_ADDRESS, 0);
788651121cSJim Ingham         if (m_end_addr == LLDB_INVALID_ADDRESS)
798651121cSJim Ingham             m_end_addr = Args::StringToUInt64(optarg, LLDB_INVALID_ADDRESS, 16);
808651121cSJim Ingham 
818651121cSJim Ingham         if (m_end_addr == LLDB_INVALID_ADDRESS)
828651121cSJim Ingham             error.SetErrorStringWithFormat ("Invalid end address string '%s'.\n", optarg);
8330fdc8d8SChris Lattner         break;
8430fdc8d8SChris Lattner 
8530fdc8d8SChris Lattner     case 'n':
8630fdc8d8SChris Lattner         m_func_name = option_arg;
8730fdc8d8SChris Lattner         break;
8830fdc8d8SChris Lattner 
8930fdc8d8SChris Lattner     case 'r':
9030fdc8d8SChris Lattner         raw = true;
9130fdc8d8SChris Lattner         break;
9230fdc8d8SChris Lattner 
9330fdc8d8SChris Lattner     default:
9430fdc8d8SChris Lattner         error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option);
9530fdc8d8SChris Lattner         break;
9630fdc8d8SChris Lattner     }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner     return error;
9930fdc8d8SChris Lattner }
10030fdc8d8SChris Lattner 
10130fdc8d8SChris Lattner void
10230fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::ResetOptionValues ()
10330fdc8d8SChris Lattner {
10430fdc8d8SChris Lattner     Options::ResetOptionValues();
10530fdc8d8SChris Lattner     show_mixed = false;
10630fdc8d8SChris Lattner     show_bytes = false;
10730fdc8d8SChris Lattner     num_lines_context = 0;
10830fdc8d8SChris Lattner     m_func_name.clear();
1098651121cSJim Ingham     m_start_addr = LLDB_INVALID_ADDRESS;
1108651121cSJim Ingham     m_end_addr = LLDB_INVALID_ADDRESS;
111a68c1a21SSean Callanan     raw = false;
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner 
11430fdc8d8SChris Lattner const lldb::OptionDefinition*
11530fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::GetDefinitions ()
11630fdc8d8SChris Lattner {
11730fdc8d8SChris Lattner     return g_option_table;
11830fdc8d8SChris Lattner }
11930fdc8d8SChris Lattner 
12030fdc8d8SChris Lattner lldb::OptionDefinition
12130fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::g_option_table[] =
12230fdc8d8SChris Lattner {
1238651121cSJim Ingham { LLDB_OPT_SET_ALL, false, "bytes",    'b', no_argument,       NULL, 0, NULL,             "Show opcode bytes when disassembling."},
1248651121cSJim Ingham { LLDB_OPT_SET_ALL, false, "context",  'c', required_argument, NULL, 0, "<num-lines>",    "Number of context lines of source to show."},
1258651121cSJim Ingham { LLDB_OPT_SET_ALL, false, "mixed",    'm', no_argument,       NULL, 0, NULL,             "Enable mixed source and assembly display."},
1268651121cSJim Ingham { LLDB_OPT_SET_ALL, false, "raw",      'r', no_argument,       NULL, 0, NULL,             "Print raw disassembly with no symbol information."},
12730fdc8d8SChris Lattner 
1288651121cSJim Ingham { LLDB_OPT_SET_1, true, "start-address",  's', required_argument, NULL, 0, "<start-address>",      "Address to start disassembling."},
1298651121cSJim Ingham { LLDB_OPT_SET_1, false, "end-address",  'e', required_argument, NULL, 0, "<end-address>",      "Address to start disassembling."},
13030fdc8d8SChris Lattner 
1318651121cSJim Ingham { LLDB_OPT_SET_2, true, "name",     'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, "<function-name>",             "Disassemble entire contents of the given function name."},
1328651121cSJim Ingham 
1338651121cSJim Ingham { LLDB_OPT_SET_3, false, "current-frame",     'f', no_argument, NULL, 0, "<current-frame>",             "Disassemble entire contents of the current frame's function."},
13430fdc8d8SChris Lattner 
13530fdc8d8SChris Lattner { 0, false, NULL, 0, 0, NULL, 0, NULL, NULL }
13630fdc8d8SChris Lattner };
13730fdc8d8SChris Lattner 
13830fdc8d8SChris Lattner 
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner //-------------------------------------------------------------------------
14130fdc8d8SChris Lattner // CommandObjectDisassemble
14230fdc8d8SChris Lattner //-------------------------------------------------------------------------
14330fdc8d8SChris Lattner 
14430fdc8d8SChris Lattner CommandObjectDisassemble::CommandObjectDisassemble () :
14530fdc8d8SChris Lattner     CommandObject ("disassemble",
14630fdc8d8SChris Lattner                      "Disassemble bytes in the current function or anywhere in the inferior program.",
1478651121cSJim Ingham                      "disassemble [<cmd-options>]")
14830fdc8d8SChris Lattner {
14930fdc8d8SChris Lattner }
15030fdc8d8SChris Lattner 
15130fdc8d8SChris Lattner CommandObjectDisassemble::~CommandObjectDisassemble()
15230fdc8d8SChris Lattner {
15330fdc8d8SChris Lattner }
15430fdc8d8SChris Lattner 
15530fdc8d8SChris Lattner void
15630fdc8d8SChris Lattner CommandObjectDisassemble::Disassemble
15730fdc8d8SChris Lattner (
158*6611103cSGreg Clayton     CommandInterpreter &interpreter,
15930fdc8d8SChris Lattner     CommandReturnObject &result,
16030fdc8d8SChris Lattner     Disassembler *disassembler,
16130fdc8d8SChris Lattner     const SymbolContextList &sc_list
16230fdc8d8SChris Lattner )
16330fdc8d8SChris Lattner {
16430fdc8d8SChris Lattner     const size_t count = sc_list.GetSize();
16530fdc8d8SChris Lattner     SymbolContext sc;
16630fdc8d8SChris Lattner     AddressRange range;
16730fdc8d8SChris Lattner     for (size_t i=0; i<count; ++i)
16830fdc8d8SChris Lattner     {
16930fdc8d8SChris Lattner         if (sc_list.GetContextAtIndex(i, sc) == false)
17030fdc8d8SChris Lattner             break;
17130fdc8d8SChris Lattner         if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, range))
17230fdc8d8SChris Lattner         {
173*6611103cSGreg Clayton             lldb::addr_t addr = range.GetBaseAddress().GetLoadAddress(interpreter.GetDebugger().GetExecutionContext().process);
17430fdc8d8SChris Lattner             if (addr != LLDB_INVALID_ADDRESS)
17530fdc8d8SChris Lattner             {
17630fdc8d8SChris Lattner                 lldb::addr_t end_addr = addr + range.GetByteSize();
177*6611103cSGreg Clayton                 Disassemble (interpreter, result, disassembler, addr, end_addr);
17830fdc8d8SChris Lattner             }
17930fdc8d8SChris Lattner         }
18030fdc8d8SChris Lattner     }
18130fdc8d8SChris Lattner }
18230fdc8d8SChris Lattner 
18330fdc8d8SChris Lattner void
18430fdc8d8SChris Lattner CommandObjectDisassemble::Disassemble
18530fdc8d8SChris Lattner (
186*6611103cSGreg Clayton     CommandInterpreter &interpreter,
18730fdc8d8SChris Lattner     CommandReturnObject &result,
18830fdc8d8SChris Lattner     Disassembler *disassembler,
18930fdc8d8SChris Lattner     lldb::addr_t addr,
19030fdc8d8SChris Lattner     lldb::addr_t end_addr
19130fdc8d8SChris Lattner )
19230fdc8d8SChris Lattner {
19330fdc8d8SChris Lattner     if (addr == LLDB_INVALID_ADDRESS)
19430fdc8d8SChris Lattner         return;
19530fdc8d8SChris Lattner 
19630fdc8d8SChris Lattner     if (end_addr == LLDB_INVALID_ADDRESS || addr >= end_addr)
19730fdc8d8SChris Lattner         end_addr = addr + DEFAULT_DISASM_BYTE_SIZE;
19830fdc8d8SChris Lattner 
199*6611103cSGreg Clayton     ExecutionContext exe_ctx (interpreter.GetDebugger().GetExecutionContext());
20030fdc8d8SChris Lattner     DataExtractor data;
20130fdc8d8SChris Lattner     size_t bytes_disassembled = disassembler->ParseInstructions (&exe_ctx, eAddressTypeLoad, addr, end_addr - addr, data);
20230fdc8d8SChris Lattner     if (bytes_disassembled == 0)
20330fdc8d8SChris Lattner     {
20430fdc8d8SChris Lattner         // Nothing got disassembled...
20530fdc8d8SChris Lattner     }
20630fdc8d8SChris Lattner     else
20730fdc8d8SChris Lattner     {
20830fdc8d8SChris Lattner         // We got some things disassembled...
20930fdc8d8SChris Lattner         size_t num_instructions = disassembler->GetInstructionList().GetSize();
21030fdc8d8SChris Lattner         uint32_t offset = 0;
21130fdc8d8SChris Lattner         Stream &output_stream = result.GetOutputStream();
21230fdc8d8SChris Lattner         SymbolContext sc;
21330fdc8d8SChris Lattner         SymbolContext prev_sc;
21430fdc8d8SChris Lattner         AddressRange sc_range;
21530fdc8d8SChris Lattner         if (m_options.show_mixed)
21630fdc8d8SChris Lattner             output_stream.IndentMore ();
21730fdc8d8SChris Lattner 
21830fdc8d8SChris Lattner         for (size_t i=0; i<num_instructions; ++i)
21930fdc8d8SChris Lattner         {
22030fdc8d8SChris Lattner             Disassembler::Instruction *inst = disassembler->GetInstructionList().GetInstructionAtIndex (i);
22130fdc8d8SChris Lattner             if (inst)
22230fdc8d8SChris Lattner             {
22330fdc8d8SChris Lattner                 lldb::addr_t curr_addr = addr + offset;
22430fdc8d8SChris Lattner                 if (m_options.show_mixed)
22530fdc8d8SChris Lattner                 {
226*6611103cSGreg Clayton                     Process *process = interpreter.GetDebugger().GetExecutionContext().process;
22730fdc8d8SChris Lattner                     if (!sc_range.ContainsLoadAddress (curr_addr, process))
22830fdc8d8SChris Lattner                     {
22930fdc8d8SChris Lattner                         prev_sc = sc;
23030fdc8d8SChris Lattner                         Address curr_so_addr;
23130fdc8d8SChris Lattner                         if (process && process->ResolveLoadAddress (curr_addr, curr_so_addr))
23230fdc8d8SChris Lattner                         {
23330fdc8d8SChris Lattner                             if (curr_so_addr.GetSection())
23430fdc8d8SChris Lattner                             {
23530fdc8d8SChris Lattner                                 Module *module = curr_so_addr.GetSection()->GetModule();
23630fdc8d8SChris Lattner                                 uint32_t resolved_mask = module->ResolveSymbolContextForAddress(curr_so_addr, eSymbolContextEverything, sc);
23730fdc8d8SChris Lattner                                 if (resolved_mask)
23830fdc8d8SChris Lattner                                 {
23930fdc8d8SChris Lattner                                     sc.GetAddressRange (eSymbolContextEverything, sc_range);
24030fdc8d8SChris Lattner                                     if (sc != prev_sc)
24130fdc8d8SChris Lattner                                     {
24230fdc8d8SChris Lattner                                         if (offset != 0)
24330fdc8d8SChris Lattner                                             output_stream.EOL();
24430fdc8d8SChris Lattner 
24530fdc8d8SChris Lattner                                         sc.DumpStopContext(&output_stream, process, curr_so_addr);
24630fdc8d8SChris Lattner                                         output_stream.EOL();
24730fdc8d8SChris Lattner                                         if (sc.comp_unit && sc.line_entry.IsValid())
24830fdc8d8SChris Lattner                                         {
249*6611103cSGreg Clayton                                             interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (
25030fdc8d8SChris Lattner                                                     sc.line_entry.file,
25130fdc8d8SChris Lattner                                                     sc.line_entry.line,
25230fdc8d8SChris Lattner                                                     m_options.num_lines_context,
25330fdc8d8SChris Lattner                                                     m_options.num_lines_context,
25430fdc8d8SChris Lattner                                                     m_options.num_lines_context ? "->" : "",
25530fdc8d8SChris Lattner                                                     &output_stream);
25630fdc8d8SChris Lattner                                         }
25730fdc8d8SChris Lattner                                     }
25830fdc8d8SChris Lattner                                 }
25930fdc8d8SChris Lattner                             }
26030fdc8d8SChris Lattner                         }
26130fdc8d8SChris Lattner                     }
26230fdc8d8SChris Lattner                 }
26330fdc8d8SChris Lattner                 if (m_options.show_mixed)
26430fdc8d8SChris Lattner                     output_stream.IndentMore ();
26530fdc8d8SChris Lattner                 output_stream.Indent();
26630fdc8d8SChris Lattner                 size_t inst_byte_size = inst->GetByteSize();
26730fdc8d8SChris Lattner                 inst->Dump(&output_stream, curr_addr, m_options.show_bytes ? &data : NULL, offset, exe_ctx, m_options.raw);
26830fdc8d8SChris Lattner                 output_stream.EOL();
26930fdc8d8SChris Lattner                 offset += inst_byte_size;
27030fdc8d8SChris Lattner                 if (m_options.show_mixed)
27130fdc8d8SChris Lattner                     output_stream.IndentLess ();
27230fdc8d8SChris Lattner             }
27330fdc8d8SChris Lattner             else
27430fdc8d8SChris Lattner             {
27530fdc8d8SChris Lattner                 break;
27630fdc8d8SChris Lattner             }
27730fdc8d8SChris Lattner         }
27830fdc8d8SChris Lattner         if (m_options.show_mixed)
27930fdc8d8SChris Lattner             output_stream.IndentLess ();
28030fdc8d8SChris Lattner 
28130fdc8d8SChris Lattner     }
28230fdc8d8SChris Lattner }
28330fdc8d8SChris Lattner 
28430fdc8d8SChris Lattner bool
28530fdc8d8SChris Lattner CommandObjectDisassemble::Execute
28630fdc8d8SChris Lattner (
287*6611103cSGreg Clayton     CommandInterpreter &interpreter,
28830fdc8d8SChris Lattner     Args& command,
28930fdc8d8SChris Lattner     CommandReturnObject &result
29030fdc8d8SChris Lattner )
29130fdc8d8SChris Lattner {
292*6611103cSGreg Clayton     Target *target = interpreter.GetDebugger().GetCurrentTarget().get();
29330fdc8d8SChris Lattner     if (target == NULL)
29430fdc8d8SChris Lattner     {
29530fdc8d8SChris Lattner         result.AppendError ("invalid target, set executable file using 'file' command");
29630fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
29730fdc8d8SChris Lattner         return false;
29830fdc8d8SChris Lattner     }
29930fdc8d8SChris Lattner 
30030fdc8d8SChris Lattner     ArchSpec arch(target->GetArchitecture());
30130fdc8d8SChris Lattner     if (!arch.IsValid())
30230fdc8d8SChris Lattner     {
30330fdc8d8SChris Lattner         result.AppendError ("target needs valid architecure in order to be able to disassemble");
30430fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
30530fdc8d8SChris Lattner         return false;
30630fdc8d8SChris Lattner     }
30730fdc8d8SChris Lattner 
30830fdc8d8SChris Lattner     Disassembler *disassembler = Disassembler::FindPlugin(arch);
30930fdc8d8SChris Lattner 
31030fdc8d8SChris Lattner     if (disassembler == NULL)
31130fdc8d8SChris Lattner     {
31230fdc8d8SChris Lattner         result.AppendErrorWithFormat ("Unable to find Disassembler plug-in for %s architecture.\n", arch.AsCString());
31330fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
31430fdc8d8SChris Lattner         return false;
31530fdc8d8SChris Lattner     }
31630fdc8d8SChris Lattner 
31730fdc8d8SChris Lattner     result.SetStatus (eReturnStatusSuccessFinishResult);
31830fdc8d8SChris Lattner 
31930fdc8d8SChris Lattner     lldb::addr_t addr = LLDB_INVALID_ADDRESS;
32030fdc8d8SChris Lattner     lldb::addr_t end_addr = LLDB_INVALID_ADDRESS;
32130fdc8d8SChris Lattner     ConstString name;
32230fdc8d8SChris Lattner     const size_t argc = command.GetArgumentCount();
3238651121cSJim Ingham     if (argc != 0)
32430fdc8d8SChris Lattner     {
3258651121cSJim Ingham         result.AppendErrorWithFormat ("\"disassemble\" doesn't take any arguments.\n");
3268651121cSJim Ingham         result.SetStatus (eReturnStatusFailed);
3278651121cSJim Ingham         return false;
3288651121cSJim Ingham     }
3298651121cSJim Ingham 
3308651121cSJim Ingham     if (m_options.m_start_addr != LLDB_INVALID_ADDRESS)
3318651121cSJim Ingham     {
3328651121cSJim Ingham         addr = m_options.m_start_addr;
3338651121cSJim Ingham         if (m_options.m_end_addr != LLDB_INVALID_ADDRESS)
3348651121cSJim Ingham         {
3358651121cSJim Ingham             end_addr = m_options.m_end_addr;
3368651121cSJim Ingham             if (end_addr < addr)
3378651121cSJim Ingham             {
3388651121cSJim Ingham                 result.AppendErrorWithFormat ("End address before start address.\n");
3398651121cSJim Ingham                 result.SetStatus (eReturnStatusFailed);
3408651121cSJim Ingham                 return false;
3418651121cSJim Ingham             }
3428651121cSJim Ingham         }
3438651121cSJim Ingham         else
34430fdc8d8SChris Lattner             end_addr = addr + DEFAULT_DISASM_BYTE_SIZE;
3458651121cSJim Ingham     }
3468651121cSJim Ingham     else if (!m_options.m_func_name.empty())
34730fdc8d8SChris Lattner     {
34830fdc8d8SChris Lattner         ConstString tmpname(m_options.m_func_name.c_str());
34930fdc8d8SChris Lattner         name = tmpname;
3508651121cSJim Ingham     }
3518651121cSJim Ingham     else
35230fdc8d8SChris Lattner     {
353*6611103cSGreg Clayton         ExecutionContext exe_ctx(interpreter.GetDebugger().GetExecutionContext());
35430fdc8d8SChris Lattner         if (exe_ctx.frame)
35530fdc8d8SChris Lattner         {
35630fdc8d8SChris Lattner             SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
35730fdc8d8SChris Lattner             if (sc.function)
35830fdc8d8SChris Lattner             {
35930fdc8d8SChris Lattner                 addr = sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress(exe_ctx.process);
36030fdc8d8SChris Lattner                 if (addr != LLDB_INVALID_ADDRESS)
36130fdc8d8SChris Lattner                     end_addr = addr + sc.function->GetAddressRange().GetByteSize();
36230fdc8d8SChris Lattner             }
36330fdc8d8SChris Lattner             else if (sc.symbol && sc.symbol->GetAddressRangePtr())
36430fdc8d8SChris Lattner             {
36530fdc8d8SChris Lattner                 addr = sc.symbol->GetAddressRangePtr()->GetBaseAddress().GetLoadAddress(exe_ctx.process);
36630fdc8d8SChris Lattner                 if (addr != LLDB_INVALID_ADDRESS)
36730fdc8d8SChris Lattner                 {
36830fdc8d8SChris Lattner                     end_addr = addr + sc.symbol->GetAddressRangePtr()->GetByteSize();
36930fdc8d8SChris Lattner                     if (addr == end_addr)
37030fdc8d8SChris Lattner                         end_addr += DEFAULT_DISASM_BYTE_SIZE;
37130fdc8d8SChris Lattner                 }
37230fdc8d8SChris Lattner             }
37330fdc8d8SChris Lattner             else
37430fdc8d8SChris Lattner             {
37530fdc8d8SChris Lattner                 addr = exe_ctx.frame->GetPC().GetLoadAddress(exe_ctx.process);
37630fdc8d8SChris Lattner                 if (addr != LLDB_INVALID_ADDRESS)
37730fdc8d8SChris Lattner                     end_addr = addr + DEFAULT_DISASM_BYTE_SIZE;
37830fdc8d8SChris Lattner             }
37930fdc8d8SChris Lattner         }
38030fdc8d8SChris Lattner         else
38130fdc8d8SChris Lattner         {
38230fdc8d8SChris Lattner             result.AppendError ("invalid frame");
38330fdc8d8SChris Lattner             result.SetStatus (eReturnStatusFailed);
38430fdc8d8SChris Lattner             return false;
38530fdc8d8SChris Lattner         }
38630fdc8d8SChris Lattner     }
38730fdc8d8SChris Lattner 
38830fdc8d8SChris Lattner     if (!name.IsEmpty())
38930fdc8d8SChris Lattner     {
39030fdc8d8SChris Lattner         SymbolContextList sc_list;
39130fdc8d8SChris Lattner 
39230fdc8d8SChris Lattner         if (target->GetImages().FindFunctions(name, sc_list))
39330fdc8d8SChris Lattner         {
394*6611103cSGreg Clayton             Disassemble (interpreter, result, disassembler, sc_list);
39530fdc8d8SChris Lattner         }
39630fdc8d8SChris Lattner         else if (target->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list))
39730fdc8d8SChris Lattner         {
398*6611103cSGreg Clayton             Disassemble (interpreter, result, disassembler, sc_list);
39930fdc8d8SChris Lattner         }
40030fdc8d8SChris Lattner         else
40130fdc8d8SChris Lattner         {
40230fdc8d8SChris Lattner             result.AppendErrorWithFormat ("Unable to find symbol with name '%s'.\n", name.GetCString());
40330fdc8d8SChris Lattner             result.SetStatus (eReturnStatusFailed);
40430fdc8d8SChris Lattner             return false;
40530fdc8d8SChris Lattner         }
40630fdc8d8SChris Lattner     }
4078651121cSJim Ingham     else
40830fdc8d8SChris Lattner     {
409*6611103cSGreg Clayton         Disassemble (interpreter, result, disassembler, addr, end_addr);
41030fdc8d8SChris Lattner     }
41130fdc8d8SChris Lattner 
41230fdc8d8SChris Lattner     return result.Succeeded();
41330fdc8d8SChris Lattner }
414