130fdc8d8SChris Lattner //===-- CommandObject.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 "lldb/Interpreter/CommandObject.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include <string> 13ea671fbdSKate Stone #include <sstream> 1430fdc8d8SChris Lattner #include <map> 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner #include <stdlib.h> 1730fdc8d8SChris Lattner #include <ctype.h> 1830fdc8d8SChris Lattner 1930fdc8d8SChris Lattner #include "lldb/Core/Address.h" 20ca7835c6SJohnny Chen #include "lldb/Core/ArchSpec.h" 2140af72e1SJim Ingham #include "lldb/Interpreter/Options.h" 2230fdc8d8SChris Lattner 2330fdc8d8SChris Lattner // These are for the Sourcename completers. 2430fdc8d8SChris Lattner // FIXME: Make a separate file for the completers. 2553239f00SGreg Clayton #include "lldb/Host/FileSpec.h" 2630fdc8d8SChris Lattner #include "lldb/Core/FileSpecList.h" 27a78bd7ffSZachary Turner #include "lldb/DataFormatters/FormatManager.h" 2830fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2930fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3030fdc8d8SChris Lattner 310e0984eeSJim Ingham #include "lldb/Target/Language.h" 320e0984eeSJim Ingham 3330fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h" 3430fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 3530fdc8d8SChris Lattner 3630fdc8d8SChris Lattner using namespace lldb; 3730fdc8d8SChris Lattner using namespace lldb_private; 3830fdc8d8SChris Lattner 3930fdc8d8SChris Lattner //------------------------------------------------------------------------- 4030fdc8d8SChris Lattner // CommandObject 4130fdc8d8SChris Lattner //------------------------------------------------------------------------- 4230fdc8d8SChris Lattner 43a7015092SGreg Clayton CommandObject::CommandObject 44a7015092SGreg Clayton ( 45a7015092SGreg Clayton CommandInterpreter &interpreter, 46a7015092SGreg Clayton const char *name, 47a7015092SGreg Clayton const char *help, 48a7015092SGreg Clayton const char *syntax, 49a7015092SGreg Clayton uint32_t flags 50a7015092SGreg Clayton ) : 51a7015092SGreg Clayton m_interpreter (interpreter), 522f02fe0bSEnrico Granata m_cmd_name (name ? name : ""), 5330fdc8d8SChris Lattner m_cmd_help_short (), 5430fdc8d8SChris Lattner m_cmd_help_long (), 5530fdc8d8SChris Lattner m_cmd_syntax (), 56e139cf23SCaroline Tice m_flags (flags), 57a9f7b79dSGreg Clayton m_arguments(), 586d8873f9SJim Ingham m_deprecated_command_override_callback (nullptr), 59d78c9576SEd Maste m_command_override_callback (nullptr), 60d78c9576SEd Maste m_command_override_baton (nullptr) 6130fdc8d8SChris Lattner { 6230fdc8d8SChris Lattner if (help && help[0]) 6330fdc8d8SChris Lattner m_cmd_help_short = help; 6430fdc8d8SChris Lattner if (syntax && syntax[0]) 6530fdc8d8SChris Lattner m_cmd_syntax = syntax; 6630fdc8d8SChris Lattner } 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner CommandObject::~CommandObject () 6930fdc8d8SChris Lattner { 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 7230fdc8d8SChris Lattner const char * 7330fdc8d8SChris Lattner CommandObject::GetHelp () 7430fdc8d8SChris Lattner { 7530fdc8d8SChris Lattner return m_cmd_help_short.c_str(); 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 7830fdc8d8SChris Lattner const char * 7930fdc8d8SChris Lattner CommandObject::GetHelpLong () 8030fdc8d8SChris Lattner { 8130fdc8d8SChris Lattner return m_cmd_help_long.c_str(); 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner const char * 8530fdc8d8SChris Lattner CommandObject::GetSyntax () 8630fdc8d8SChris Lattner { 87e139cf23SCaroline Tice if (m_cmd_syntax.length() == 0) 88e139cf23SCaroline Tice { 89e139cf23SCaroline Tice StreamString syntax_str; 90e139cf23SCaroline Tice syntax_str.Printf ("%s", GetCommandName()); 91bef55ac8SEnrico Granata if (!IsDashDashCommand() && GetOptions() != nullptr) 92e139cf23SCaroline Tice syntax_str.Printf (" <cmd-options>"); 93e139cf23SCaroline Tice if (m_arguments.size() > 0) 94e139cf23SCaroline Tice { 95e139cf23SCaroline Tice syntax_str.Printf (" "); 96bef55ac8SEnrico Granata if (!IsDashDashCommand() && WantsRawCommandString() && GetOptions() && GetOptions()->NumCommandOptions()) 97a4c6ad19SSean Callanan syntax_str.Printf("-- "); 98e139cf23SCaroline Tice GetFormattedCommandArguments (syntax_str); 99e139cf23SCaroline Tice } 100e139cf23SCaroline Tice m_cmd_syntax = syntax_str.GetData (); 101e139cf23SCaroline Tice } 102e139cf23SCaroline Tice 10330fdc8d8SChris Lattner return m_cmd_syntax.c_str(); 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 10630fdc8d8SChris Lattner const char * 10730fdc8d8SChris Lattner CommandObject::GetCommandName () 10830fdc8d8SChris Lattner { 10930fdc8d8SChris Lattner return m_cmd_name.c_str(); 11030fdc8d8SChris Lattner } 11130fdc8d8SChris Lattner 11230fdc8d8SChris Lattner void 11330fdc8d8SChris Lattner CommandObject::SetCommandName (const char *name) 11430fdc8d8SChris Lattner { 11530fdc8d8SChris Lattner m_cmd_name = name; 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner 11830fdc8d8SChris Lattner void 11930fdc8d8SChris Lattner CommandObject::SetHelp (const char *cstr) 12030fdc8d8SChris Lattner { 121bfb75e9bSEnrico Granata if (cstr) 12230fdc8d8SChris Lattner m_cmd_help_short = cstr; 123bfb75e9bSEnrico Granata else 124bfb75e9bSEnrico Granata m_cmd_help_short.assign(""); 1256f79bb2dSEnrico Granata } 1266f79bb2dSEnrico Granata 1276f79bb2dSEnrico Granata void 12830fdc8d8SChris Lattner CommandObject::SetHelpLong (const char *cstr) 12930fdc8d8SChris Lattner { 130bfb75e9bSEnrico Granata if (cstr) 13130fdc8d8SChris Lattner m_cmd_help_long = cstr; 132bfb75e9bSEnrico Granata else 133bfb75e9bSEnrico Granata m_cmd_help_long.assign(""); 13499f0b8f9SEnrico Granata } 13599f0b8f9SEnrico Granata 13699f0b8f9SEnrico Granata void 13730fdc8d8SChris Lattner CommandObject::SetSyntax (const char *cstr) 13830fdc8d8SChris Lattner { 13930fdc8d8SChris Lattner m_cmd_syntax = cstr; 14030fdc8d8SChris Lattner } 14130fdc8d8SChris Lattner 14230fdc8d8SChris Lattner Options * 14330fdc8d8SChris Lattner CommandObject::GetOptions () 14430fdc8d8SChris Lattner { 14530fdc8d8SChris Lattner // By default commands don't have options unless this virtual function 14630fdc8d8SChris Lattner // is overridden by base classes. 147d78c9576SEd Maste return nullptr; 14830fdc8d8SChris Lattner } 14930fdc8d8SChris Lattner 15030fdc8d8SChris Lattner bool 15130fdc8d8SChris Lattner CommandObject::ParseOptions 15230fdc8d8SChris Lattner ( 15330fdc8d8SChris Lattner Args& args, 15430fdc8d8SChris Lattner CommandReturnObject &result 15530fdc8d8SChris Lattner ) 15630fdc8d8SChris Lattner { 15730fdc8d8SChris Lattner // See if the subclass has options? 15830fdc8d8SChris Lattner Options *options = GetOptions(); 159d78c9576SEd Maste if (options != nullptr) 16030fdc8d8SChris Lattner { 16130fdc8d8SChris Lattner Error error; 162f6b8b581SGreg Clayton options->NotifyOptionParsingStarting(); 16330fdc8d8SChris Lattner 164b7ad58a0SGreg Clayton // ParseOptions calls getopt_long_only, which always skips the zero'th item in the array and starts at position 1, 16530fdc8d8SChris Lattner // so we need to push a dummy value into position zero. 16630fdc8d8SChris Lattner args.Unshift("dummy_string"); 16730fdc8d8SChris Lattner error = args.ParseOptions (*options); 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner // The "dummy_string" will have already been removed by ParseOptions, 17030fdc8d8SChris Lattner // so no need to remove it. 17130fdc8d8SChris Lattner 172f6b8b581SGreg Clayton if (error.Success()) 173f6b8b581SGreg Clayton error = options->NotifyOptionParsingFinished(); 174f6b8b581SGreg Clayton 175f6b8b581SGreg Clayton if (error.Success()) 176f6b8b581SGreg Clayton { 177f6b8b581SGreg Clayton if (options->VerifyOptions (result)) 178f6b8b581SGreg Clayton return true; 179f6b8b581SGreg Clayton } 180f6b8b581SGreg Clayton else 18130fdc8d8SChris Lattner { 18230fdc8d8SChris Lattner const char *error_cstr = error.AsCString(); 18330fdc8d8SChris Lattner if (error_cstr) 18430fdc8d8SChris Lattner { 18530fdc8d8SChris Lattner // We got an error string, lets use that 18686edbf41SGreg Clayton result.AppendError(error_cstr); 18730fdc8d8SChris Lattner } 18830fdc8d8SChris Lattner else 18930fdc8d8SChris Lattner { 19030fdc8d8SChris Lattner // No error string, output the usage information into result 191eb0103f2SGreg Clayton options->GenerateOptionUsage (result.GetErrorStream(), this); 19230fdc8d8SChris Lattner } 193f6b8b581SGreg Clayton } 19430fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 19530fdc8d8SChris Lattner return false; 19630fdc8d8SChris Lattner } 19730fdc8d8SChris Lattner return true; 19830fdc8d8SChris Lattner } 19930fdc8d8SChris Lattner 2005a988416SJim Ingham 2015a988416SJim Ingham 2025a988416SJim Ingham bool 203f9fc609fSGreg Clayton CommandObject::CheckRequirements (CommandReturnObject &result) 2045a988416SJim Ingham { 205f9fc609fSGreg Clayton #ifdef LLDB_CONFIGURATION_DEBUG 206f9fc609fSGreg Clayton // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx 207f9fc609fSGreg Clayton // has shared pointers to the target, process, thread and frame and we don't 208f9fc609fSGreg Clayton // want any CommandObject instances to keep any of these objects around 209f9fc609fSGreg Clayton // longer than for a single command. Every command should call 210f9fc609fSGreg Clayton // CommandObject::Cleanup() after it has completed 211f9fc609fSGreg Clayton assert (m_exe_ctx.GetTargetPtr() == NULL); 212f9fc609fSGreg Clayton assert (m_exe_ctx.GetProcessPtr() == NULL); 213f9fc609fSGreg Clayton assert (m_exe_ctx.GetThreadPtr() == NULL); 214f9fc609fSGreg Clayton assert (m_exe_ctx.GetFramePtr() == NULL); 215f9fc609fSGreg Clayton #endif 216f9fc609fSGreg Clayton 217f9fc609fSGreg Clayton // Lock down the interpreter's execution context prior to running the 218f9fc609fSGreg Clayton // command so we guarantee the selected target, process, thread and frame 219f9fc609fSGreg Clayton // can't go away during the execution 220f9fc609fSGreg Clayton m_exe_ctx = m_interpreter.GetExecutionContext(); 221f9fc609fSGreg Clayton 222f9fc609fSGreg Clayton const uint32_t flags = GetFlags().Get(); 223e87764f2SEnrico Granata if (flags & (eCommandRequiresTarget | 224e87764f2SEnrico Granata eCommandRequiresProcess | 225e87764f2SEnrico Granata eCommandRequiresThread | 226e87764f2SEnrico Granata eCommandRequiresFrame | 227e87764f2SEnrico Granata eCommandTryTargetAPILock )) 228f9fc609fSGreg Clayton { 229f9fc609fSGreg Clayton 230e87764f2SEnrico Granata if ((flags & eCommandRequiresTarget) && !m_exe_ctx.HasTargetScope()) 231f9fc609fSGreg Clayton { 232f9fc609fSGreg Clayton result.AppendError (GetInvalidTargetDescription()); 233f9fc609fSGreg Clayton return false; 234f9fc609fSGreg Clayton } 235f9fc609fSGreg Clayton 236e87764f2SEnrico Granata if ((flags & eCommandRequiresProcess) && !m_exe_ctx.HasProcessScope()) 237f9fc609fSGreg Clayton { 238e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 239e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 240e59b0d2cSJason Molenda else 241f9fc609fSGreg Clayton result.AppendError (GetInvalidProcessDescription()); 242f9fc609fSGreg Clayton return false; 243f9fc609fSGreg Clayton } 244f9fc609fSGreg Clayton 245e87764f2SEnrico Granata if ((flags & eCommandRequiresThread) && !m_exe_ctx.HasThreadScope()) 246f9fc609fSGreg Clayton { 247e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 248e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 249e59b0d2cSJason Molenda else if (!m_exe_ctx.HasProcessScope()) 250e59b0d2cSJason Molenda result.AppendError (GetInvalidProcessDescription()); 251e59b0d2cSJason Molenda else 252f9fc609fSGreg Clayton result.AppendError (GetInvalidThreadDescription()); 253f9fc609fSGreg Clayton return false; 254f9fc609fSGreg Clayton } 255f9fc609fSGreg Clayton 256e87764f2SEnrico Granata if ((flags & eCommandRequiresFrame) && !m_exe_ctx.HasFrameScope()) 257f9fc609fSGreg Clayton { 258e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 259e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 260e59b0d2cSJason Molenda else if (!m_exe_ctx.HasProcessScope()) 261e59b0d2cSJason Molenda result.AppendError (GetInvalidProcessDescription()); 262e59b0d2cSJason Molenda else if (!m_exe_ctx.HasThreadScope()) 263e59b0d2cSJason Molenda result.AppendError (GetInvalidThreadDescription()); 264e59b0d2cSJason Molenda else 265f9fc609fSGreg Clayton result.AppendError (GetInvalidFrameDescription()); 266f9fc609fSGreg Clayton return false; 267f9fc609fSGreg Clayton } 268f9fc609fSGreg Clayton 269e87764f2SEnrico Granata if ((flags & eCommandRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == nullptr)) 270f9fc609fSGreg Clayton { 271f9fc609fSGreg Clayton result.AppendError (GetInvalidRegContextDescription()); 272f9fc609fSGreg Clayton return false; 273f9fc609fSGreg Clayton } 274f9fc609fSGreg Clayton 275e87764f2SEnrico Granata if (flags & eCommandTryTargetAPILock) 276f9fc609fSGreg Clayton { 277f9fc609fSGreg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 278f9fc609fSGreg Clayton if (target) 2799b5442aeSGreg Clayton m_api_locker.Lock (target->GetAPIMutex()); 280f9fc609fSGreg Clayton } 281f9fc609fSGreg Clayton } 282f9fc609fSGreg Clayton 283e87764f2SEnrico Granata if (GetFlags().AnySet (eCommandProcessMustBeLaunched | eCommandProcessMustBePaused)) 284b766a73dSGreg Clayton { 285c14ee32dSGreg Clayton Process *process = m_interpreter.GetExecutionContext().GetProcessPtr(); 286d78c9576SEd Maste if (process == nullptr) 28730fdc8d8SChris Lattner { 288b8e8a5f3SJim Ingham // A process that is not running is considered paused. 289e87764f2SEnrico Granata if (GetFlags().Test(eCommandProcessMustBeLaunched)) 290b8e8a5f3SJim Ingham { 29130fdc8d8SChris Lattner result.AppendError ("Process must exist."); 29230fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 29330fdc8d8SChris Lattner return false; 29430fdc8d8SChris Lattner } 295b8e8a5f3SJim Ingham } 29630fdc8d8SChris Lattner else 29730fdc8d8SChris Lattner { 29830fdc8d8SChris Lattner StateType state = process->GetState(); 29930fdc8d8SChris Lattner switch (state) 30030fdc8d8SChris Lattner { 3017a5388bfSGreg Clayton case eStateInvalid: 30230fdc8d8SChris Lattner case eStateSuspended: 30330fdc8d8SChris Lattner case eStateCrashed: 30430fdc8d8SChris Lattner case eStateStopped: 30530fdc8d8SChris Lattner break; 30630fdc8d8SChris Lattner 307b766a73dSGreg Clayton case eStateConnected: 308b766a73dSGreg Clayton case eStateAttaching: 309b766a73dSGreg Clayton case eStateLaunching: 31030fdc8d8SChris Lattner case eStateDetached: 31130fdc8d8SChris Lattner case eStateExited: 31230fdc8d8SChris Lattner case eStateUnloaded: 313e87764f2SEnrico Granata if (GetFlags().Test(eCommandProcessMustBeLaunched)) 31430fdc8d8SChris Lattner { 31530fdc8d8SChris Lattner result.AppendError ("Process must be launched."); 31630fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 31730fdc8d8SChris Lattner return false; 31830fdc8d8SChris Lattner } 31930fdc8d8SChris Lattner break; 32030fdc8d8SChris Lattner 32130fdc8d8SChris Lattner case eStateRunning: 32230fdc8d8SChris Lattner case eStateStepping: 323e87764f2SEnrico Granata if (GetFlags().Test(eCommandProcessMustBePaused)) 32430fdc8d8SChris Lattner { 32530fdc8d8SChris Lattner result.AppendError ("Process is running. Use 'process interrupt' to pause execution."); 32630fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 32730fdc8d8SChris Lattner return false; 32830fdc8d8SChris Lattner } 32930fdc8d8SChris Lattner } 33030fdc8d8SChris Lattner } 331b766a73dSGreg Clayton } 3325a988416SJim Ingham return true; 33330fdc8d8SChris Lattner } 33430fdc8d8SChris Lattner 335f9fc609fSGreg Clayton void 336f9fc609fSGreg Clayton CommandObject::Cleanup () 337f9fc609fSGreg Clayton { 338f9fc609fSGreg Clayton m_exe_ctx.Clear(); 339f9fc609fSGreg Clayton m_api_locker.Unlock(); 340f9fc609fSGreg Clayton } 341f9fc609fSGreg Clayton 34230fdc8d8SChris Lattner int 34330fdc8d8SChris Lattner CommandObject::HandleCompletion 34430fdc8d8SChris Lattner ( 34530fdc8d8SChris Lattner Args &input, 34630fdc8d8SChris Lattner int &cursor_index, 34730fdc8d8SChris Lattner int &cursor_char_position, 34830fdc8d8SChris Lattner int match_start_point, 34930fdc8d8SChris Lattner int max_return_elements, 350558ce124SJim Ingham bool &word_complete, 35130fdc8d8SChris Lattner StringList &matches 35230fdc8d8SChris Lattner ) 35330fdc8d8SChris Lattner { 354e171da5cSBruce Mitchener // Default implementation of WantsCompletion() is !WantsRawCommandString(). 3556561d15dSJohnny Chen // Subclasses who want raw command string but desire, for example, 3566561d15dSJohnny Chen // argument completion should override WantsCompletion() to return true, 3576561d15dSJohnny Chen // instead. 3586f99b637SJohnny Chen if (WantsRawCommandString() && !WantsCompletion()) 35930fdc8d8SChris Lattner { 36030fdc8d8SChris Lattner // FIXME: Abstract telling the completion to insert the completion character. 36130fdc8d8SChris Lattner matches.Clear(); 36230fdc8d8SChris Lattner return -1; 36330fdc8d8SChris Lattner } 36430fdc8d8SChris Lattner else 36530fdc8d8SChris Lattner { 36630fdc8d8SChris Lattner // Can we do anything generic with the options? 36730fdc8d8SChris Lattner Options *cur_options = GetOptions(); 36830fdc8d8SChris Lattner CommandReturnObject result; 36930fdc8d8SChris Lattner OptionElementVector opt_element_vector; 37030fdc8d8SChris Lattner 371d78c9576SEd Maste if (cur_options != nullptr) 37230fdc8d8SChris Lattner { 37330fdc8d8SChris Lattner // Re-insert the dummy command name string which will have been 37430fdc8d8SChris Lattner // stripped off: 37530fdc8d8SChris Lattner input.Unshift ("dummy-string"); 37630fdc8d8SChris Lattner cursor_index++; 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner 37930fdc8d8SChris Lattner // I stick an element on the end of the input, because if the last element is 380b7ad58a0SGreg Clayton // option that requires an argument, getopt_long_only will freak out. 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner input.AppendArgument ("<FAKE-VALUE>"); 38330fdc8d8SChris Lattner 384d43e0094SJim Ingham input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index); 38530fdc8d8SChris Lattner 38630fdc8d8SChris Lattner input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1); 38730fdc8d8SChris Lattner 38830fdc8d8SChris Lattner bool handled_by_options; 389eb0103f2SGreg Clayton handled_by_options = cur_options->HandleOptionCompletion (input, 39030fdc8d8SChris Lattner opt_element_vector, 39130fdc8d8SChris Lattner cursor_index, 39230fdc8d8SChris Lattner cursor_char_position, 39330fdc8d8SChris Lattner match_start_point, 39430fdc8d8SChris Lattner max_return_elements, 395558ce124SJim Ingham word_complete, 39630fdc8d8SChris Lattner matches); 39730fdc8d8SChris Lattner if (handled_by_options) 39830fdc8d8SChris Lattner return matches.GetSize(); 39930fdc8d8SChris Lattner } 40030fdc8d8SChris Lattner 40130fdc8d8SChris Lattner // If we got here, the last word is not an option or an option argument. 402a7015092SGreg Clayton return HandleArgumentCompletion (input, 40330fdc8d8SChris Lattner cursor_index, 40430fdc8d8SChris Lattner cursor_char_position, 40530fdc8d8SChris Lattner opt_element_vector, 40630fdc8d8SChris Lattner match_start_point, 40730fdc8d8SChris Lattner max_return_elements, 408558ce124SJim Ingham word_complete, 40930fdc8d8SChris Lattner matches); 41030fdc8d8SChris Lattner } 41130fdc8d8SChris Lattner } 41230fdc8d8SChris Lattner 41330fdc8d8SChris Lattner bool 414*d033e1ceSEnrico Granata CommandObject::HelpTextContainsWord (const char *search_word, 415*d033e1ceSEnrico Granata bool search_short_help, 416*d033e1ceSEnrico Granata bool search_long_help, 417*d033e1ceSEnrico Granata bool search_syntax, 418*d033e1ceSEnrico Granata bool search_options) 41930fdc8d8SChris Lattner { 42030fdc8d8SChris Lattner std::string options_usage_help; 42130fdc8d8SChris Lattner 42230fdc8d8SChris Lattner bool found_word = false; 42330fdc8d8SChris Lattner 424998255bfSGreg Clayton const char *short_help = GetHelp(); 425998255bfSGreg Clayton const char *long_help = GetHelpLong(); 426998255bfSGreg Clayton const char *syntax_help = GetSyntax(); 42730fdc8d8SChris Lattner 428*d033e1ceSEnrico Granata if (search_short_help && short_help && strcasestr (short_help, search_word)) 42930fdc8d8SChris Lattner found_word = true; 430*d033e1ceSEnrico Granata else if (search_long_help && long_help && strcasestr (long_help, search_word)) 43130fdc8d8SChris Lattner found_word = true; 432*d033e1ceSEnrico Granata else if (search_syntax && syntax_help && strcasestr (syntax_help, search_word)) 43330fdc8d8SChris Lattner found_word = true; 43430fdc8d8SChris Lattner 43530fdc8d8SChris Lattner if (!found_word 436*d033e1ceSEnrico Granata && search_options 437d78c9576SEd Maste && GetOptions() != nullptr) 43830fdc8d8SChris Lattner { 43930fdc8d8SChris Lattner StreamString usage_help; 440eb0103f2SGreg Clayton GetOptions()->GenerateOptionUsage (usage_help, this); 44130fdc8d8SChris Lattner if (usage_help.GetSize() > 0) 44230fdc8d8SChris Lattner { 44330fdc8d8SChris Lattner const char *usage_text = usage_help.GetData(); 4444b6fbf37SCaroline Tice if (strcasestr (usage_text, search_word)) 44530fdc8d8SChris Lattner found_word = true; 44630fdc8d8SChris Lattner } 44730fdc8d8SChris Lattner } 44830fdc8d8SChris Lattner 44930fdc8d8SChris Lattner return found_word; 45030fdc8d8SChris Lattner } 451e139cf23SCaroline Tice 452e139cf23SCaroline Tice int 453e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries () 454e139cf23SCaroline Tice { 455e139cf23SCaroline Tice return m_arguments.size(); 456e139cf23SCaroline Tice } 457e139cf23SCaroline Tice 458e139cf23SCaroline Tice CommandObject::CommandArgumentEntry * 459e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx) 460e139cf23SCaroline Tice { 4613985c8c6SSaleem Abdulrasool if (static_cast<size_t>(idx) < m_arguments.size()) 462e139cf23SCaroline Tice return &(m_arguments[idx]); 463e139cf23SCaroline Tice 464d78c9576SEd Maste return nullptr; 465e139cf23SCaroline Tice } 466e139cf23SCaroline Tice 467d7e6a4f2SVince Harron const CommandObject::ArgumentTableEntry * 468e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type) 469e139cf23SCaroline Tice { 470e139cf23SCaroline Tice const ArgumentTableEntry *table = CommandObject::GetArgumentTable(); 471e139cf23SCaroline Tice 472e139cf23SCaroline Tice for (int i = 0; i < eArgTypeLastArg; ++i) 473e139cf23SCaroline Tice if (table[i].arg_type == arg_type) 474d7e6a4f2SVince Harron return &(table[i]); 475e139cf23SCaroline Tice 476d78c9576SEd Maste return nullptr; 477e139cf23SCaroline Tice } 478e139cf23SCaroline Tice 479e139cf23SCaroline Tice void 480e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter) 481e139cf23SCaroline Tice { 482e139cf23SCaroline Tice const ArgumentTableEntry* table = CommandObject::GetArgumentTable(); 483d7e6a4f2SVince Harron const ArgumentTableEntry *entry = &(table[arg_type]); 484e139cf23SCaroline Tice 485e139cf23SCaroline Tice // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up... 486e139cf23SCaroline Tice 487e139cf23SCaroline Tice if (entry->arg_type != arg_type) 488e139cf23SCaroline Tice entry = CommandObject::FindArgumentDataByType (arg_type); 489e139cf23SCaroline Tice 490e139cf23SCaroline Tice if (!entry) 491e139cf23SCaroline Tice return; 492e139cf23SCaroline Tice 493e139cf23SCaroline Tice StreamString name_str; 494e139cf23SCaroline Tice name_str.Printf ("<%s>", entry->arg_name); 495e139cf23SCaroline Tice 496fc7a7f3bSEnrico Granata if (entry->help_function) 49782a7d983SEnrico Granata { 498fc7a7f3bSEnrico Granata const char* help_text = entry->help_function(); 49982a7d983SEnrico Granata if (!entry->help_function.self_formatting) 50082a7d983SEnrico Granata { 50182a7d983SEnrico Granata interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text, 502e139cf23SCaroline Tice name_str.GetSize()); 50382a7d983SEnrico Granata } 50482a7d983SEnrico Granata else 50582a7d983SEnrico Granata { 50682a7d983SEnrico Granata interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text, 50782a7d983SEnrico Granata name_str.GetSize()); 50882a7d983SEnrico Granata } 50982a7d983SEnrico Granata } 510e139cf23SCaroline Tice else 511e139cf23SCaroline Tice interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize()); 512e139cf23SCaroline Tice } 513e139cf23SCaroline Tice 514e139cf23SCaroline Tice const char * 515e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type) 516e139cf23SCaroline Tice { 517d7e6a4f2SVince Harron const ArgumentTableEntry *entry = &(CommandObject::GetArgumentTable()[arg_type]); 518deaab222SCaroline Tice 519deaab222SCaroline Tice // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up... 520deaab222SCaroline Tice 521deaab222SCaroline Tice if (entry->arg_type != arg_type) 522deaab222SCaroline Tice entry = CommandObject::FindArgumentDataByType (arg_type); 523deaab222SCaroline Tice 524e6acf355SJohnny Chen if (entry) 525deaab222SCaroline Tice return entry->arg_name; 526e6acf355SJohnny Chen 527e6acf355SJohnny Chen StreamString str; 528e6acf355SJohnny Chen str << "Arg name for type (" << arg_type << ") not in arg table!"; 529e6acf355SJohnny Chen return str.GetData(); 530e139cf23SCaroline Tice } 531e139cf23SCaroline Tice 532405fe67fSCaroline Tice bool 533e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type) 534405fe67fSCaroline Tice { 535405fe67fSCaroline Tice if ((arg_repeat_type == eArgRepeatPairPlain) 536405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairOptional) 537405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairPlus) 538405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairStar) 539405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairRange) 540405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairRangeOptional)) 541405fe67fSCaroline Tice return true; 542405fe67fSCaroline Tice 543405fe67fSCaroline Tice return false; 544405fe67fSCaroline Tice } 545405fe67fSCaroline Tice 54634ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry 54734ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry) 54834ddc8dbSJohnny Chen { 54934ddc8dbSJohnny Chen CommandObject::CommandArgumentEntry ret_val; 55034ddc8dbSJohnny Chen for (unsigned i = 0; i < cmd_arg_entry.size(); ++i) 55134ddc8dbSJohnny Chen if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association) 55234ddc8dbSJohnny Chen ret_val.push_back(cmd_arg_entry[i]); 55334ddc8dbSJohnny Chen return ret_val; 55434ddc8dbSJohnny Chen } 55534ddc8dbSJohnny Chen 55634ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take 55734ddc8dbSJohnny Chen // all the argument data into account. On rare cases where some argument sticks 55834ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args. 559e139cf23SCaroline Tice void 56034ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask) 561e139cf23SCaroline Tice { 562e139cf23SCaroline Tice int num_args = m_arguments.size(); 563e139cf23SCaroline Tice for (int i = 0; i < num_args; ++i) 564e139cf23SCaroline Tice { 565e139cf23SCaroline Tice if (i > 0) 566e139cf23SCaroline Tice str.Printf (" "); 56734ddc8dbSJohnny Chen CommandArgumentEntry arg_entry = 56834ddc8dbSJohnny Chen opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i] 56934ddc8dbSJohnny Chen : OptSetFiltered(opt_set_mask, m_arguments[i]); 570e139cf23SCaroline Tice int num_alternatives = arg_entry.size(); 571405fe67fSCaroline Tice 572405fe67fSCaroline Tice if ((num_alternatives == 2) 573405fe67fSCaroline Tice && IsPairType (arg_entry[0].arg_repetition)) 574405fe67fSCaroline Tice { 575405fe67fSCaroline Tice const char *first_name = GetArgumentName (arg_entry[0].arg_type); 576405fe67fSCaroline Tice const char *second_name = GetArgumentName (arg_entry[1].arg_type); 577405fe67fSCaroline Tice switch (arg_entry[0].arg_repetition) 578405fe67fSCaroline Tice { 579405fe67fSCaroline Tice case eArgRepeatPairPlain: 580405fe67fSCaroline Tice str.Printf ("<%s> <%s>", first_name, second_name); 581405fe67fSCaroline Tice break; 582405fe67fSCaroline Tice case eArgRepeatPairOptional: 583405fe67fSCaroline Tice str.Printf ("[<%s> <%s>]", first_name, second_name); 584405fe67fSCaroline Tice break; 585405fe67fSCaroline Tice case eArgRepeatPairPlus: 586405fe67fSCaroline Tice str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name); 587405fe67fSCaroline Tice break; 588405fe67fSCaroline Tice case eArgRepeatPairStar: 589405fe67fSCaroline Tice str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name); 590405fe67fSCaroline Tice break; 591405fe67fSCaroline Tice case eArgRepeatPairRange: 592405fe67fSCaroline Tice str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name); 593405fe67fSCaroline Tice break; 594405fe67fSCaroline Tice case eArgRepeatPairRangeOptional: 595405fe67fSCaroline Tice str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name); 596405fe67fSCaroline Tice break; 597ca1176aaSCaroline Tice // Explicitly test for all the rest of the cases, so if new types get added we will notice the 598ca1176aaSCaroline Tice // missing case statement(s). 599ca1176aaSCaroline Tice case eArgRepeatPlain: 600ca1176aaSCaroline Tice case eArgRepeatOptional: 601ca1176aaSCaroline Tice case eArgRepeatPlus: 602ca1176aaSCaroline Tice case eArgRepeatStar: 603ca1176aaSCaroline Tice case eArgRepeatRange: 604ca1176aaSCaroline Tice // These should not be reached, as they should fail the IsPairType test above. 605ca1176aaSCaroline Tice break; 606405fe67fSCaroline Tice } 607405fe67fSCaroline Tice } 608405fe67fSCaroline Tice else 609405fe67fSCaroline Tice { 610e139cf23SCaroline Tice StreamString names; 611e139cf23SCaroline Tice for (int j = 0; j < num_alternatives; ++j) 612e139cf23SCaroline Tice { 613e139cf23SCaroline Tice if (j > 0) 614e139cf23SCaroline Tice names.Printf (" | "); 615e139cf23SCaroline Tice names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type)); 616e139cf23SCaroline Tice } 617e139cf23SCaroline Tice switch (arg_entry[0].arg_repetition) 618e139cf23SCaroline Tice { 619e139cf23SCaroline Tice case eArgRepeatPlain: 620e139cf23SCaroline Tice str.Printf ("<%s>", names.GetData()); 621e139cf23SCaroline Tice break; 622e139cf23SCaroline Tice case eArgRepeatPlus: 623e139cf23SCaroline Tice str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData()); 624e139cf23SCaroline Tice break; 625e139cf23SCaroline Tice case eArgRepeatStar: 626e139cf23SCaroline Tice str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData()); 627e139cf23SCaroline Tice break; 628e139cf23SCaroline Tice case eArgRepeatOptional: 629e139cf23SCaroline Tice str.Printf ("[<%s>]", names.GetData()); 630e139cf23SCaroline Tice break; 631405fe67fSCaroline Tice case eArgRepeatRange: 632fd54b368SJason Molenda str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData()); 633ca1176aaSCaroline Tice break; 634ca1176aaSCaroline Tice // Explicitly test for all the rest of the cases, so if new types get added we will notice the 635ca1176aaSCaroline Tice // missing case statement(s). 636ca1176aaSCaroline Tice case eArgRepeatPairPlain: 637ca1176aaSCaroline Tice case eArgRepeatPairOptional: 638ca1176aaSCaroline Tice case eArgRepeatPairPlus: 639ca1176aaSCaroline Tice case eArgRepeatPairStar: 640ca1176aaSCaroline Tice case eArgRepeatPairRange: 641ca1176aaSCaroline Tice case eArgRepeatPairRangeOptional: 642ca1176aaSCaroline Tice // These should not be hit, as they should pass the IsPairType test above, and control should 643ca1176aaSCaroline Tice // have gone into the other branch of the if statement. 644ca1176aaSCaroline Tice break; 645405fe67fSCaroline Tice } 646e139cf23SCaroline Tice } 647e139cf23SCaroline Tice } 648e139cf23SCaroline Tice } 649e139cf23SCaroline Tice 6500c16aa6dSStephen Wilson CommandArgumentType 651e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name) 652e139cf23SCaroline Tice { 653e139cf23SCaroline Tice CommandArgumentType return_type = eArgTypeLastArg; 654e139cf23SCaroline Tice 655e139cf23SCaroline Tice std::string arg_name_str (arg_name); 656e139cf23SCaroline Tice size_t len = arg_name_str.length(); 657e139cf23SCaroline Tice if (arg_name[0] == '<' 658e139cf23SCaroline Tice && arg_name[len-1] == '>') 659e139cf23SCaroline Tice arg_name_str = arg_name_str.substr (1, len-2); 660e139cf23SCaroline Tice 661331eff39SJohnny Chen const ArgumentTableEntry *table = GetArgumentTable(); 662e139cf23SCaroline Tice for (int i = 0; i < eArgTypeLastArg; ++i) 663331eff39SJohnny Chen if (arg_name_str.compare (table[i].arg_name) == 0) 664e139cf23SCaroline Tice return_type = g_arguments_data[i].arg_type; 665e139cf23SCaroline Tice 666e139cf23SCaroline Tice return return_type; 667e139cf23SCaroline Tice } 668e139cf23SCaroline Tice 669e139cf23SCaroline Tice static const char * 670931e674aSJim Ingham RegisterNameHelpTextCallback () 671931e674aSJim Ingham { 672931e674aSJim Ingham return "Register names can be specified using the architecture specific names. " 67384c7bd74SJim Ingham "They can also be specified using generic names. Not all generic entities have " 67484c7bd74SJim Ingham "registers backing them on all architectures. When they don't the generic name " 67584c7bd74SJim Ingham "will return an error.\n" 676931e674aSJim Ingham "The generic names defined in lldb are:\n" 677931e674aSJim Ingham "\n" 678931e674aSJim Ingham "pc - program counter register\n" 679931e674aSJim Ingham "ra - return address register\n" 680931e674aSJim Ingham "fp - frame pointer register\n" 681931e674aSJim Ingham "sp - stack pointer register\n" 68284c7bd74SJim Ingham "flags - the flags register\n" 683931e674aSJim Ingham "arg{1-6} - integer argument passing registers.\n"; 684931e674aSJim Ingham } 685931e674aSJim Ingham 686931e674aSJim Ingham static const char * 687e139cf23SCaroline Tice BreakpointIDHelpTextCallback () 688e139cf23SCaroline Tice { 68986edbf41SGreg Clayton return "Breakpoint ID's consist major and minor numbers; the major number " 69086edbf41SGreg Clayton "corresponds to the single entity that was created with a 'breakpoint set' " 69186edbf41SGreg Clayton "command; the minor numbers correspond to all the locations that were actually " 69286edbf41SGreg Clayton "found/set based on the major breakpoint. A full breakpoint ID might look like " 69386edbf41SGreg Clayton "3.14, meaning the 14th location set for the 3rd breakpoint. You can specify " 69486edbf41SGreg Clayton "all the locations of a breakpoint by just indicating the major breakpoint " 69586edbf41SGreg Clayton "number. A valid breakpoint id consists either of just the major id number, " 69686edbf41SGreg Clayton "or the major number, a dot, and the location number (e.g. 3 or 3.2 could " 69786edbf41SGreg Clayton "both be valid breakpoint ids)."; 698e139cf23SCaroline Tice } 699e139cf23SCaroline Tice 700e139cf23SCaroline Tice static const char * 701e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback () 702e139cf23SCaroline Tice { 70386edbf41SGreg Clayton return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. " 70486edbf41SGreg Clayton "This can be done through several mechanisms. The easiest way is to just " 70586edbf41SGreg Clayton "enter a space-separated list of breakpoint ids. To specify all the " 70686edbf41SGreg Clayton "breakpoint locations under a major breakpoint, you can use the major " 70786edbf41SGreg Clayton "breakpoint number followed by '.*', eg. '5.*' means all the locations under " 70886edbf41SGreg Clayton "breakpoint 5. You can also indicate a range of breakpoints by using " 70986edbf41SGreg Clayton "<start-bp-id> - <end-bp-id>. The start-bp-id and end-bp-id for a range can " 71086edbf41SGreg Clayton "be any valid breakpoint ids. It is not legal, however, to specify a range " 71186edbf41SGreg Clayton "using specific locations that cross major breakpoint numbers. I.e. 3.2 - 3.7" 71286edbf41SGreg Clayton " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal."; 71386edbf41SGreg Clayton } 71486edbf41SGreg Clayton 71586edbf41SGreg Clayton static const char * 7165e09c8c3SJim Ingham BreakpointNameHelpTextCallback () 7175e09c8c3SJim Ingham { 7185e09c8c3SJim Ingham return "A name that can be added to a breakpoint when it is created, or later " 7195e09c8c3SJim Ingham "on with the \"breakpoint name add\" command. " 7205e09c8c3SJim Ingham "Breakpoint names can be used to specify breakpoints in all the places breakpoint ID's " 7215e09c8c3SJim Ingham "and breakpoint ID ranges can be used. As such they provide a convenient way to group breakpoints, " 7225e09c8c3SJim Ingham "and to operate on breakpoints you create without having to track the breakpoint number. " 7235e09c8c3SJim Ingham "Note, the attributes you set when using a breakpoint name in a breakpoint command don't " 7245e09c8c3SJim Ingham "adhere to the name, but instead are set individually on all the breakpoints currently tagged with that name. Future breakpoints " 7255e09c8c3SJim Ingham "tagged with that name will not pick up the attributes previously given using that name. " 7265e09c8c3SJim Ingham "In order to distinguish breakpoint names from breakpoint ID's and ranges, " 7275e09c8c3SJim Ingham "names must start with a letter from a-z or A-Z and cannot contain spaces, \".\" or \"-\". " 7285e09c8c3SJim Ingham "Also, breakpoint names can only be applied to breakpoints, not to breakpoint locations."; 7295e09c8c3SJim Ingham } 7305e09c8c3SJim Ingham 7315e09c8c3SJim Ingham static const char * 73286edbf41SGreg Clayton GDBFormatHelpTextCallback () 73386edbf41SGreg Clayton { 734f91381e8SGreg Clayton return "A GDB format consists of a repeat count, a format letter and a size letter. " 735f91381e8SGreg Clayton "The repeat count is optional and defaults to 1. The format letter is optional " 736f91381e8SGreg Clayton "and defaults to the previous format that was used. The size letter is optional " 737f91381e8SGreg Clayton "and defaults to the previous size that was used.\n" 738f91381e8SGreg Clayton "\n" 739f91381e8SGreg Clayton "Format letters include:\n" 740f91381e8SGreg Clayton "o - octal\n" 741f91381e8SGreg Clayton "x - hexadecimal\n" 742f91381e8SGreg Clayton "d - decimal\n" 743f91381e8SGreg Clayton "u - unsigned decimal\n" 744f91381e8SGreg Clayton "t - binary\n" 745f91381e8SGreg Clayton "f - float\n" 746f91381e8SGreg Clayton "a - address\n" 747f91381e8SGreg Clayton "i - instruction\n" 748f91381e8SGreg Clayton "c - char\n" 749f91381e8SGreg Clayton "s - string\n" 750f91381e8SGreg Clayton "T - OSType\n" 751f91381e8SGreg Clayton "A - float as hex\n" 752f91381e8SGreg Clayton "\n" 753f91381e8SGreg Clayton "Size letters include:\n" 754f91381e8SGreg Clayton "b - 1 byte (byte)\n" 755f91381e8SGreg Clayton "h - 2 bytes (halfword)\n" 756f91381e8SGreg Clayton "w - 4 bytes (word)\n" 757f91381e8SGreg Clayton "g - 8 bytes (giant)\n" 758f91381e8SGreg Clayton "\n" 759f91381e8SGreg Clayton "Example formats:\n" 760f91381e8SGreg Clayton "32xb - show 32 1 byte hexadecimal integer values\n" 761f91381e8SGreg Clayton "16xh - show 16 2 byte hexadecimal integer values\n" 762f91381e8SGreg Clayton "64 - show 64 2 byte hexadecimal integer values (format and size from the last format)\n" 763f91381e8SGreg Clayton "dw - show 1 4 byte decimal integer value\n" 764f91381e8SGreg Clayton ; 765e139cf23SCaroline Tice } 766e139cf23SCaroline Tice 7670a3958e0SEnrico Granata static const char * 7680a3958e0SEnrico Granata FormatHelpTextCallback () 7690a3958e0SEnrico Granata { 77082a7d983SEnrico Granata 771d78c9576SEd Maste static char* help_text_ptr = nullptr; 77282a7d983SEnrico Granata 77382a7d983SEnrico Granata if (help_text_ptr) 77482a7d983SEnrico Granata return help_text_ptr; 77582a7d983SEnrico Granata 7760a3958e0SEnrico Granata StreamString sstr; 7770a3958e0SEnrico Granata sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n"; 7780a3958e0SEnrico Granata for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1)) 7790a3958e0SEnrico Granata { 78082a7d983SEnrico Granata if (f != eFormatDefault) 78182a7d983SEnrico Granata sstr.PutChar('\n'); 78282a7d983SEnrico Granata 7830a3958e0SEnrico Granata char format_char = FormatManager::GetFormatAsFormatChar(f); 7840a3958e0SEnrico Granata if (format_char) 7850a3958e0SEnrico Granata sstr.Printf("'%c' or ", format_char); 7860a3958e0SEnrico Granata 78782a7d983SEnrico Granata sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f)); 7880a3958e0SEnrico Granata } 7890a3958e0SEnrico Granata 7900a3958e0SEnrico Granata sstr.Flush(); 7910a3958e0SEnrico Granata 7920a3958e0SEnrico Granata std::string data = sstr.GetString(); 7930a3958e0SEnrico Granata 79482a7d983SEnrico Granata help_text_ptr = new char[data.length()+1]; 7950a3958e0SEnrico Granata 79682a7d983SEnrico Granata data.copy(help_text_ptr, data.length()); 7970a3958e0SEnrico Granata 79882a7d983SEnrico Granata return help_text_ptr; 7990a3958e0SEnrico Granata } 8000a3958e0SEnrico Granata 8010a3958e0SEnrico Granata static const char * 802d9477397SSean Callanan LanguageTypeHelpTextCallback () 803d9477397SSean Callanan { 804d78c9576SEd Maste static char* help_text_ptr = nullptr; 805d9477397SSean Callanan 806d9477397SSean Callanan if (help_text_ptr) 807d9477397SSean Callanan return help_text_ptr; 808d9477397SSean Callanan 809d9477397SSean Callanan StreamString sstr; 810d9477397SSean Callanan sstr << "One of the following languages:\n"; 811d9477397SSean Callanan 8120e0984eeSJim Ingham Language::PrintAllLanguages(sstr, " ", "\n"); 813d9477397SSean Callanan 814d9477397SSean Callanan sstr.Flush(); 815d9477397SSean Callanan 816d9477397SSean Callanan std::string data = sstr.GetString(); 817d9477397SSean Callanan 818d9477397SSean Callanan help_text_ptr = new char[data.length()+1]; 819d9477397SSean Callanan 820d9477397SSean Callanan data.copy(help_text_ptr, data.length()); 821d9477397SSean Callanan 822d9477397SSean Callanan return help_text_ptr; 823d9477397SSean Callanan } 824d9477397SSean Callanan 825d9477397SSean Callanan static const char * 82682a7d983SEnrico Granata SummaryStringHelpTextCallback() 8270a3958e0SEnrico Granata { 82882a7d983SEnrico Granata return 82982a7d983SEnrico Granata "A summary string is a way to extract information from variables in order to present them using a summary.\n" 83082a7d983SEnrico Granata "Summary strings contain static text, variables, scopes and control sequences:\n" 83182a7d983SEnrico Granata " - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n" 83282a7d983SEnrico Granata " - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n" 83382a7d983SEnrico Granata " - Scopes are any sequence of text between { and }. Anything included in a scope will only appear in the output summary if there were no errors.\n" 83482a7d983SEnrico Granata " - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n" 83582a7d983SEnrico Granata "A summary string works by copying static text verbatim, turning control sequences into their character counterpart, expanding variables and trying to expand scopes.\n" 83682a7d983SEnrico Granata "A variable is expanded by giving it a value other than its textual representation, and the way this is done depends on what comes after the ${ marker.\n" 83782a7d983SEnrico Granata "The most common sequence if ${var followed by an expression path, which is the text one would type to access a member of an aggregate types, given a variable of that type" 83882a7d983SEnrico Granata " (e.g. if type T has a member named x, which has a member named y, and if t is of type T, the expression path would be .x.y and the way to fit that into a summary string would be" 8399128ee2fSEnrico Granata " ${var.x.y}). You can also use ${*var followed by an expression path and in that case the object referred by the path will be dereferenced before being displayed." 8409128ee2fSEnrico Granata " If the object is not a pointer, doing so will cause an error. For additional details on expression paths, you can type 'help expr-path'. \n" 84182a7d983SEnrico Granata "By default, summary strings attempt to display the summary for any variable they reference, and if that fails the value. If neither can be shown, nothing is displayed." 84282a7d983SEnrico Granata "In a summary string, you can also use an array index [n], or a slice-like range [n-m]. This can have two different meanings depending on what kind of object the expression" 84382a7d983SEnrico Granata " path refers to:\n" 84482a7d983SEnrico Granata " - if it is a scalar type (any basic type like int, float, ...) the expression is a bitfield, i.e. the bits indicated by the indexing operator are extracted out of the number" 84582a7d983SEnrico Granata " and displayed as an individual variable\n" 84682a7d983SEnrico Granata " - if it is an array or pointer the array items indicated by the indexing operator are shown as the result of the variable. if the expression is an array, real array items are" 84782a7d983SEnrico Granata " printed; if it is a pointer, the pointer-as-array syntax is used to obtain the values (this means, the latter case can have no range checking)\n" 8489128ee2fSEnrico Granata "If you are trying to display an array for which the size is known, you can also use [] instead of giving an exact range. This has the effect of showing items 0 thru size - 1.\n" 8499128ee2fSEnrico Granata "Additionally, a variable can contain an (optional) format code, as in ${var.x.y%code}, where code can be any of the valid formats described in 'help format', or one of the" 8509128ee2fSEnrico Granata " special symbols only allowed as part of a variable:\n" 8519128ee2fSEnrico Granata " %V: show the value of the object by default\n" 8529128ee2fSEnrico Granata " %S: show the summary of the object by default\n" 8539128ee2fSEnrico Granata " %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n" 8549128ee2fSEnrico Granata " %L: show the location of the object (memory address or a register name)\n" 8559128ee2fSEnrico Granata " %#: show the number of children of the object\n" 8569128ee2fSEnrico Granata " %T: show the type of the object\n" 8579128ee2fSEnrico Granata "Another variable that you can use in summary strings is ${svar . This sequence works exactly like ${var, including the fact that ${*svar is an allowed sequence, but uses" 8589128ee2fSEnrico Granata " the object's synthetic children provider instead of the actual objects. For instance, if you are using STL synthetic children providers, the following summary string would" 8599128ee2fSEnrico Granata " count the number of actual elements stored in an std::list:\n" 8609128ee2fSEnrico Granata "type summary add -s \"${svar%#}\" -x \"std::list<\""; 8619128ee2fSEnrico Granata } 8629128ee2fSEnrico Granata 8639128ee2fSEnrico Granata static const char * 8649128ee2fSEnrico Granata ExprPathHelpTextCallback() 8659128ee2fSEnrico Granata { 8669128ee2fSEnrico Granata return 8679128ee2fSEnrico Granata "An expression path is the sequence of symbols that is used in C/C++ to access a member variable of an aggregate object (class).\n" 8689128ee2fSEnrico Granata "For instance, given a class:\n" 8699128ee2fSEnrico Granata " class foo {\n" 8709128ee2fSEnrico Granata " int a;\n" 8719128ee2fSEnrico Granata " int b; .\n" 8729128ee2fSEnrico Granata " foo* next;\n" 8739128ee2fSEnrico Granata " };\n" 8749128ee2fSEnrico Granata "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n" 8759128ee2fSEnrico Granata "Given that aFoo could just be any object of type foo, the string '.next->b' is the expression path, because it can be attached to any foo instance to achieve the effect.\n" 8769128ee2fSEnrico Granata "Expression paths in LLDB include dot (.) and arrow (->) operators, and most commands using expression paths have ways to also accept the star (*) operator.\n" 8779128ee2fSEnrico Granata "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n" 8789128ee2fSEnrico Granata "LLDB also has support for indexing ([ ]) in expression paths, and extends the traditional meaning of the square brackets operator to allow bitfield extraction:\n" 8799128ee2fSEnrico Granata "for objects of native types (int, float, char, ...) saying '[n-m]' as an expression path (where n and m are any positive integers, e.g. [3-5]) causes LLDB to extract" 8809128ee2fSEnrico Granata " bits n thru m from the value of the variable. If n == m, [n] is also allowed as a shortcut syntax. For arrays and pointers, expression paths can only contain one index" 8819128ee2fSEnrico Granata " and the meaning of the operation is the same as the one defined by C/C++ (item extraction). Some commands extend bitfield-like syntax for arrays and pointers with the" 8829128ee2fSEnrico Granata " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory)."; 8830a3958e0SEnrico Granata } 8840a3958e0SEnrico Granata 885184d7a72SJohnny Chen void 886ea671fbdSKate Stone CommandObject::FormatLongHelpText (Stream &output_strm, const char *long_help) 887ea671fbdSKate Stone { 888ea671fbdSKate Stone CommandInterpreter& interpreter = GetCommandInterpreter(); 889ea671fbdSKate Stone std::stringstream lineStream (long_help); 890ea671fbdSKate Stone std::string line; 891ea671fbdSKate Stone while (std::getline (lineStream, line)) { 892ea671fbdSKate Stone if (line.empty()) { 893ea671fbdSKate Stone output_strm << "\n"; 894ea671fbdSKate Stone continue; 895ea671fbdSKate Stone } 896ea671fbdSKate Stone size_t result = line.find_first_not_of (" \t"); 897ea671fbdSKate Stone if (result == std::string::npos) { 898ea671fbdSKate Stone result = 0; 899ea671fbdSKate Stone } 900ea671fbdSKate Stone std::string whitespace_prefix = line.substr (0, result); 901ea671fbdSKate Stone std::string remainder = line.substr (result); 902ea671fbdSKate Stone interpreter.OutputFormattedHelpText(output_strm, whitespace_prefix.c_str(), remainder.c_str()); 903ea671fbdSKate Stone } 904ea671fbdSKate Stone } 905ea671fbdSKate Stone 906ea671fbdSKate Stone void 9079b62d1d5SEnrico Granata CommandObject::GenerateHelpText (CommandReturnObject &result) 9089b62d1d5SEnrico Granata { 9099b62d1d5SEnrico Granata GenerateHelpText(result.GetOutputStream()); 9109b62d1d5SEnrico Granata 9119b62d1d5SEnrico Granata result.SetStatus (eReturnStatusSuccessFinishNoResult); 9129b62d1d5SEnrico Granata } 9139b62d1d5SEnrico Granata 9149b62d1d5SEnrico Granata void 9159b62d1d5SEnrico Granata CommandObject::GenerateHelpText (Stream &output_strm) 9169b62d1d5SEnrico Granata { 9179b62d1d5SEnrico Granata CommandInterpreter& interpreter = GetCommandInterpreter(); 918d78c9576SEd Maste if (GetOptions() != nullptr) 9199b62d1d5SEnrico Granata { 9209b62d1d5SEnrico Granata if (WantsRawCommandString()) 9219b62d1d5SEnrico Granata { 9229b62d1d5SEnrico Granata std::string help_text (GetHelp()); 9239b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 9249b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 9259b62d1d5SEnrico Granata } 9269b62d1d5SEnrico Granata else 9279b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 9289b62d1d5SEnrico Granata output_strm.Printf ("\nSyntax: %s\n", GetSyntax()); 9299b62d1d5SEnrico Granata GetOptions()->GenerateOptionUsage (output_strm, this); 9309b62d1d5SEnrico Granata const char *long_help = GetHelpLong(); 931d78c9576SEd Maste if ((long_help != nullptr) 9329b62d1d5SEnrico Granata && (strlen (long_help) > 0)) 933ea671fbdSKate Stone FormatLongHelpText (output_strm, long_help); 934bfb75e9bSEnrico Granata if (!IsDashDashCommand()) 935bfb75e9bSEnrico Granata { 9369b62d1d5SEnrico Granata if (WantsRawCommandString() && !WantsCompletion()) 9379b62d1d5SEnrico Granata { 9389b62d1d5SEnrico Granata // Emit the message about using ' -- ' between the end of the command options and the raw input 9399b62d1d5SEnrico Granata // conditionally, i.e., only if the command object does not want completion. 9409b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", 9419b62d1d5SEnrico Granata "\nIMPORTANT NOTE: Because this command takes 'raw' input, if you use any command options" 9429b62d1d5SEnrico Granata " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1); 9439b62d1d5SEnrico Granata } 9449b62d1d5SEnrico Granata else if (GetNumArgumentEntries() > 0 9459b62d1d5SEnrico Granata && GetOptions() 9469b62d1d5SEnrico Granata && GetOptions()->NumCommandOptions() > 0) 9479b62d1d5SEnrico Granata { 9489b62d1d5SEnrico Granata // Also emit a warning about using "--" in case you are using a command that takes options and arguments. 9499b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", 9509b62d1d5SEnrico Granata "\nThis command takes options and free-form arguments. If your arguments resemble" 9519b62d1d5SEnrico Granata " option specifiers (i.e., they start with a - or --), you must use ' -- ' between" 9529b62d1d5SEnrico Granata " the end of the command options and the beginning of the arguments.", 1); 9539b62d1d5SEnrico Granata } 9549b62d1d5SEnrico Granata } 955bfb75e9bSEnrico Granata } 9569b62d1d5SEnrico Granata else if (IsMultiwordObject()) 9579b62d1d5SEnrico Granata { 9589b62d1d5SEnrico Granata if (WantsRawCommandString()) 9599b62d1d5SEnrico Granata { 9609b62d1d5SEnrico Granata std::string help_text (GetHelp()); 9619b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 9629b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 9639b62d1d5SEnrico Granata } 9649b62d1d5SEnrico Granata else 9659b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 9669b62d1d5SEnrico Granata GenerateHelpText (output_strm); 9679b62d1d5SEnrico Granata } 9689b62d1d5SEnrico Granata else 9699b62d1d5SEnrico Granata { 9709b62d1d5SEnrico Granata const char *long_help = GetHelpLong(); 971d78c9576SEd Maste if ((long_help != nullptr) 9729b62d1d5SEnrico Granata && (strlen (long_help) > 0)) 973ea671fbdSKate Stone FormatLongHelpText (output_strm, long_help); 9749b62d1d5SEnrico Granata else if (WantsRawCommandString()) 9759b62d1d5SEnrico Granata { 9769b62d1d5SEnrico Granata std::string help_text (GetHelp()); 9779b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 9789b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 9799b62d1d5SEnrico Granata } 9809b62d1d5SEnrico Granata else 9819b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 9829b62d1d5SEnrico Granata output_strm.Printf ("\nSyntax: %s\n", GetSyntax()); 9839b62d1d5SEnrico Granata } 9849b62d1d5SEnrico Granata } 9859b62d1d5SEnrico Granata 9869b62d1d5SEnrico Granata void 987de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange) 988184d7a72SJohnny Chen { 989184d7a72SJohnny Chen CommandArgumentData id_arg; 990184d7a72SJohnny Chen CommandArgumentData id_range_arg; 991184d7a72SJohnny Chen 992184d7a72SJohnny Chen // Create the first variant for the first (and only) argument for this command. 993de753464SJohnny Chen id_arg.arg_type = ID; 994184d7a72SJohnny Chen id_arg.arg_repetition = eArgRepeatOptional; 995184d7a72SJohnny Chen 996184d7a72SJohnny Chen // Create the second variant for the first (and only) argument for this command. 997de753464SJohnny Chen id_range_arg.arg_type = IDRange; 998184d7a72SJohnny Chen id_range_arg.arg_repetition = eArgRepeatOptional; 999184d7a72SJohnny Chen 1000a3234732SJohnny Chen // The first (and only) argument for this command could be either an id or an id_range. 1001184d7a72SJohnny Chen // Push both variants into the entry for the first argument for this command. 1002184d7a72SJohnny Chen arg.push_back(id_arg); 1003184d7a72SJohnny Chen arg.push_back(id_range_arg); 1004184d7a72SJohnny Chen } 1005184d7a72SJohnny Chen 10069d0402b1SGreg Clayton const char * 10079d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type) 10089d0402b1SGreg Clayton { 100948b475cbSZachary Turner assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentTypeAsCString"); 10109d0402b1SGreg Clayton return g_arguments_data[arg_type].arg_name; 10119d0402b1SGreg Clayton } 10129d0402b1SGreg Clayton 10139d0402b1SGreg Clayton const char * 10149d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type) 10159d0402b1SGreg Clayton { 101648b475cbSZachary Turner assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentDescriptionAsCString"); 10179d0402b1SGreg Clayton return g_arguments_data[arg_type].help_text; 10189d0402b1SGreg Clayton } 10199d0402b1SGreg Clayton 1020893c932aSJim Ingham Target * 1021893c932aSJim Ingham CommandObject::GetDummyTarget() 1022893c932aSJim Ingham { 1023893c932aSJim Ingham return m_interpreter.GetDebugger().GetDummyTarget(); 1024893c932aSJim Ingham } 1025893c932aSJim Ingham 1026893c932aSJim Ingham Target * 102733df7cd3SJim Ingham CommandObject::GetSelectedOrDummyTarget(bool prefer_dummy) 1028893c932aSJim Ingham { 102933df7cd3SJim Ingham return m_interpreter.GetDebugger().GetSelectedOrDummyTarget(prefer_dummy); 1030893c932aSJim Ingham } 1031893c932aSJim Ingham 10328d94ba0fSJim Ingham Thread * 10338d94ba0fSJim Ingham CommandObject::GetDefaultThread() 10348d94ba0fSJim Ingham { 10358d94ba0fSJim Ingham Thread *thread_to_use = m_exe_ctx.GetThreadPtr(); 10368d94ba0fSJim Ingham if (thread_to_use) 10378d94ba0fSJim Ingham return thread_to_use; 10388d94ba0fSJim Ingham 10398d94ba0fSJim Ingham Process *process = m_exe_ctx.GetProcessPtr(); 10408d94ba0fSJim Ingham if (!process) 10418d94ba0fSJim Ingham { 10428d94ba0fSJim Ingham Target *target = m_exe_ctx.GetTargetPtr(); 10438d94ba0fSJim Ingham if (!target) 10448d94ba0fSJim Ingham { 10458d94ba0fSJim Ingham target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 10468d94ba0fSJim Ingham } 10478d94ba0fSJim Ingham if (target) 10488d94ba0fSJim Ingham process = target->GetProcessSP().get(); 10498d94ba0fSJim Ingham } 10508d94ba0fSJim Ingham 10518d94ba0fSJim Ingham if (process) 10528d94ba0fSJim Ingham return process->GetThreadList().GetSelectedThread().get(); 10538d94ba0fSJim Ingham else 10548d94ba0fSJim Ingham return nullptr; 10558d94ba0fSJim Ingham } 10568d94ba0fSJim Ingham 10575a988416SJim Ingham bool 10585a988416SJim Ingham CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result) 10595a988416SJim Ingham { 10605a988416SJim Ingham bool handled = false; 10615a988416SJim Ingham Args cmd_args (args_string); 10623b652621SJim Ingham if (HasOverrideCallback()) 10635a988416SJim Ingham { 10645a988416SJim Ingham Args full_args (GetCommandName ()); 10655a988416SJim Ingham full_args.AppendArguments(cmd_args); 10663b652621SJim Ingham handled = InvokeOverrideCallback (full_args.GetConstArgumentVector(), result); 10675a988416SJim Ingham } 10685a988416SJim Ingham if (!handled) 10695a988416SJim Ingham { 10705a988416SJim Ingham for (size_t i = 0; i < cmd_args.GetArgumentCount(); ++i) 10715a988416SJim Ingham { 10725a988416SJim Ingham const char *tmp_str = cmd_args.GetArgumentAtIndex (i); 10735a988416SJim Ingham if (tmp_str[0] == '`') // back-quote 10745a988416SJim Ingham cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str)); 10755a988416SJim Ingham } 10765a988416SJim Ingham 1077f9fc609fSGreg Clayton if (CheckRequirements(result)) 1078f9fc609fSGreg Clayton { 1079f9fc609fSGreg Clayton if (ParseOptions (cmd_args, result)) 1080f9fc609fSGreg Clayton { 10815a988416SJim Ingham // Call the command-specific version of 'Execute', passing it the already processed arguments. 10825a988416SJim Ingham handled = DoExecute (cmd_args, result); 10835a988416SJim Ingham } 1084f9fc609fSGreg Clayton } 1085f9fc609fSGreg Clayton 1086f9fc609fSGreg Clayton Cleanup(); 1087f9fc609fSGreg Clayton } 10885a988416SJim Ingham return handled; 10895a988416SJim Ingham } 10905a988416SJim Ingham 10915a988416SJim Ingham bool 10925a988416SJim Ingham CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result) 10935a988416SJim Ingham { 10945a988416SJim Ingham bool handled = false; 10953b652621SJim Ingham if (HasOverrideCallback()) 10965a988416SJim Ingham { 10975a988416SJim Ingham std::string full_command (GetCommandName ()); 10985a988416SJim Ingham full_command += ' '; 10995a988416SJim Ingham full_command += args_string; 1100d78c9576SEd Maste const char *argv[2] = { nullptr, nullptr }; 11015a988416SJim Ingham argv[0] = full_command.c_str(); 11023b652621SJim Ingham handled = InvokeOverrideCallback (argv, result); 11035a988416SJim Ingham } 11045a988416SJim Ingham if (!handled) 11055a988416SJim Ingham { 1106f9fc609fSGreg Clayton if (CheckRequirements(result)) 11075a988416SJim Ingham handled = DoExecute (args_string, result); 1108f9fc609fSGreg Clayton 1109f9fc609fSGreg Clayton Cleanup(); 11105a988416SJim Ingham } 11115a988416SJim Ingham return handled; 11125a988416SJim Ingham } 11135a988416SJim Ingham 1114ca7835c6SJohnny Chen static 1115ca7835c6SJohnny Chen const char *arch_helper() 1116ca7835c6SJohnny Chen { 1117d70b14eaSGreg Clayton static StreamString g_archs_help; 1118797a1b37SJohnny Chen if (g_archs_help.Empty()) 1119d70b14eaSGreg Clayton { 1120ca7835c6SJohnny Chen StringList archs; 1121d78c9576SEd Maste ArchSpec::AutoComplete(nullptr, archs); 1122d70b14eaSGreg Clayton g_archs_help.Printf("These are the supported architecture names:\n"); 1123797a1b37SJohnny Chen archs.Join("\n", g_archs_help); 1124d70b14eaSGreg Clayton } 1125d70b14eaSGreg Clayton return g_archs_help.GetData(); 1126ca7835c6SJohnny Chen } 1127ca7835c6SJohnny Chen 1128e139cf23SCaroline Tice CommandObject::ArgumentTableEntry 1129e139cf23SCaroline Tice CommandObject::g_arguments_data[] = 1130e139cf23SCaroline Tice { 1131d78c9576SEd Maste { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid address in the target program's execution space." }, 1132d78c9576SEd Maste { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "An expression that resolves to an address." }, 1133d78c9576SEd Maste { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of an abbreviation (alias) for a debugger command." }, 1134d78c9576SEd Maste { eArgTypeAliasOptions, "options-for-aliased-command", CommandCompletions::eNoCompletion, { nullptr, false }, "Command options to be used as part of an alias (abbreviation) definition. (See 'help commands alias' for more information.)" }, 1135ca7835c6SJohnny Chen { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." }, 1136d78c9576SEd Maste { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { nullptr, false }, "A Boolean value: 'true' or 'false'" }, 1137d78c9576SEd Maste { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, nullptr }, 1138d78c9576SEd Maste { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, nullptr }, 11395e09c8c3SJim Ingham { eArgTypeBreakpointName, "breakpoint-name", CommandCompletions::eNoCompletion, { BreakpointNameHelpTextCallback, false }, nullptr }, 1140d78c9576SEd Maste { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { nullptr, false }, "Number of bytes to use." }, 1141d78c9576SEd Maste { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { nullptr, false }, "Then name of a class from the debug information in the program." }, 1142d78c9576SEd Maste { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A debugger command (may be multiple words), without any options or arguments." }, 1143d78c9576SEd Maste { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." }, 1144d78c9576SEd Maste { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { nullptr, false }, "A directory name." }, 1145d78c9576SEd Maste { eArgTypeDisassemblyFlavor, "disassembly-flavor", CommandCompletions::eNoCompletion, { nullptr, false }, "A disassembly flavor recognized by your disassembly plugin. Currently the only valid options are \"att\" and \"intel\" for Intel targets" }, 1146d78c9576SEd Maste { eArgTypeDescriptionVerbosity, "description-verbosity", CommandCompletions::eNoCompletion, { nullptr, false }, "How verbose the output of 'po' should be." }, 1147d78c9576SEd Maste { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1148d78c9576SEd Maste { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1149d78c9576SEd Maste { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, nullptr }, 1150d78c9576SEd Maste { eArgTypeExprFormat, "expression-format", CommandCompletions::eNoCompletion, { nullptr, false }, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]" }, 1151d78c9576SEd Maste { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "The name of a file (can include path)." }, 1152d78c9576SEd Maste { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, nullptr }, 1153d78c9576SEd Maste { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into a thread's list of frames." }, 1154d78c9576SEd Maste { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1155d78c9576SEd Maste { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function." }, 1156d78c9576SEd Maste { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function or symbol." }, 1157d78c9576SEd Maste { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, nullptr }, 1158735152e3SEnrico Granata { eArgTypeHelpText, "help-text", CommandCompletions::eNoCompletion, { nullptr, false }, "Text to be used as help for some other entity in LLDB" }, 1159d78c9576SEd Maste { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a list." }, 11607a67ee26SEnrico Granata { eArgTypeLanguage, "source-language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, nullptr }, 1161d78c9576SEd Maste { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { nullptr, false }, "Line number in a source file." }, 1162d78c9576SEd Maste { eArgTypeLogCategory, "log-category", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a category within a log channel, e.g. all (try \"log list\" to see a list of all channels and their categories." }, 1163d78c9576SEd Maste { eArgTypeLogChannel, "log-channel", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a log channel, e.g. process.gdb-remote (try \"log list\" to see a list of all channels and their categories)." }, 1164d78c9576SEd Maste { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { nullptr, false }, "A C++ method name." }, 1165d78c9576SEd Maste { eArgTypeName, "name", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1166d78c9576SEd Maste { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1167d78c9576SEd Maste { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of lines to use." }, 1168d78c9576SEd Maste { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of items per line to display." }, 1169d78c9576SEd Maste { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1170d78c9576SEd Maste { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1171d78c9576SEd Maste { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { nullptr, false }, "A command that is entered as a single line of text." }, 1172d78c9576SEd Maste { eArgTypePath, "path", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "Path." }, 1173d78c9576SEd Maste { eArgTypePermissionsNumber, "perms-numeric", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as an octal number (e.g. 755)." }, 1174d78c9576SEd Maste { eArgTypePermissionsString, "perms=string", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as a string value (e.g. rw-r-xr--)." }, 1175d78c9576SEd Maste { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { nullptr, false }, "The process ID number." }, 1176d78c9576SEd Maste { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1177d78c9576SEd Maste { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the process." }, 1178d78c9576SEd Maste { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python class." }, 1179d78c9576SEd Maste { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python function." }, 1180d78c9576SEd Maste { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { nullptr, false }, "Source code written in Python." }, 1181d78c9576SEd Maste { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the thread queue." }, 1182d78c9576SEd Maste { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, nullptr }, 1183d78c9576SEd Maste { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "A regular expression." }, 1184d78c9576SEd Maste { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { nullptr, false }, "Arguments to be passed to the target program when it starts executing." }, 1185d78c9576SEd Maste { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1186d78c9576SEd Maste { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { nullptr, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." }, 1187d78c9576SEd Maste { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { nullptr, false }, "The scripting language to be used for script-based commands. Currently only Python is valid." }, 1188d78c9576SEd Maste { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { nullptr, false }, "The word for which you wish to search for information about." }, 1189d78c9576SEd Maste { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { nullptr, false }, "An Objective-C selector name." }, 1190d78c9576SEd Maste { eArgTypeSettingIndex, "setting-index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a settings variable that is an array (try 'settings list' to see all the possible settings variables and their types)." }, 1191d78c9576SEd Maste { eArgTypeSettingKey, "setting-key", CommandCompletions::eNoCompletion, { nullptr, false }, "A key into a settings variables that is a dictionary (try 'settings list' to see all the possible settings variables and their types)." }, 1192d78c9576SEd Maste { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" }, 1193d78c9576SEd Maste { eArgTypeSettingVariableName, "setting-variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable. Type 'settings list' to see a complete list of such variables." }, 1194d78c9576SEd Maste { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a shared library." }, 1195d78c9576SEd Maste { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { nullptr, false }, "The name of a source file.." }, 1196d78c9576SEd Maste { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify a sort order when dumping lists." }, 1197d78c9576SEd Maste { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1198d78c9576SEd Maste { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, nullptr }, 1199d78c9576SEd Maste { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { nullptr, false }, "Any symbol name (function name, variable, argument, etc.)" }, 1200d78c9576SEd Maste { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Thread ID number." }, 1201d78c9576SEd Maste { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into the process' list of threads." }, 1202d78c9576SEd Maste { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The thread's name." }, 1203a72b31c7SJim Ingham { eArgTypeTypeName, "type-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A type name." }, 1204d78c9576SEd Maste { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." }, 1205d78c9576SEd Maste { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." }, 1206d78c9576SEd Maste { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a variable in your program." }, 1207d78c9576SEd Maste { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { nullptr, false }, "A value could be anything, depending on where and how it is used." }, 1208d78c9576SEd Maste { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1209d78c9576SEd Maste { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { nullptr, false }, "No help available for this." }, 1210d78c9576SEd Maste { eArgTypePlatform, "platform-name", CommandCompletions::ePlatformPluginCompletion, { nullptr, false }, "The name of an installed platform plug-in . Type 'platform list' to see a complete list of installed platforms." }, 1211d78c9576SEd Maste { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Watchpoint IDs are positive integers." }, 1212d78c9576SEd Maste { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { nullptr, false }, "For example, '1-3' or '1 to 3'." }, 1213d78c9576SEd Maste { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify the type for a watchpoint." } 1214e139cf23SCaroline Tice }; 1215e139cf23SCaroline Tice 1216e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry* 1217e139cf23SCaroline Tice CommandObject::GetArgumentTable () 1218e139cf23SCaroline Tice { 12199d0402b1SGreg Clayton // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration 12209d0402b1SGreg Clayton assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg); 1221e139cf23SCaroline Tice return CommandObject::g_arguments_data; 1222e139cf23SCaroline Tice } 1223e139cf23SCaroline Tice 1224e139cf23SCaroline Tice 1225