130fdc8d8SChris Lattner //===-- CommandObjectFrame.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 "CommandObjectFrame.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/Debugger.h"
176d56d2ceSJim Ingham #include "lldb/Core/Module.h"
186d56d2ceSJim Ingham #include "lldb/Core/StreamFile.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Timer.h"
206d56d2ceSJim Ingham #include "lldb/Core/Value.h"
216d56d2ceSJim Ingham #include "lldb/Core/ValueObject.h"
226d56d2ceSJim Ingham #include "lldb/Core/ValueObjectVariable.h"
236d56d2ceSJim Ingham #include "lldb/Interpreter/Args.h"
2430fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
2530fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
266d56d2ceSJim Ingham #include "lldb/Interpreter/Options.h"
276d56d2ceSJim Ingham #include "lldb/Symbol/ClangASTType.h"
286d56d2ceSJim Ingham #include "lldb/Symbol/ClangASTContext.h"
296d56d2ceSJim Ingham #include "lldb/Symbol/ObjectFile.h"
306d56d2ceSJim Ingham #include "lldb/Symbol/SymbolContext.h"
316d56d2ceSJim Ingham #include "lldb/Symbol/Type.h"
326d56d2ceSJim Ingham #include "lldb/Symbol/Variable.h"
336d56d2ceSJim Ingham #include "lldb/Symbol/VariableList.h"
3430fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3530fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
3630fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
376d56d2ceSJim Ingham #include "lldb/Target/Target.h"
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner #include "CommandObjectThread.h"
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner using namespace lldb;
4230fdc8d8SChris Lattner using namespace lldb_private;
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner #pragma mark CommandObjectFrameInfo
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner //-------------------------------------------------------------------------
4730fdc8d8SChris Lattner // CommandObjectFrameInfo
4830fdc8d8SChris Lattner //-------------------------------------------------------------------------
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner class CommandObjectFrameInfo : public CommandObject
5130fdc8d8SChris Lattner {
5230fdc8d8SChris Lattner public:
5330fdc8d8SChris Lattner 
54*a7015092SGreg Clayton     CommandObjectFrameInfo (CommandInterpreter &interpreter) :
55*a7015092SGreg Clayton         CommandObject (interpreter,
56*a7015092SGreg Clayton                        "frame info",
57e3d26315SCaroline Tice                        "List information about the currently selected frame in the current thread.",
5830fdc8d8SChris Lattner                        "frame info",
5930fdc8d8SChris Lattner                        eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
6030fdc8d8SChris Lattner     {
6130fdc8d8SChris Lattner     }
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner     ~CommandObjectFrameInfo ()
6430fdc8d8SChris Lattner     {
6530fdc8d8SChris Lattner     }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner     bool
68*a7015092SGreg Clayton     Execute (Args& command,
6930fdc8d8SChris Lattner              CommandReturnObject &result)
7030fdc8d8SChris Lattner     {
71*a7015092SGreg Clayton         ExecutionContext exe_ctx(m_interpreter.GetDebugger().GetExecutionContext());
7230fdc8d8SChris Lattner         if (exe_ctx.frame)
7330fdc8d8SChris Lattner         {
746dadd508SGreg Clayton             exe_ctx.frame->Dump (&result.GetOutputStream(), true, false);
7530fdc8d8SChris Lattner             result.GetOutputStream().EOL();
7630fdc8d8SChris Lattner             result.SetStatus (eReturnStatusSuccessFinishResult);
7730fdc8d8SChris Lattner         }
7830fdc8d8SChris Lattner         else
7930fdc8d8SChris Lattner         {
8030fdc8d8SChris Lattner             result.AppendError ("no current frame");
8130fdc8d8SChris Lattner             result.SetStatus (eReturnStatusFailed);
8230fdc8d8SChris Lattner         }
8330fdc8d8SChris Lattner         return result.Succeeded();
8430fdc8d8SChris Lattner     }
8530fdc8d8SChris Lattner };
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner #pragma mark CommandObjectFrameSelect
8830fdc8d8SChris Lattner 
8930fdc8d8SChris Lattner //-------------------------------------------------------------------------
9030fdc8d8SChris Lattner // CommandObjectFrameSelect
9130fdc8d8SChris Lattner //-------------------------------------------------------------------------
9230fdc8d8SChris Lattner 
9330fdc8d8SChris Lattner class CommandObjectFrameSelect : public CommandObject
9430fdc8d8SChris Lattner {
9530fdc8d8SChris Lattner public:
9630fdc8d8SChris Lattner 
97*a7015092SGreg Clayton     CommandObjectFrameSelect (CommandInterpreter &interpreter) :
98*a7015092SGreg Clayton         CommandObject (interpreter,
99*a7015092SGreg Clayton                        "frame select",
100e3d26315SCaroline Tice                        "Select a frame by index from within the current thread and make it the current frame.",
10130fdc8d8SChris Lattner                        "frame select <frame-index>",
10230fdc8d8SChris Lattner                        eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
10330fdc8d8SChris Lattner     {
10430fdc8d8SChris Lattner     }
10530fdc8d8SChris Lattner 
10630fdc8d8SChris Lattner     ~CommandObjectFrameSelect ()
10730fdc8d8SChris Lattner     {
10830fdc8d8SChris Lattner     }
10930fdc8d8SChris Lattner 
11030fdc8d8SChris Lattner     bool
111*a7015092SGreg Clayton     Execute (Args& command,
11230fdc8d8SChris Lattner              CommandReturnObject &result)
11330fdc8d8SChris Lattner     {
114*a7015092SGreg Clayton         ExecutionContext exe_ctx (m_interpreter.GetDebugger().GetExecutionContext());
11530fdc8d8SChris Lattner         if (exe_ctx.thread)
11630fdc8d8SChris Lattner         {
11730fdc8d8SChris Lattner             if (command.GetArgumentCount() == 1)
11830fdc8d8SChris Lattner             {
11930fdc8d8SChris Lattner                 const char *frame_idx_cstr = command.GetArgumentAtIndex(0);
12030fdc8d8SChris Lattner 
12130fdc8d8SChris Lattner                 const uint32_t num_frames = exe_ctx.thread->GetStackFrameCount();
12230fdc8d8SChris Lattner                 const uint32_t frame_idx = Args::StringToUInt32 (frame_idx_cstr, UINT32_MAX, 0);
12330fdc8d8SChris Lattner                 if (frame_idx < num_frames)
12430fdc8d8SChris Lattner                 {
1252976d00aSJim Ingham                     exe_ctx.thread->SetSelectedFrameByIndex (frame_idx);
1262976d00aSJim Ingham                     exe_ctx.frame = exe_ctx.thread->GetSelectedFrame ().get();
12730fdc8d8SChris Lattner 
12830fdc8d8SChris Lattner                     if (exe_ctx.frame)
12930fdc8d8SChris Lattner                     {
130e40e4218SJim Ingham                         bool already_shown = false;
131e40e4218SJim Ingham                         SymbolContext frame_sc(exe_ctx.frame->GetSymbolContext(eSymbolContextLineEntry));
132*a7015092SGreg Clayton                         if (m_interpreter.GetDebugger().UseExternalEditor() && frame_sc.line_entry.file && frame_sc.line_entry.line != 0)
133e40e4218SJim Ingham                         {
134e40e4218SJim Ingham                             already_shown = Host::OpenFileInExternalEditor (frame_sc.line_entry.file, frame_sc.line_entry.line);
135e40e4218SJim Ingham                         }
136e40e4218SJim Ingham 
13730fdc8d8SChris Lattner                         if (DisplayFrameForExecutionContext (exe_ctx.thread,
13830fdc8d8SChris Lattner                                                              exe_ctx.frame,
139*a7015092SGreg Clayton                                                              m_interpreter,
14030fdc8d8SChris Lattner                                                              result.GetOutputStream(),
14130fdc8d8SChris Lattner                                                              true,
142e40e4218SJim Ingham                                                              !already_shown,
14330fdc8d8SChris Lattner                                                              3,
14430fdc8d8SChris Lattner                                                              3))
14530fdc8d8SChris Lattner                         {
14630fdc8d8SChris Lattner                             result.SetStatus (eReturnStatusSuccessFinishResult);
14730fdc8d8SChris Lattner                             return result.Succeeded();
14830fdc8d8SChris Lattner                         }
14930fdc8d8SChris Lattner                     }
15030fdc8d8SChris Lattner                 }
15130fdc8d8SChris Lattner                 if (frame_idx == UINT32_MAX)
15230fdc8d8SChris Lattner                     result.AppendErrorWithFormat ("Invalid frame index: %s.\n", frame_idx_cstr);
15330fdc8d8SChris Lattner                 else
15430fdc8d8SChris Lattner                     result.AppendErrorWithFormat ("Frame index (%u) out of range.\n", frame_idx);
15530fdc8d8SChris Lattner             }
15630fdc8d8SChris Lattner             else
15730fdc8d8SChris Lattner             {
15830fdc8d8SChris Lattner                 result.AppendError ("invalid arguments");
15930fdc8d8SChris Lattner                 result.AppendErrorWithFormat ("Usage: %s\n", m_cmd_syntax.c_str());
16030fdc8d8SChris Lattner             }
16130fdc8d8SChris Lattner         }
16230fdc8d8SChris Lattner         else
16330fdc8d8SChris Lattner         {
16430fdc8d8SChris Lattner             result.AppendError ("no current thread");
16530fdc8d8SChris Lattner         }
16630fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
16730fdc8d8SChris Lattner         return false;
16830fdc8d8SChris Lattner     }
16930fdc8d8SChris Lattner };
17030fdc8d8SChris Lattner 
1716d56d2ceSJim Ingham #pragma mark CommandObjectFrameVariable
1726d56d2ceSJim Ingham //----------------------------------------------------------------------
1736d56d2ceSJim Ingham // List images with associated information
1746d56d2ceSJim Ingham //----------------------------------------------------------------------
1756d56d2ceSJim Ingham class CommandObjectFrameVariable : public CommandObject
1766d56d2ceSJim Ingham {
1776d56d2ceSJim Ingham public:
1786d56d2ceSJim Ingham 
1796d56d2ceSJim Ingham     class CommandOptions : public Options
1806d56d2ceSJim Ingham     {
1816d56d2ceSJim Ingham     public:
1826d56d2ceSJim Ingham 
1836d56d2ceSJim Ingham         CommandOptions () :
1846d56d2ceSJim Ingham             Options()
1856d56d2ceSJim Ingham         {
1866d56d2ceSJim Ingham             ResetOptionValues ();
1876d56d2ceSJim Ingham         }
1886d56d2ceSJim Ingham 
1896d56d2ceSJim Ingham         virtual
1906d56d2ceSJim Ingham         ~CommandOptions ()
1916d56d2ceSJim Ingham         {
1926d56d2ceSJim Ingham         }
1936d56d2ceSJim Ingham 
1946d56d2ceSJim Ingham         virtual Error
1956d56d2ceSJim Ingham         SetOptionValue (int option_idx, const char *option_arg)
1966d56d2ceSJim Ingham         {
1976d56d2ceSJim Ingham             Error error;
1986d56d2ceSJim Ingham             bool success;
1996d56d2ceSJim Ingham             char short_option = (char) m_getopt_table[option_idx].val;
2006d56d2ceSJim Ingham             switch (short_option)
2016d56d2ceSJim Ingham             {
2026d56d2ceSJim Ingham             case 'o':   use_objc     = true;  break;
2036d56d2ceSJim Ingham             case 'n':   name = option_arg;    break;
2046d56d2ceSJim Ingham             case 'r':   use_regex    = true;  break;
2056d56d2ceSJim Ingham             case 'a':   show_args    = false; break;
2066d56d2ceSJim Ingham             case 'l':   show_locals  = false; break;
207a134cc1bSGreg Clayton             case 'g':   show_globals = true;  break;
2086d56d2ceSJim Ingham             case 't':   show_types   = false; break;
2096d56d2ceSJim Ingham             case 'y':   show_summary = false; break;
2106d56d2ceSJim Ingham             case 'L':   show_location= true;  break;
211a134cc1bSGreg Clayton             case 'c':   show_decl    = true;  break;
2126d56d2ceSJim Ingham             case 'D':   debug        = true;  break;
2136d56d2ceSJim Ingham             case 'd':
2146d56d2ceSJim Ingham                 max_depth = Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success);
2156d56d2ceSJim Ingham                 if (!success)
2166d56d2ceSJim Ingham                     error.SetErrorStringWithFormat("Invalid max depth '%s'.\n", option_arg);
2176d56d2ceSJim Ingham                 break;
2186d56d2ceSJim Ingham 
2196d56d2ceSJim Ingham             case 'p':
2206d56d2ceSJim Ingham                 ptr_depth = Args::StringToUInt32 (option_arg, 0, 0, &success);
2216d56d2ceSJim Ingham                 if (!success)
2226d56d2ceSJim Ingham                     error.SetErrorStringWithFormat("Invalid pointer depth '%s'.\n", option_arg);
2236d56d2ceSJim Ingham                 break;
2246d56d2ceSJim Ingham 
2256d56d2ceSJim Ingham             case 'G':
226a134cc1bSGreg Clayton                 globals.push_back(ConstString (option_arg));
2276d56d2ceSJim Ingham                 break;
2286d56d2ceSJim Ingham 
2296d56d2ceSJim Ingham             case 's':
2306d56d2ceSJim Ingham                 show_scope = true;
2316d56d2ceSJim Ingham                 break;
2326d56d2ceSJim Ingham 
2336d56d2ceSJim Ingham             default:
2346d56d2ceSJim Ingham                 error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option);
2356d56d2ceSJim Ingham                 break;
2366d56d2ceSJim Ingham             }
2376d56d2ceSJim Ingham 
2386d56d2ceSJim Ingham             return error;
2396d56d2ceSJim Ingham         }
2406d56d2ceSJim Ingham 
2416d56d2ceSJim Ingham         void
2426d56d2ceSJim Ingham         ResetOptionValues ()
2436d56d2ceSJim Ingham         {
2446d56d2ceSJim Ingham             Options::ResetOptionValues();
2456d56d2ceSJim Ingham 
2466d56d2ceSJim Ingham             name.clear();
2476d56d2ceSJim Ingham             use_objc      = false;
2486d56d2ceSJim Ingham             use_regex     = false;
2496d56d2ceSJim Ingham             show_args     = true;
2506d56d2ceSJim Ingham             show_locals   = true;
251a134cc1bSGreg Clayton             show_globals  = false;
2526d56d2ceSJim Ingham             show_types    = true;
2536d56d2ceSJim Ingham             show_scope    = false;
2546d56d2ceSJim Ingham             show_summary  = true;
2556d56d2ceSJim Ingham             show_location = false;
256a134cc1bSGreg Clayton             show_decl     = false;
2576d56d2ceSJim Ingham             debug         = false;
2586d56d2ceSJim Ingham             max_depth     = UINT32_MAX;
2596d56d2ceSJim Ingham             ptr_depth     = 0;
2606d56d2ceSJim Ingham             globals.clear();
2616d56d2ceSJim Ingham         }
2626d56d2ceSJim Ingham 
2636d56d2ceSJim Ingham         const lldb::OptionDefinition*
2646d56d2ceSJim Ingham         GetDefinitions ()
2656d56d2ceSJim Ingham         {
2666d56d2ceSJim Ingham             return g_option_table;
2676d56d2ceSJim Ingham         }
2686d56d2ceSJim Ingham 
2696d56d2ceSJim Ingham         // Options table: Required for subclasses of Options.
2706d56d2ceSJim Ingham 
2716d56d2ceSJim Ingham         static lldb::OptionDefinition g_option_table[];
2726d56d2ceSJim Ingham         std::string name;
273a134cc1bSGreg Clayton         bool use_objc:1,
274a134cc1bSGreg Clayton              use_regex:1,
275a134cc1bSGreg Clayton              show_args:1,
276a134cc1bSGreg Clayton              show_locals:1,
277a134cc1bSGreg Clayton              show_globals:1,
278a134cc1bSGreg Clayton              show_types:1,
279a134cc1bSGreg Clayton              show_scope:1,
280a134cc1bSGreg Clayton              show_summary:1,
281a134cc1bSGreg Clayton              show_location:1,
282a134cc1bSGreg Clayton              show_decl:1,
283a134cc1bSGreg Clayton              debug:1;
2846d56d2ceSJim Ingham         uint32_t max_depth; // The depth to print when dumping concrete (not pointers) aggreate values
2856d56d2ceSJim Ingham         uint32_t ptr_depth; // The default depth that is dumped when we find pointers
2866d56d2ceSJim Ingham         std::vector<ConstString> globals;
2876d56d2ceSJim Ingham         // Instance variables to hold the values for command options.
2886d56d2ceSJim Ingham     };
2896d56d2ceSJim Ingham 
290*a7015092SGreg Clayton     CommandObjectFrameVariable (CommandInterpreter &interpreter) :
291*a7015092SGreg Clayton         CommandObject (interpreter,
2926d56d2ceSJim Ingham                        "frame variable",
2936d56d2ceSJim Ingham                        "Show specified argument, local variable, static variable or global variable for the current frame.  If none specified, list them all.",
2946d56d2ceSJim Ingham                        "frame variable [<cmd-options>] [<var-name1> [<var-name2>...]]")
2956d56d2ceSJim Ingham     {
2966d56d2ceSJim Ingham     }
2976d56d2ceSJim Ingham 
2986d56d2ceSJim Ingham     virtual
2996d56d2ceSJim Ingham     ~CommandObjectFrameVariable ()
3006d56d2ceSJim Ingham     {
3016d56d2ceSJim Ingham     }
3026d56d2ceSJim Ingham 
3036d56d2ceSJim Ingham     virtual
3046d56d2ceSJim Ingham     Options *
3056d56d2ceSJim Ingham     GetOptions ()
3066d56d2ceSJim Ingham     {
3076d56d2ceSJim Ingham         return &m_options;
3086d56d2ceSJim Ingham     }
3096d56d2ceSJim Ingham 
3106d56d2ceSJim Ingham     void
3116d56d2ceSJim Ingham     DumpValueObject (CommandReturnObject &result,
3126d56d2ceSJim Ingham                      ExecutionContextScope *exe_scope,
3136d56d2ceSJim Ingham                      ValueObject *valobj,
3146d56d2ceSJim Ingham                      const char *root_valobj_name,
3156d56d2ceSJim Ingham                      uint32_t ptr_depth,
3166d56d2ceSJim Ingham                      uint32_t curr_depth,
3176d56d2ceSJim Ingham                      uint32_t max_depth,
3186f00abd5SGreg Clayton                      bool use_objc,
3196f00abd5SGreg Clayton                      bool scope_already_checked)
3206d56d2ceSJim Ingham     {
3216d56d2ceSJim Ingham         if (valobj)
3226d56d2ceSJim Ingham         {
3236d56d2ceSJim Ingham             Stream &s = result.GetOutputStream();
3246d56d2ceSJim Ingham 
3256d56d2ceSJim Ingham             //const char *loc_cstr = valobj->GetLocationAsCString();
3266d56d2ceSJim Ingham             if (m_options.show_location)
3276d56d2ceSJim Ingham             {
3286d56d2ceSJim Ingham                 s.Printf("@ %s: ", valobj->GetLocationAsCString(exe_scope));
3296d56d2ceSJim Ingham             }
3306d56d2ceSJim Ingham             if (m_options.debug)
3316d56d2ceSJim Ingham                 s.Printf ("%p ValueObject{%u} ", valobj, valobj->GetID());
3326d56d2ceSJim Ingham 
3336d56d2ceSJim Ingham             s.Indent();
3346d56d2ceSJim Ingham 
3356d56d2ceSJim Ingham             if (m_options.show_types)
3366d56d2ceSJim Ingham                 s.Printf("(%s) ", valobj->GetTypeName().AsCString());
3376d56d2ceSJim Ingham 
3386d56d2ceSJim Ingham             const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
3396d56d2ceSJim Ingham             s.Printf ("%s = ", name_cstr);
3406d56d2ceSJim Ingham 
3416f00abd5SGreg Clayton             if (!scope_already_checked && !valobj->IsInScope(exe_scope->CalculateStackFrame()))
3426f00abd5SGreg Clayton             {
3436f00abd5SGreg Clayton                 s.PutCString("error: out of scope");
3446f00abd5SGreg Clayton                 return;
3456f00abd5SGreg Clayton             }
3466f00abd5SGreg Clayton 
3476d56d2ceSJim Ingham             const char *val_cstr = valobj->GetValueAsCString(exe_scope);
3486d56d2ceSJim Ingham             const char *err_cstr = valobj->GetError().AsCString();
3496d56d2ceSJim Ingham 
3506d56d2ceSJim Ingham             if (err_cstr)
3516d56d2ceSJim Ingham             {
3526f00abd5SGreg Clayton                 s.Printf ("error: %s", err_cstr);
3536d56d2ceSJim Ingham             }
3546d56d2ceSJim Ingham             else
3556d56d2ceSJim Ingham             {
3566d56d2ceSJim Ingham                 const char *sum_cstr = valobj->GetSummaryAsCString(exe_scope);
3576d56d2ceSJim Ingham 
3586d56d2ceSJim Ingham                 const bool is_aggregate = ClangASTContext::IsAggregateType (valobj->GetOpaqueClangQualType());
3596d56d2ceSJim Ingham 
3606d56d2ceSJim Ingham                 if (val_cstr)
3616d56d2ceSJim Ingham                     s.PutCString(val_cstr);
3626d56d2ceSJim Ingham 
3636d56d2ceSJim Ingham                 if (sum_cstr)
3646d56d2ceSJim Ingham                     s.Printf(" %s", sum_cstr);
3656d56d2ceSJim Ingham 
3666d56d2ceSJim Ingham                 if (use_objc)
3676d56d2ceSJim Ingham                 {
36853c47f1eSJim Ingham                     const char *object_desc = valobj->GetObjectDescription(exe_scope);
36953c47f1eSJim Ingham                     if (object_desc)
37053c47f1eSJim Ingham                         s.Printf("\n%s\n", object_desc);
37153c47f1eSJim Ingham                     else
37253c47f1eSJim Ingham                         s.Printf ("No description available.\n");
3736d56d2ceSJim Ingham                     return;
3746d56d2ceSJim Ingham                 }
3756d56d2ceSJim Ingham 
3766d56d2ceSJim Ingham 
3776d56d2ceSJim Ingham                 if (curr_depth < max_depth)
3786d56d2ceSJim Ingham                 {
3796d56d2ceSJim Ingham                     if (is_aggregate)
3806d56d2ceSJim Ingham                         s.PutChar('{');
3816d56d2ceSJim Ingham 
3826d56d2ceSJim Ingham                     bool is_ptr_or_ref = ClangASTContext::IsPointerOrReferenceType (valobj->GetOpaqueClangQualType());
3836d56d2ceSJim Ingham 
3846d56d2ceSJim Ingham                     if (is_ptr_or_ref && ptr_depth == 0)
3856d56d2ceSJim Ingham                         return;
3866d56d2ceSJim Ingham 
3876d56d2ceSJim Ingham                     const uint32_t num_children = valobj->GetNumChildren();
3886d56d2ceSJim Ingham                     if (num_children)
3896d56d2ceSJim Ingham                     {
3906d56d2ceSJim Ingham                         s.IndentMore();
3916d56d2ceSJim Ingham                         for (uint32_t idx=0; idx<num_children; ++idx)
3926d56d2ceSJim Ingham                         {
3936d56d2ceSJim Ingham                             ValueObjectSP child_sp(valobj->GetChildAtIndex(idx, true));
3946d56d2ceSJim Ingham                             if (child_sp.get())
3956d56d2ceSJim Ingham                             {
3966d56d2ceSJim Ingham                                 s.EOL();
3976d56d2ceSJim Ingham                                 DumpValueObject (result,
3986d56d2ceSJim Ingham                                                  exe_scope,
3996d56d2ceSJim Ingham                                                  child_sp.get(),
4006d56d2ceSJim Ingham                                                  NULL,
4016d56d2ceSJim Ingham                                                  is_ptr_or_ref ? ptr_depth - 1 : ptr_depth,
4026d56d2ceSJim Ingham                                                  curr_depth + 1,
4036d56d2ceSJim Ingham                                                  max_depth,
4046f00abd5SGreg Clayton                                                  false,
4056f00abd5SGreg Clayton                                                  true);
4066d56d2ceSJim Ingham                                 if (idx + 1 < num_children)
4076d56d2ceSJim Ingham                                     s.PutChar(',');
4086d56d2ceSJim Ingham                             }
4096d56d2ceSJim Ingham                         }
4106d56d2ceSJim Ingham                         s.IndentLess();
4116d56d2ceSJim Ingham                     }
4126d56d2ceSJim Ingham                     if (is_aggregate)
4136d56d2ceSJim Ingham                     {
4146d56d2ceSJim Ingham                         s.EOL();
4156d56d2ceSJim Ingham                         s.Indent("}");
4166d56d2ceSJim Ingham                     }
4176d56d2ceSJim Ingham                 }
4186d56d2ceSJim Ingham                 else
4196d56d2ceSJim Ingham                 {
4206d56d2ceSJim Ingham                     if (is_aggregate)
4216d56d2ceSJim Ingham                     {
4226d56d2ceSJim Ingham                         s.PutCString("{...}");
4236d56d2ceSJim Ingham                     }
4246d56d2ceSJim Ingham                 }
4256d56d2ceSJim Ingham 
4266d56d2ceSJim Ingham             }
4276d56d2ceSJim Ingham         }
4286d56d2ceSJim Ingham     }
4296d56d2ceSJim Ingham 
4306d56d2ceSJim Ingham     virtual bool
4316d56d2ceSJim Ingham     Execute
4326d56d2ceSJim Ingham     (
4336d56d2ceSJim Ingham         Args& command,
4346d56d2ceSJim Ingham         CommandReturnObject &result
4356d56d2ceSJim Ingham     )
4366d56d2ceSJim Ingham     {
437*a7015092SGreg Clayton         ExecutionContext exe_ctx(m_interpreter.GetDebugger().GetExecutionContext());
4386d56d2ceSJim Ingham         if (exe_ctx.frame == NULL)
4396d56d2ceSJim Ingham         {
4406d56d2ceSJim Ingham             result.AppendError ("invalid frame");
4416d56d2ceSJim Ingham             result.SetStatus (eReturnStatusFailed);
4426d56d2ceSJim Ingham             return false;
4436d56d2ceSJim Ingham         }
4446d56d2ceSJim Ingham         else
4456d56d2ceSJim Ingham         {
446a134cc1bSGreg Clayton             Stream &s = result.GetOutputStream();
4476d56d2ceSJim Ingham 
448a134cc1bSGreg Clayton             bool get_file_globals = true;
449a134cc1bSGreg Clayton             VariableList *variable_list = exe_ctx.frame->GetVariableList (get_file_globals);
450a134cc1bSGreg Clayton 
4516d56d2ceSJim Ingham             VariableSP var_sp;
4526d56d2ceSJim Ingham             ValueObjectSP valobj_sp;
4536d56d2ceSJim Ingham             //ValueObjectList &valobj_list = exe_ctx.frame->GetValueObjectList();
4546d56d2ceSJim Ingham             const char *name_cstr = NULL;
4556d56d2ceSJim Ingham             size_t idx;
4566d56d2ceSJim Ingham             if (!m_options.globals.empty())
4576d56d2ceSJim Ingham             {
4586d56d2ceSJim Ingham                 uint32_t fail_count = 0;
4596d56d2ceSJim Ingham                 if (exe_ctx.target)
4606d56d2ceSJim Ingham                 {
4616d56d2ceSJim Ingham                     const size_t num_globals = m_options.globals.size();
4626d56d2ceSJim Ingham                     for (idx = 0; idx < num_globals; ++idx)
4636d56d2ceSJim Ingham                     {
4646d56d2ceSJim Ingham                         VariableList global_var_list;
4656d56d2ceSJim Ingham                         const uint32_t num_matching_globals = exe_ctx.target->GetImages().FindGlobalVariables (m_options.globals[idx], true, UINT32_MAX, global_var_list);
4666d56d2ceSJim Ingham 
4676d56d2ceSJim Ingham                         if (num_matching_globals == 0)
4686d56d2ceSJim Ingham                         {
4696d56d2ceSJim Ingham                             ++fail_count;
4706d56d2ceSJim Ingham                             result.GetErrorStream().Printf ("error: can't find global variable '%s'\n", m_options.globals[idx].AsCString());
4716d56d2ceSJim Ingham                         }
4726d56d2ceSJim Ingham                         else
4736d56d2ceSJim Ingham                         {
4746d56d2ceSJim Ingham                             for (uint32_t global_idx=0; global_idx<num_matching_globals; ++global_idx)
4756d56d2ceSJim Ingham                             {
4766d56d2ceSJim Ingham                                 var_sp = global_var_list.GetVariableAtIndex(global_idx);
4776d56d2ceSJim Ingham                                 if (var_sp)
4786d56d2ceSJim Ingham                                 {
479288bdf9cSGreg Clayton                                     valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp);
4806d56d2ceSJim Ingham                                     if (!valobj_sp)
481288bdf9cSGreg Clayton                                         valobj_sp = exe_ctx.frame->TrackGlobalVariable (var_sp);
4826d56d2ceSJim Ingham 
4836d56d2ceSJim Ingham                                     if (valobj_sp)
4846d56d2ceSJim Ingham                                     {
485a134cc1bSGreg Clayton                                         if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
486a134cc1bSGreg Clayton                                         {
4876f00abd5SGreg Clayton                                             var_sp->GetDeclaration ().DumpStopContext (&s, false);
4886f00abd5SGreg Clayton                                             s.PutCString (": ");
489a134cc1bSGreg Clayton                                         }
490a134cc1bSGreg Clayton 
4916f00abd5SGreg Clayton                                         DumpValueObject (result,
4926f00abd5SGreg Clayton                                                          exe_ctx.frame,
4936f00abd5SGreg Clayton                                                          valobj_sp.get(),
4946f00abd5SGreg Clayton                                                          name_cstr,
4956f00abd5SGreg Clayton                                                          m_options.ptr_depth,
4966f00abd5SGreg Clayton                                                          0,
4976f00abd5SGreg Clayton                                                          m_options.max_depth,
4986f00abd5SGreg Clayton                                                          m_options.use_objc,
4996f00abd5SGreg Clayton                                                          false);
5006f00abd5SGreg Clayton 
501a134cc1bSGreg Clayton                                         s.EOL();
5026d56d2ceSJim Ingham                                     }
5036d56d2ceSJim Ingham                                 }
5046d56d2ceSJim Ingham                             }
5056d56d2ceSJim Ingham                         }
5066d56d2ceSJim Ingham                     }
5076d56d2ceSJim Ingham                 }
5086d56d2ceSJim Ingham                 if (fail_count)
5096d56d2ceSJim Ingham                     result.SetStatus (eReturnStatusFailed);
5106d56d2ceSJim Ingham             }
5119df87c17SGreg Clayton             else if (variable_list)
5129df87c17SGreg Clayton             {
5139df87c17SGreg Clayton                 if (command.GetArgumentCount() > 0)
5146d56d2ceSJim Ingham                 {
5156d56d2ceSJim Ingham                     // If we have any args to the variable command, we will make
5166d56d2ceSJim Ingham                     // variable objects from them...
5176d56d2ceSJim Ingham                     for (idx = 0; (name_cstr = command.GetArgumentAtIndex(idx)) != NULL; ++idx)
5186d56d2ceSJim Ingham                     {
5196d56d2ceSJim Ingham                         uint32_t ptr_depth = m_options.ptr_depth;
5206d56d2ceSJim Ingham                         // If first character is a '*', then show pointer contents
5216d56d2ceSJim Ingham                         if (name_cstr[0] == '*')
5226d56d2ceSJim Ingham                         {
5236d56d2ceSJim Ingham                             ++ptr_depth;
5246d56d2ceSJim Ingham                             name_cstr++; // Skip the '*'
5256d56d2ceSJim Ingham                         }
5266d56d2ceSJim Ingham 
5276d56d2ceSJim Ingham                         std::string var_path (name_cstr);
5286d56d2ceSJim Ingham                         size_t separator_idx = var_path.find_first_of(".-[");
5296d56d2ceSJim Ingham 
5306d56d2ceSJim Ingham                         ConstString name_const_string;
5316d56d2ceSJim Ingham                         if (separator_idx == std::string::npos)
5326d56d2ceSJim Ingham                             name_const_string.SetCString (var_path.c_str());
5336d56d2ceSJim Ingham                         else
5346d56d2ceSJim Ingham                             name_const_string.SetCStringWithLength (var_path.c_str(), separator_idx);
5356d56d2ceSJim Ingham 
536a134cc1bSGreg Clayton                         var_sp = variable_list->FindVariable(name_const_string);
5376d56d2ceSJim Ingham                         if (var_sp)
5386d56d2ceSJim Ingham                         {
539288bdf9cSGreg Clayton                             valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp);
5406d56d2ceSJim Ingham 
5416d56d2ceSJim Ingham                             var_path.erase (0, name_const_string.GetLength ());
5426d56d2ceSJim Ingham                             // We are dumping at least one child
5436d56d2ceSJim Ingham                             while (separator_idx != std::string::npos)
5446d56d2ceSJim Ingham                             {
5456d56d2ceSJim Ingham                                 // Calculate the next separator index ahead of time
5466d56d2ceSJim Ingham                                 ValueObjectSP child_valobj_sp;
5476d56d2ceSJim Ingham                                 const char separator_type = var_path[0];
5486d56d2ceSJim Ingham                                 switch (separator_type)
5496d56d2ceSJim Ingham                                 {
5506d56d2ceSJim Ingham 
5516d56d2ceSJim Ingham                                 case '-':
5526d56d2ceSJim Ingham                                     if (var_path.size() >= 2 && var_path[1] != '>')
5536d56d2ceSJim Ingham                                     {
5546d56d2ceSJim Ingham                                         result.GetErrorStream().Printf ("error: invalid character in variable path starting at '%s'\n",
5556d56d2ceSJim Ingham                                                                         var_path.c_str());
5566d56d2ceSJim Ingham                                         var_path.clear();
5576d56d2ceSJim Ingham                                         valobj_sp.reset();
5586d56d2ceSJim Ingham                                         break;
5596d56d2ceSJim Ingham                                     }
5606d56d2ceSJim Ingham                                     var_path.erase (0, 1); // Remove the '-'
5616d56d2ceSJim Ingham                                     // Fall through
5626d56d2ceSJim Ingham                                 case '.':
5636d56d2ceSJim Ingham                                     {
5646d56d2ceSJim Ingham                                         var_path.erase (0, 1); // Remove the '.' or '>'
5656d56d2ceSJim Ingham                                         separator_idx = var_path.find_first_of(".-[");
5666d56d2ceSJim Ingham                                         ConstString child_name;
5676d56d2ceSJim Ingham                                         if (separator_idx == std::string::npos)
5686d56d2ceSJim Ingham                                             child_name.SetCString (var_path.c_str());
5696d56d2ceSJim Ingham                                         else
5706d56d2ceSJim Ingham                                             child_name.SetCStringWithLength(var_path.c_str(), separator_idx);
5716d56d2ceSJim Ingham 
5726d56d2ceSJim Ingham                                         child_valobj_sp = valobj_sp->GetChildMemberWithName (child_name, true);
5736d56d2ceSJim Ingham                                         if (!child_valobj_sp)
5746d56d2ceSJim Ingham                                         {
5756d56d2ceSJim Ingham                                             result.GetErrorStream().Printf ("error: can't find child of '%s' named '%s'\n",
5766d56d2ceSJim Ingham                                                                             valobj_sp->GetName().AsCString(),
5776d56d2ceSJim Ingham                                                                             child_name.GetCString());
5786d56d2ceSJim Ingham                                             var_path.clear();
5796d56d2ceSJim Ingham                                             valobj_sp.reset();
5806d56d2ceSJim Ingham                                             break;
5816d56d2ceSJim Ingham                                         }
5826d56d2ceSJim Ingham                                         // Remove the child name from the path
5836d56d2ceSJim Ingham                                         var_path.erase(0, child_name.GetLength());
5846d56d2ceSJim Ingham                                     }
5856d56d2ceSJim Ingham                                     break;
5866d56d2ceSJim Ingham 
5876d56d2ceSJim Ingham                                 case '[':
5886d56d2ceSJim Ingham                                     // Array member access, or treating pointer as an array
5896d56d2ceSJim Ingham                                     if (var_path.size() > 2) // Need at least two brackets and a number
5906d56d2ceSJim Ingham                                     {
5916d56d2ceSJim Ingham                                         char *end = NULL;
5926d56d2ceSJim Ingham                                         int32_t child_index = ::strtol (&var_path[1], &end, 0);
5936d56d2ceSJim Ingham                                         if (end && *end == ']')
5946d56d2ceSJim Ingham                                         {
5956d56d2ceSJim Ingham 
5966d56d2ceSJim Ingham                                             if (valobj_sp->IsPointerType ())
5976d56d2ceSJim Ingham                                             {
5986d56d2ceSJim Ingham                                                 child_valobj_sp = valobj_sp->GetSyntheticArrayMemberFromPointer (child_index, true);
5996d56d2ceSJim Ingham                                             }
6006d56d2ceSJim Ingham                                             else
6016d56d2ceSJim Ingham                                             {
6026d56d2ceSJim Ingham                                                 child_valobj_sp = valobj_sp->GetChildAtIndex (child_index, true);
6036d56d2ceSJim Ingham                                             }
6046d56d2ceSJim Ingham 
6056d56d2ceSJim Ingham                                             if (!child_valobj_sp)
6066d56d2ceSJim Ingham                                             {
6076d56d2ceSJim Ingham                                                 result.GetErrorStream().Printf ("error: invalid array index %u in '%s'\n",
6086d56d2ceSJim Ingham                                                                                 child_index,
6096d56d2ceSJim Ingham                                                                                 valobj_sp->GetName().AsCString());
6106d56d2ceSJim Ingham                                                 var_path.clear();
6116d56d2ceSJim Ingham                                                 valobj_sp.reset();
6126d56d2ceSJim Ingham                                                 break;
6136d56d2ceSJim Ingham                                             }
6146d56d2ceSJim Ingham 
6156d56d2ceSJim Ingham                                             // Erase the array member specification '[%i]' where %i is the array index
6166d56d2ceSJim Ingham                                             var_path.erase(0, (end - var_path.c_str()) + 1);
6176d56d2ceSJim Ingham                                             separator_idx = var_path.find_first_of(".-[");
6186d56d2ceSJim Ingham 
6196d56d2ceSJim Ingham                                             // Break out early from the switch since we were able to find the child member
6206d56d2ceSJim Ingham                                             break;
6216d56d2ceSJim Ingham                                         }
6226d56d2ceSJim Ingham                                     }
6236d56d2ceSJim Ingham                                     result.GetErrorStream().Printf ("error: invalid array member specification for '%s' starting at '%s'\n",
6246d56d2ceSJim Ingham                                                                     valobj_sp->GetName().AsCString(),
6256d56d2ceSJim Ingham                                                                     var_path.c_str());
6266d56d2ceSJim Ingham                                     var_path.clear();
6276d56d2ceSJim Ingham                                     valobj_sp.reset();
6286d56d2ceSJim Ingham                                     break;
6296d56d2ceSJim Ingham 
6306d56d2ceSJim Ingham                                     break;
6316d56d2ceSJim Ingham 
6326d56d2ceSJim Ingham                                 default:
6336d56d2ceSJim Ingham                                     result.GetErrorStream().Printf ("error: invalid character in variable path starting at '%s'\n",
6346d56d2ceSJim Ingham                                                                         var_path.c_str());
6356d56d2ceSJim Ingham                                     var_path.clear();
6366d56d2ceSJim Ingham                                     valobj_sp.reset();
6376d56d2ceSJim Ingham                                     separator_idx = std::string::npos;
6386d56d2ceSJim Ingham                                     break;
6396d56d2ceSJim Ingham                                 }
6406d56d2ceSJim Ingham 
6416d56d2ceSJim Ingham                                 if (child_valobj_sp)
6426d56d2ceSJim Ingham                                     valobj_sp = child_valobj_sp;
6436d56d2ceSJim Ingham 
6446d56d2ceSJim Ingham                                 if (var_path.empty())
6456d56d2ceSJim Ingham                                     break;
6466d56d2ceSJim Ingham 
6476d56d2ceSJim Ingham                             }
6486d56d2ceSJim Ingham 
6496d56d2ceSJim Ingham                             if (valobj_sp)
6506d56d2ceSJim Ingham                             {
651a134cc1bSGreg Clayton                                 if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
652a134cc1bSGreg Clayton                                 {
653a134cc1bSGreg Clayton                                     var_sp->GetDeclaration ().DumpStopContext (&s, false);
654a134cc1bSGreg Clayton                                     s.PutCString (": ");
655a134cc1bSGreg Clayton                                 }
656a134cc1bSGreg Clayton 
657a134cc1bSGreg Clayton                                 DumpValueObject (result,
658a134cc1bSGreg Clayton                                                  exe_ctx.frame,
659a134cc1bSGreg Clayton                                                  valobj_sp.get(),
660a134cc1bSGreg Clayton                                                  name_cstr,
661a134cc1bSGreg Clayton                                                  ptr_depth,
662a134cc1bSGreg Clayton                                                  0,
663a134cc1bSGreg Clayton                                                  m_options.max_depth,
6646f00abd5SGreg Clayton                                                  m_options.use_objc,
6656f00abd5SGreg Clayton                                                  false);
666a134cc1bSGreg Clayton 
667a134cc1bSGreg Clayton                                 s.EOL();
6686d56d2ceSJim Ingham                             }
6696d56d2ceSJim Ingham                         }
6706d56d2ceSJim Ingham                         else
6716d56d2ceSJim Ingham                         {
6726d56d2ceSJim Ingham                             result.GetErrorStream().Printf ("error: unable to find any variables named '%s'\n", name_cstr);
6736d56d2ceSJim Ingham                             var_path.clear();
6746d56d2ceSJim Ingham                         }
6756d56d2ceSJim Ingham                     }
6766d56d2ceSJim Ingham                 }
6776d56d2ceSJim Ingham                 else
6786d56d2ceSJim Ingham                 {
679a134cc1bSGreg Clayton                     const uint32_t num_variables = variable_list->GetSize();
6806d56d2ceSJim Ingham 
6816d56d2ceSJim Ingham                     if (num_variables > 0)
6826d56d2ceSJim Ingham                     {
6836d56d2ceSJim Ingham                         for (uint32_t i=0; i<num_variables; i++)
6846d56d2ceSJim Ingham                         {
685a134cc1bSGreg Clayton                             VariableSP var_sp (variable_list->GetVariableAtIndex(i));
6866d56d2ceSJim Ingham                             bool dump_variable = true;
6876d56d2ceSJim Ingham 
688a134cc1bSGreg Clayton                             switch (var_sp->GetScope())
6896d56d2ceSJim Ingham                             {
6906d56d2ceSJim Ingham                             case eValueTypeVariableGlobal:
6916d56d2ceSJim Ingham                                 dump_variable = m_options.show_globals;
6926d56d2ceSJim Ingham                                 if (dump_variable && m_options.show_scope)
693a134cc1bSGreg Clayton                                     s.PutCString("GLOBAL: ");
6946d56d2ceSJim Ingham                                 break;
6956d56d2ceSJim Ingham 
6966d56d2ceSJim Ingham                             case eValueTypeVariableStatic:
6976d56d2ceSJim Ingham                                 dump_variable = m_options.show_globals;
6986d56d2ceSJim Ingham                                 if (dump_variable && m_options.show_scope)
699a134cc1bSGreg Clayton                                     s.PutCString("STATIC: ");
7006d56d2ceSJim Ingham                                 break;
7016d56d2ceSJim Ingham 
7026d56d2ceSJim Ingham                             case eValueTypeVariableArgument:
7036d56d2ceSJim Ingham                                 dump_variable = m_options.show_args;
7046d56d2ceSJim Ingham                                 if (dump_variable && m_options.show_scope)
705a134cc1bSGreg Clayton                                     s.PutCString("   ARG: ");
7066d56d2ceSJim Ingham                                 break;
7076d56d2ceSJim Ingham 
7086d56d2ceSJim Ingham                             case eValueTypeVariableLocal:
7096d56d2ceSJim Ingham                                 dump_variable = m_options.show_locals;
7106d56d2ceSJim Ingham                                 if (dump_variable && m_options.show_scope)
711a134cc1bSGreg Clayton                                     s.PutCString(" LOCAL: ");
7126d56d2ceSJim Ingham                                 break;
7136d56d2ceSJim Ingham 
7146d56d2ceSJim Ingham                             default:
7156d56d2ceSJim Ingham                                 break;
7166d56d2ceSJim Ingham                             }
7176d56d2ceSJim Ingham 
7186d56d2ceSJim Ingham                             if (dump_variable)
719a134cc1bSGreg Clayton                             {
720a134cc1bSGreg Clayton 
721a134cc1bSGreg Clayton                                 // Use the variable object code to make sure we are
722a134cc1bSGreg Clayton                                 // using the same APIs as the the public API will be
723a134cc1bSGreg Clayton                                 // using...
724a134cc1bSGreg Clayton                                 valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp);
725a134cc1bSGreg Clayton                                 if (valobj_sp)
726a134cc1bSGreg Clayton                                 {
7276f00abd5SGreg Clayton                                     // When dumping all variables, don't print any variables
7286f00abd5SGreg Clayton                                     // that are not in scope to avoid extra unneeded output
7296f00abd5SGreg Clayton                                     if (valobj_sp->IsInScope (exe_ctx.frame))
7306f00abd5SGreg Clayton                                     {
731a134cc1bSGreg Clayton                                         if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
732a134cc1bSGreg Clayton                                         {
733a134cc1bSGreg Clayton                                             var_sp->GetDeclaration ().DumpStopContext (&s, false);
734a134cc1bSGreg Clayton                                             s.PutCString (": ");
735a134cc1bSGreg Clayton                                         }
736a134cc1bSGreg Clayton                                         DumpValueObject (result,
737a134cc1bSGreg Clayton                                                          exe_ctx.frame,
738a134cc1bSGreg Clayton                                                          valobj_sp.get(),
739a134cc1bSGreg Clayton                                                          name_cstr,
740a134cc1bSGreg Clayton                                                          m_options.ptr_depth,
741a134cc1bSGreg Clayton                                                          0,
742a134cc1bSGreg Clayton                                                          m_options.max_depth,
7436f00abd5SGreg Clayton                                                          m_options.use_objc,
7446f00abd5SGreg Clayton                                                          true);
745a134cc1bSGreg Clayton 
746a134cc1bSGreg Clayton                                         s.EOL();
747a134cc1bSGreg Clayton                                     }
748a134cc1bSGreg Clayton                                 }
7496d56d2ceSJim Ingham                             }
7506d56d2ceSJim Ingham                         }
7516d56d2ceSJim Ingham                     }
7526f00abd5SGreg Clayton                 }
7536d56d2ceSJim Ingham                 result.SetStatus (eReturnStatusSuccessFinishResult);
7546d56d2ceSJim Ingham             }
7559df87c17SGreg Clayton         }
7566d56d2ceSJim Ingham         return result.Succeeded();
7576d56d2ceSJim Ingham     }
7586d56d2ceSJim Ingham protected:
7596d56d2ceSJim Ingham 
7606d56d2ceSJim Ingham     CommandOptions m_options;
7616d56d2ceSJim Ingham };
7626d56d2ceSJim Ingham 
7636d56d2ceSJim Ingham lldb::OptionDefinition
7646d56d2ceSJim Ingham CommandObjectFrameVariable::CommandOptions::g_option_table[] =
7656d56d2ceSJim Ingham {
766a134cc1bSGreg Clayton { LLDB_OPT_SET_1, false, "debug",      'D', no_argument,       NULL, 0, NULL,        "Enable verbose debug information."},
7676d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "depth",      'd', required_argument, NULL, 0, "<count>",   "Set the max recurse depth when dumping aggregate types (default is infinity)."},
768a134cc1bSGreg Clayton { LLDB_OPT_SET_1, false, "show-globals",'g', no_argument,      NULL, 0, NULL,        "Show the current frame source file global and static variables."},
769a134cc1bSGreg Clayton { LLDB_OPT_SET_1, false, "find-global",'G', required_argument, NULL, 0, NULL,        "Find a global variable by name (which might not be in the current stack frame source file)."},
7706d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "location",   'L', no_argument,       NULL, 0, NULL,        "Show variable location information."},
771a134cc1bSGreg Clayton { LLDB_OPT_SET_1, false, "show-declaration", 'c', no_argument, NULL, 0, NULL,        "Show variable declaration information (source file and line where the variable was declared)."},
7726d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "name",       'n', required_argument, NULL, 0, "<name>",    "Lookup a variable by name or regex (--regex) for the current execution context."},
7736d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "no-args",    'a', no_argument,       NULL, 0, NULL,        "Omit function arguments."},
7746d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "no-locals",  'l', no_argument,       NULL, 0, NULL,        "Omit local variables."},
7756d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "no-types",   't', no_argument,       NULL, 0, NULL,        "Omit variable type names."},
7766d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "no-summary", 'y', no_argument,       NULL, 0, NULL,        "Omit summary information."},
7776d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "scope",      's', no_argument,       NULL, 0, NULL,        "Show variable scope (argument, local, global, static)."},
7786d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "objc",       'o', no_argument,       NULL, 0, NULL,        "When looking up a variable by name (--name), print as an Objective-C object."},
7796d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "ptr-depth",  'p', required_argument, NULL, 0, "<count>",   "The number of pointers to be traversed when dumping values (default is zero)."},
7806d56d2ceSJim Ingham { LLDB_OPT_SET_1, false, "regex",      'r', no_argument,       NULL, 0, NULL,        "The <name> argument for name lookups are regular expressions."},
7816d56d2ceSJim Ingham { 0, false, NULL, 0, 0, NULL, NULL, NULL, NULL }
7826d56d2ceSJim Ingham };
78330fdc8d8SChris Lattner #pragma mark CommandObjectMultiwordFrame
78430fdc8d8SChris Lattner 
78530fdc8d8SChris Lattner //-------------------------------------------------------------------------
78630fdc8d8SChris Lattner // CommandObjectMultiwordFrame
78730fdc8d8SChris Lattner //-------------------------------------------------------------------------
78830fdc8d8SChris Lattner 
7896611103cSGreg Clayton CommandObjectMultiwordFrame::CommandObjectMultiwordFrame (CommandInterpreter &interpreter) :
790*a7015092SGreg Clayton     CommandObjectMultiword (interpreter,
791*a7015092SGreg Clayton                             "frame",
79230fdc8d8SChris Lattner                             "A set of commands for operating on the current thread's frames.",
79330fdc8d8SChris Lattner                             "frame <subcommand> [<subcommand-options>]")
79430fdc8d8SChris Lattner {
795*a7015092SGreg Clayton     LoadSubCommand ("info",   CommandObjectSP (new CommandObjectFrameInfo (interpreter)));
796*a7015092SGreg Clayton     LoadSubCommand ("select", CommandObjectSP (new CommandObjectFrameSelect (interpreter)));
797*a7015092SGreg Clayton     LoadSubCommand ("variable", CommandObjectSP (new CommandObjectFrameVariable (interpreter)));
79830fdc8d8SChris Lattner }
79930fdc8d8SChris Lattner 
80030fdc8d8SChris Lattner CommandObjectMultiwordFrame::~CommandObjectMultiwordFrame ()
80130fdc8d8SChris Lattner {
80230fdc8d8SChris Lattner }
80330fdc8d8SChris Lattner 
804