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