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
3037023b06SJim Ingham #define DEFAULT_DISASM_NUM_INS  4
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner using namespace lldb;
3330fdc8d8SChris Lattner using namespace lldb_private;
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::CommandOptions () :
3630fdc8d8SChris Lattner     Options(),
3737023b06SJim Ingham     num_lines_context(0),
3837023b06SJim Ingham     num_instructions (0),
3930fdc8d8SChris Lattner     m_func_name(),
408651121cSJim Ingham     m_start_addr(),
4137023b06SJim Ingham     m_end_addr (),
4237023b06SJim Ingham     m_at_pc (false)
4330fdc8d8SChris Lattner {
4430fdc8d8SChris Lattner     ResetOptionValues();
4530fdc8d8SChris Lattner }
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::~CommandOptions ()
4830fdc8d8SChris Lattner {
4930fdc8d8SChris Lattner }
5030fdc8d8SChris Lattner 
5130fdc8d8SChris Lattner Error
5230fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::SetOptionValue (int option_idx, const char *option_arg)
5330fdc8d8SChris Lattner {
5430fdc8d8SChris Lattner     Error error;
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner     char short_option = (char) m_getopt_table[option_idx].val;
5730fdc8d8SChris Lattner 
5837023b06SJim Ingham     bool success;
5937023b06SJim Ingham 
6030fdc8d8SChris Lattner     switch (short_option)
6130fdc8d8SChris Lattner     {
6230fdc8d8SChris Lattner     case 'm':
6330fdc8d8SChris Lattner         show_mixed = true;
6430fdc8d8SChris Lattner         break;
6530fdc8d8SChris Lattner 
6637023b06SJim Ingham     case 'x':
6737023b06SJim Ingham         num_lines_context = Args::StringToUInt32(option_arg, 0, 0, &success);
6837023b06SJim Ingham         if (!success)
6937023b06SJim Ingham             error.SetErrorStringWithFormat ("Invalid num context lines string: \"%s\".\n", option_arg);
7037023b06SJim Ingham         break;
7137023b06SJim Ingham 
7230fdc8d8SChris Lattner     case 'c':
7337023b06SJim Ingham         num_instructions = Args::StringToUInt32(option_arg, 0, 0, &success);
7437023b06SJim Ingham         if (!success)
7537023b06SJim Ingham             error.SetErrorStringWithFormat ("Invalid num of instructions string: \"%s\".\n", option_arg);
7630fdc8d8SChris Lattner         break;
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner     case 'b':
7930fdc8d8SChris Lattner         show_bytes = true;
8030fdc8d8SChris Lattner         break;
8130fdc8d8SChris Lattner 
828651121cSJim Ingham     case 's':
8337023b06SJim Ingham         m_start_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 0);
848651121cSJim Ingham         if (m_start_addr == LLDB_INVALID_ADDRESS)
8537023b06SJim Ingham             m_start_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 16);
8630fdc8d8SChris Lattner 
878651121cSJim Ingham         if (m_start_addr == LLDB_INVALID_ADDRESS)
8837023b06SJim Ingham             error.SetErrorStringWithFormat ("Invalid start address string '%s'.\n", option_arg);
898651121cSJim Ingham         break;
908651121cSJim Ingham     case 'e':
9137023b06SJim Ingham         m_end_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 0);
928651121cSJim Ingham         if (m_end_addr == LLDB_INVALID_ADDRESS)
9337023b06SJim Ingham             m_end_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 16);
948651121cSJim Ingham 
958651121cSJim Ingham         if (m_end_addr == LLDB_INVALID_ADDRESS)
9637023b06SJim Ingham             error.SetErrorStringWithFormat ("Invalid end address string '%s'.\n", option_arg);
9730fdc8d8SChris Lattner         break;
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner     case 'n':
10030fdc8d8SChris Lattner         m_func_name = option_arg;
10130fdc8d8SChris Lattner         break;
10230fdc8d8SChris Lattner 
10337023b06SJim Ingham     case 'p':
10437023b06SJim Ingham         m_at_pc = true;
10537023b06SJim Ingham         break;
10637023b06SJim Ingham 
10730fdc8d8SChris Lattner     case 'r':
10830fdc8d8SChris Lattner         raw = true;
10930fdc8d8SChris Lattner         break;
11030fdc8d8SChris Lattner 
1118ceb8ba2SJohnny Chen     case 'f':
1128ceb8ba2SJohnny Chen         // The default action is to disassemble the function for the current frame.
1138ceb8ba2SJohnny Chen         // There's no need to set any flag.
1148ceb8ba2SJohnny Chen         break;
1158ceb8ba2SJohnny Chen 
11630fdc8d8SChris Lattner     default:
11730fdc8d8SChris Lattner         error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option);
11830fdc8d8SChris Lattner         break;
11930fdc8d8SChris Lattner     }
12030fdc8d8SChris Lattner 
12130fdc8d8SChris Lattner     return error;
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner 
12430fdc8d8SChris Lattner void
12530fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::ResetOptionValues ()
12630fdc8d8SChris Lattner {
12730fdc8d8SChris Lattner     Options::ResetOptionValues();
12830fdc8d8SChris Lattner     show_mixed = false;
12930fdc8d8SChris Lattner     show_bytes = false;
13030fdc8d8SChris Lattner     num_lines_context = 0;
13137023b06SJim Ingham     num_instructions = 0;
13230fdc8d8SChris Lattner     m_func_name.clear();
13337023b06SJim Ingham     m_at_pc = false;
1348651121cSJim Ingham     m_start_addr = LLDB_INVALID_ADDRESS;
1358651121cSJim Ingham     m_end_addr = LLDB_INVALID_ADDRESS;
136a68c1a21SSean Callanan     raw = false;
13730fdc8d8SChris Lattner }
13830fdc8d8SChris Lattner 
139*e0d378b3SGreg Clayton const OptionDefinition*
14030fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::GetDefinitions ()
14130fdc8d8SChris Lattner {
14230fdc8d8SChris Lattner     return g_option_table;
14330fdc8d8SChris Lattner }
14430fdc8d8SChris Lattner 
145*e0d378b3SGreg Clayton OptionDefinition
14630fdc8d8SChris Lattner CommandObjectDisassemble::CommandOptions::g_option_table[] =
14730fdc8d8SChris Lattner {
148deaab222SCaroline Tice { LLDB_OPT_SET_ALL, false, "bytes",    'b', no_argument,       NULL, 0, eArgTypeNone,             "Show opcode bytes when disassembling."},
14937023b06SJim Ingham { LLDB_OPT_SET_ALL, false, "context",  'x', required_argument, NULL, 0, eArgTypeNumLines,    "Number of context lines of source to show."},
150deaab222SCaroline Tice { LLDB_OPT_SET_ALL, false, "mixed",    'm', no_argument,       NULL, 0, eArgTypeNone,             "Enable mixed source and assembly display."},
151deaab222SCaroline Tice { LLDB_OPT_SET_ALL, false, "raw",      'r', no_argument,       NULL, 0, eArgTypeNone,             "Print raw disassembly with no symbol information."},
15230fdc8d8SChris Lattner 
153405fe67fSCaroline Tice { LLDB_OPT_SET_1, true, "start-address",  's', required_argument, NULL, 0, eArgTypeStartAddress,      "Address at which to start disassembling."},
154405fe67fSCaroline Tice { LLDB_OPT_SET_1, false, "end-address",  'e', required_argument, NULL, 0, eArgTypeEndAddress,      "Address at which to end disassembling."},
15530fdc8d8SChris Lattner 
15637023b06SJim Ingham { LLDB_OPT_SET_2, true, "start-address",  's', required_argument, NULL, 0, eArgTypeStartAddress,      "Address at which to start disassembling."},
15737023b06SJim Ingham { LLDB_OPT_SET_2, false, "instruction-count",  'c', required_argument, NULL, 0, eArgTypeNumLines,      "Number of instructions to display."},
1588651121cSJim Ingham 
15937023b06SJim Ingham { LLDB_OPT_SET_3, true, "name",     'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeFunctionName,             "Disassemble entire contents of the given function name."},
16037023b06SJim Ingham { LLDB_OPT_SET_3, false, "instruction-count",  'c', required_argument, NULL, 0, eArgTypeNumLines,      "Number of instructions to display."},
16137023b06SJim Ingham 
16237023b06SJim Ingham { LLDB_OPT_SET_4, true, "current-frame", 'f',  no_argument, NULL, 0, eArgTypeNone,             "Disassemble from the start of the current frame's function."},
16337023b06SJim Ingham { LLDB_OPT_SET_4, false, "instruction-count",  'c', required_argument, NULL, 0, eArgTypeNumLines,      "Number of instructions to display."},
16437023b06SJim Ingham 
16537023b06SJim Ingham { LLDB_OPT_SET_5, true, "current-pc", 'p',  no_argument, NULL, 0, eArgTypeNone,             "Disassemble from the current pc."},
16637023b06SJim Ingham { LLDB_OPT_SET_5, false, "instruction-count",  'c', required_argument, NULL, 0, eArgTypeNumLines,      "Number of instructions to display."},
16730fdc8d8SChris Lattner 
168deaab222SCaroline Tice { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
16930fdc8d8SChris Lattner };
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner 
17330fdc8d8SChris Lattner //-------------------------------------------------------------------------
17430fdc8d8SChris Lattner // CommandObjectDisassemble
17530fdc8d8SChris Lattner //-------------------------------------------------------------------------
17630fdc8d8SChris Lattner 
177a7015092SGreg Clayton CommandObjectDisassemble::CommandObjectDisassemble (CommandInterpreter &interpreter) :
178a7015092SGreg Clayton     CommandObject (interpreter,
179a7015092SGreg Clayton                    "disassemble",
1803f4c09c1SCaroline Tice                    "Disassemble bytes in the current function, or elsewhere in the executable program as specified by the user.",
1818651121cSJim Ingham                    "disassemble [<cmd-options>]")
18230fdc8d8SChris Lattner {
18330fdc8d8SChris Lattner }
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner CommandObjectDisassemble::~CommandObjectDisassemble()
18630fdc8d8SChris Lattner {
18730fdc8d8SChris Lattner }
18830fdc8d8SChris Lattner 
18930fdc8d8SChris Lattner bool
19030fdc8d8SChris Lattner CommandObjectDisassemble::Execute
19130fdc8d8SChris Lattner (
19230fdc8d8SChris Lattner     Args& command,
19330fdc8d8SChris Lattner     CommandReturnObject &result
19430fdc8d8SChris Lattner )
19530fdc8d8SChris Lattner {
196a7015092SGreg Clayton     Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
19730fdc8d8SChris Lattner     if (target == NULL)
19830fdc8d8SChris Lattner     {
19930fdc8d8SChris Lattner         result.AppendError ("invalid target, set executable file using 'file' command");
20030fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
20130fdc8d8SChris Lattner         return false;
20230fdc8d8SChris Lattner     }
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner     ArchSpec arch(target->GetArchitecture());
20530fdc8d8SChris Lattner     if (!arch.IsValid())
20630fdc8d8SChris Lattner     {
20730fdc8d8SChris Lattner         result.AppendError ("target needs valid architecure in order to be able to disassemble");
20830fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
20930fdc8d8SChris Lattner         return false;
21030fdc8d8SChris Lattner     }
21130fdc8d8SChris Lattner 
21230fdc8d8SChris Lattner     Disassembler *disassembler = Disassembler::FindPlugin(arch);
21330fdc8d8SChris Lattner 
21430fdc8d8SChris Lattner     if (disassembler == NULL)
21530fdc8d8SChris Lattner     {
21664195a2cSGreg Clayton         result.AppendErrorWithFormat ("Unable to find Disassembler plug-in for %s architecture.\n", arch.GetArchitectureName());
21730fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
21830fdc8d8SChris Lattner         return false;
21930fdc8d8SChris Lattner     }
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner     result.SetStatus (eReturnStatusSuccessFinishResult);
22230fdc8d8SChris Lattner 
223dda4f7b5SGreg Clayton     if (command.GetArgumentCount() != 0)
22430fdc8d8SChris Lattner     {
225a7015092SGreg Clayton         result.AppendErrorWithFormat ("\"disassemble\" arguments are specified as options.\n");
226a7015092SGreg Clayton         GetOptions()->GenerateOptionUsage (m_interpreter,
227a7015092SGreg Clayton                                            result.GetErrorStream(),
228a7015092SGreg Clayton                                            this);
229a7015092SGreg Clayton 
2308651121cSJim Ingham         result.SetStatus (eReturnStatusFailed);
2318651121cSJim Ingham         return false;
2328651121cSJim Ingham     }
2338651121cSJim Ingham 
234dda4f7b5SGreg Clayton     if (m_options.show_mixed && m_options.num_lines_context == 0)
2356dbd3983SGreg Clayton         m_options.num_lines_context = 1;
236dda4f7b5SGreg Clayton 
23737023b06SJim Ingham     ExecutionContext exe_ctx(m_interpreter.GetDebugger().GetExecutionContext());
23837023b06SJim Ingham 
239dda4f7b5SGreg Clayton     if (!m_options.m_func_name.empty())
240dda4f7b5SGreg Clayton     {
241dda4f7b5SGreg Clayton         ConstString name(m_options.m_func_name.c_str());
242dda4f7b5SGreg Clayton 
243a7015092SGreg Clayton         if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
244dda4f7b5SGreg Clayton                                        arch,
245dda4f7b5SGreg Clayton                                        exe_ctx,
246dda4f7b5SGreg Clayton                                        name,
247dda4f7b5SGreg Clayton                                        NULL,    // Module *
24837023b06SJim Ingham                                        m_options.num_instructions,
249dda4f7b5SGreg Clayton                                        m_options.show_mixed ? m_options.num_lines_context : 0,
250dda4f7b5SGreg Clayton                                        m_options.show_bytes,
251b3396b22SSean Callanan                                        m_options.raw,
252dda4f7b5SGreg Clayton                                        result.GetOutputStream()))
253dda4f7b5SGreg Clayton         {
254dda4f7b5SGreg Clayton             result.SetStatus (eReturnStatusSuccessFinishResult);
255dda4f7b5SGreg Clayton         }
256dda4f7b5SGreg Clayton         else
257dda4f7b5SGreg Clayton         {
258dda4f7b5SGreg Clayton             result.AppendErrorWithFormat ("Unable to find symbol with name '%s'.\n", name.GetCString());
259dda4f7b5SGreg Clayton             result.SetStatus (eReturnStatusFailed);
260dda4f7b5SGreg Clayton         }
261dda4f7b5SGreg Clayton     }
262dda4f7b5SGreg Clayton     else
263dda4f7b5SGreg Clayton     {
26437023b06SJim Ingham         Address start_addr;
26537023b06SJim Ingham         lldb::addr_t range_byte_size = DEFAULT_DISASM_BYTE_SIZE;
26637023b06SJim Ingham 
26737023b06SJim Ingham         if (m_options.m_at_pc)
2688651121cSJim Ingham         {
26937023b06SJim Ingham             if (exe_ctx.frame == NULL)
27037023b06SJim Ingham             {
27137023b06SJim Ingham                 result.AppendError ("Cannot disassemble around the current PC without a selected frame.\n");
27237023b06SJim Ingham                 result.SetStatus (eReturnStatusFailed);
27337023b06SJim Ingham                 return false;
27437023b06SJim Ingham             }
27537023b06SJim Ingham             start_addr = exe_ctx.frame->GetFrameCodeAddress();
27637023b06SJim Ingham             if (m_options.num_instructions == 0)
27737023b06SJim Ingham             {
27837023b06SJim Ingham                 // Disassembling at the PC always disassembles some number of instructions (not the whole function).
27937023b06SJim Ingham                 m_options.num_instructions = DEFAULT_DISASM_NUM_INS;
28037023b06SJim Ingham             }
28137023b06SJim Ingham         }
28237023b06SJim Ingham         else
28337023b06SJim Ingham         {
28437023b06SJim Ingham             start_addr.SetOffset (m_options.m_start_addr);
28537023b06SJim Ingham             if (start_addr.IsValid())
28637023b06SJim Ingham             {
2878651121cSJim Ingham                 if (m_options.m_end_addr != LLDB_INVALID_ADDRESS)
2888651121cSJim Ingham                 {
289dda4f7b5SGreg Clayton                     if (m_options.m_end_addr < m_options.m_start_addr)
2908651121cSJim Ingham                     {
2918651121cSJim Ingham                         result.AppendErrorWithFormat ("End address before start address.\n");
2928651121cSJim Ingham                         result.SetStatus (eReturnStatusFailed);
2938651121cSJim Ingham                         return false;
2948651121cSJim Ingham                     }
29537023b06SJim Ingham                     range_byte_size = m_options.m_end_addr - m_options.m_start_addr;
29637023b06SJim Ingham                 }
29737023b06SJim Ingham             }
29837023b06SJim Ingham         }
29937023b06SJim Ingham 
30037023b06SJim Ingham         if (m_options.num_instructions != 0)
30137023b06SJim Ingham         {
30237023b06SJim Ingham             if (!start_addr.IsValid())
30337023b06SJim Ingham             {
30437023b06SJim Ingham                 // The default action is to disassemble the current frame function.
30537023b06SJim Ingham                 if (exe_ctx.frame)
30637023b06SJim Ingham                 {
30737023b06SJim Ingham                     SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
30837023b06SJim Ingham                     if (sc.function)
30937023b06SJim Ingham                         start_addr = sc.function->GetAddressRange().GetBaseAddress();
31037023b06SJim Ingham                     else if (sc.symbol && sc.symbol->GetAddressRangePtr())
31137023b06SJim Ingham                         start_addr = sc.symbol->GetAddressRangePtr()->GetBaseAddress();
31237023b06SJim Ingham                     else
31337023b06SJim Ingham                         start_addr = exe_ctx.frame->GetFrameCodeAddress();
31437023b06SJim Ingham                 }
31537023b06SJim Ingham 
31637023b06SJim Ingham                 if (!start_addr.IsValid())
31737023b06SJim Ingham                 {
31837023b06SJim Ingham                     result.AppendError ("invalid frame");
31937023b06SJim Ingham                     result.SetStatus (eReturnStatusFailed);
32037023b06SJim Ingham                     return false;
32137023b06SJim Ingham                 }
32237023b06SJim Ingham             }
32337023b06SJim Ingham 
32437023b06SJim Ingham             if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
32537023b06SJim Ingham                                            arch,
32637023b06SJim Ingham                                            exe_ctx,
32737023b06SJim Ingham                                            start_addr,
32837023b06SJim Ingham                                            m_options.num_instructions,
32937023b06SJim Ingham                                            m_options.show_mixed ? m_options.num_lines_context : 0,
33037023b06SJim Ingham                                            m_options.show_bytes,
33137023b06SJim Ingham                                            m_options.raw,
33237023b06SJim Ingham                                            result.GetOutputStream()))
33337023b06SJim Ingham             {
33437023b06SJim Ingham                 result.SetStatus (eReturnStatusSuccessFinishResult);
3358651121cSJim Ingham             }
3368651121cSJim Ingham             else
33737023b06SJim Ingham             {
33837023b06SJim Ingham                 result.AppendErrorWithFormat ("Failed to disassemble memory at 0x%8.8llx.\n", m_options.m_start_addr);
33937023b06SJim Ingham                 result.SetStatus (eReturnStatusFailed);
34037023b06SJim Ingham             }
34137023b06SJim Ingham         }
34237023b06SJim Ingham         else
34337023b06SJim Ingham         {
34437023b06SJim Ingham             AddressRange range;
34537023b06SJim Ingham             if (start_addr.IsValid())
34637023b06SJim Ingham             {
34737023b06SJim Ingham                 range.GetBaseAddress() = start_addr;
34837023b06SJim Ingham                 range.SetByteSize (range_byte_size);
3498651121cSJim Ingham             }
3508651121cSJim Ingham             else
35130fdc8d8SChris Lattner             {
3528ceb8ba2SJohnny Chen                 // The default action is to disassemble the current frame function.
35330fdc8d8SChris Lattner                 if (exe_ctx.frame)
35430fdc8d8SChris Lattner                 {
355dae97b4aSJason Molenda                     SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
35630fdc8d8SChris Lattner                     if (sc.function)
357dda4f7b5SGreg Clayton                         range = sc.function->GetAddressRange();
35830fdc8d8SChris Lattner                     else if (sc.symbol && sc.symbol->GetAddressRangePtr())
359dda4f7b5SGreg Clayton                         range = *sc.symbol->GetAddressRangePtr();
36030fdc8d8SChris Lattner                     else
3619da7bd07SGreg Clayton                         range.GetBaseAddress() = exe_ctx.frame->GetFrameCodeAddress();
36230fdc8d8SChris Lattner                 }
36330fdc8d8SChris Lattner                 else
36430fdc8d8SChris Lattner                 {
36530fdc8d8SChris Lattner                     result.AppendError ("invalid frame");
36630fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
36730fdc8d8SChris Lattner                     return false;
36830fdc8d8SChris Lattner                 }
36930fdc8d8SChris Lattner             }
370dda4f7b5SGreg Clayton             if (range.GetByteSize() == 0)
371dda4f7b5SGreg Clayton                 range.SetByteSize(DEFAULT_DISASM_BYTE_SIZE);
37230fdc8d8SChris Lattner 
373a7015092SGreg Clayton             if (Disassembler::Disassemble (m_interpreter.GetDebugger(),
374dda4f7b5SGreg Clayton                                            arch,
375dda4f7b5SGreg Clayton                                            exe_ctx,
376dda4f7b5SGreg Clayton                                            range,
37737023b06SJim Ingham                                            m_options.num_instructions,
378dda4f7b5SGreg Clayton                                            m_options.show_mixed ? m_options.num_lines_context : 0,
379dda4f7b5SGreg Clayton                                            m_options.show_bytes,
380b3396b22SSean Callanan                                            m_options.raw,
381dda4f7b5SGreg Clayton                                            result.GetOutputStream()))
38230fdc8d8SChris Lattner             {
383dda4f7b5SGreg Clayton                 result.SetStatus (eReturnStatusSuccessFinishResult);
38430fdc8d8SChris Lattner             }
38530fdc8d8SChris Lattner             else
38630fdc8d8SChris Lattner             {
387dda4f7b5SGreg Clayton                 result.AppendErrorWithFormat ("Failed to disassemble memory at 0x%8.8llx.\n", m_options.m_start_addr);
38830fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
38930fdc8d8SChris Lattner             }
39030fdc8d8SChris Lattner         }
39137023b06SJim Ingham     }
39230fdc8d8SChris Lattner 
39330fdc8d8SChris Lattner     return result.Succeeded();
39430fdc8d8SChris Lattner }
395