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 (), 56279a6c26SJim Ingham m_is_alias (false), 57e139cf23SCaroline Tice m_flags (flags), 58a9f7b79dSGreg Clayton m_arguments(), 596d8873f9SJim Ingham m_deprecated_command_override_callback (nullptr), 60d78c9576SEd Maste m_command_override_callback (nullptr), 61d78c9576SEd Maste m_command_override_baton (nullptr) 6230fdc8d8SChris Lattner { 6330fdc8d8SChris Lattner if (help && help[0]) 6430fdc8d8SChris Lattner m_cmd_help_short = help; 6530fdc8d8SChris Lattner if (syntax && syntax[0]) 6630fdc8d8SChris Lattner m_cmd_syntax = syntax; 6730fdc8d8SChris Lattner } 6830fdc8d8SChris Lattner 6930fdc8d8SChris Lattner CommandObject::~CommandObject () 7030fdc8d8SChris Lattner { 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner 7330fdc8d8SChris Lattner const char * 7430fdc8d8SChris Lattner CommandObject::GetHelp () 7530fdc8d8SChris Lattner { 7630fdc8d8SChris Lattner return m_cmd_help_short.c_str(); 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner const char * 8030fdc8d8SChris Lattner CommandObject::GetHelpLong () 8130fdc8d8SChris Lattner { 8230fdc8d8SChris Lattner return m_cmd_help_long.c_str(); 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner const char * 8630fdc8d8SChris Lattner CommandObject::GetSyntax () 8730fdc8d8SChris Lattner { 88e139cf23SCaroline Tice if (m_cmd_syntax.length() == 0) 89e139cf23SCaroline Tice { 90e139cf23SCaroline Tice StreamString syntax_str; 91e139cf23SCaroline Tice syntax_str.Printf ("%s", GetCommandName()); 92d78c9576SEd Maste if (GetOptions() != nullptr) 93e139cf23SCaroline Tice syntax_str.Printf (" <cmd-options>"); 94e139cf23SCaroline Tice if (m_arguments.size() > 0) 95e139cf23SCaroline Tice { 96e139cf23SCaroline Tice syntax_str.Printf (" "); 97ca5acdbeSEnrico Granata if (WantsRawCommandString() && GetOptions() && GetOptions()->NumCommandOptions()) 98a4c6ad19SSean Callanan syntax_str.Printf("-- "); 99e139cf23SCaroline Tice GetFormattedCommandArguments (syntax_str); 100e139cf23SCaroline Tice } 101e139cf23SCaroline Tice m_cmd_syntax = syntax_str.GetData (); 102e139cf23SCaroline Tice } 103e139cf23SCaroline Tice 10430fdc8d8SChris Lattner return m_cmd_syntax.c_str(); 10530fdc8d8SChris Lattner } 10630fdc8d8SChris Lattner 10730fdc8d8SChris Lattner const char * 10830fdc8d8SChris Lattner CommandObject::GetCommandName () 10930fdc8d8SChris Lattner { 11030fdc8d8SChris Lattner return m_cmd_name.c_str(); 11130fdc8d8SChris Lattner } 11230fdc8d8SChris Lattner 11330fdc8d8SChris Lattner void 11430fdc8d8SChris Lattner CommandObject::SetCommandName (const char *name) 11530fdc8d8SChris Lattner { 11630fdc8d8SChris Lattner m_cmd_name = name; 11730fdc8d8SChris Lattner } 11830fdc8d8SChris Lattner 11930fdc8d8SChris Lattner void 12030fdc8d8SChris Lattner CommandObject::SetHelp (const char *cstr) 12130fdc8d8SChris Lattner { 12230fdc8d8SChris Lattner m_cmd_help_short = cstr; 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 12530fdc8d8SChris Lattner void 1266f79bb2dSEnrico Granata CommandObject::SetHelp (std::string str) 1276f79bb2dSEnrico Granata { 1286f79bb2dSEnrico Granata m_cmd_help_short = str; 1296f79bb2dSEnrico Granata } 1306f79bb2dSEnrico Granata 1316f79bb2dSEnrico Granata void 13230fdc8d8SChris Lattner CommandObject::SetHelpLong (const char *cstr) 13330fdc8d8SChris Lattner { 13430fdc8d8SChris Lattner m_cmd_help_long = cstr; 13530fdc8d8SChris Lattner } 13630fdc8d8SChris Lattner 13730fdc8d8SChris Lattner void 13899f0b8f9SEnrico Granata CommandObject::SetHelpLong (std::string str) 13999f0b8f9SEnrico Granata { 14099f0b8f9SEnrico Granata m_cmd_help_long = str; 14199f0b8f9SEnrico Granata } 14299f0b8f9SEnrico Granata 14399f0b8f9SEnrico Granata void 14430fdc8d8SChris Lattner CommandObject::SetSyntax (const char *cstr) 14530fdc8d8SChris Lattner { 14630fdc8d8SChris Lattner m_cmd_syntax = cstr; 14730fdc8d8SChris Lattner } 14830fdc8d8SChris Lattner 14930fdc8d8SChris Lattner Options * 15030fdc8d8SChris Lattner CommandObject::GetOptions () 15130fdc8d8SChris Lattner { 15230fdc8d8SChris Lattner // By default commands don't have options unless this virtual function 15330fdc8d8SChris Lattner // is overridden by base classes. 154d78c9576SEd Maste return nullptr; 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner 15730fdc8d8SChris Lattner bool 15830fdc8d8SChris Lattner CommandObject::ParseOptions 15930fdc8d8SChris Lattner ( 16030fdc8d8SChris Lattner Args& args, 16130fdc8d8SChris Lattner CommandReturnObject &result 16230fdc8d8SChris Lattner ) 16330fdc8d8SChris Lattner { 16430fdc8d8SChris Lattner // See if the subclass has options? 16530fdc8d8SChris Lattner Options *options = GetOptions(); 166d78c9576SEd Maste if (options != nullptr) 16730fdc8d8SChris Lattner { 16830fdc8d8SChris Lattner Error error; 169f6b8b581SGreg Clayton options->NotifyOptionParsingStarting(); 17030fdc8d8SChris Lattner 171b7ad58a0SGreg Clayton // ParseOptions calls getopt_long_only, which always skips the zero'th item in the array and starts at position 1, 17230fdc8d8SChris Lattner // so we need to push a dummy value into position zero. 17330fdc8d8SChris Lattner args.Unshift("dummy_string"); 17430fdc8d8SChris Lattner error = args.ParseOptions (*options); 17530fdc8d8SChris Lattner 17630fdc8d8SChris Lattner // The "dummy_string" will have already been removed by ParseOptions, 17730fdc8d8SChris Lattner // so no need to remove it. 17830fdc8d8SChris Lattner 179f6b8b581SGreg Clayton if (error.Success()) 180f6b8b581SGreg Clayton error = options->NotifyOptionParsingFinished(); 181f6b8b581SGreg Clayton 182f6b8b581SGreg Clayton if (error.Success()) 183f6b8b581SGreg Clayton { 184f6b8b581SGreg Clayton if (options->VerifyOptions (result)) 185f6b8b581SGreg Clayton return true; 186f6b8b581SGreg Clayton } 187f6b8b581SGreg Clayton else 18830fdc8d8SChris Lattner { 18930fdc8d8SChris Lattner const char *error_cstr = error.AsCString(); 19030fdc8d8SChris Lattner if (error_cstr) 19130fdc8d8SChris Lattner { 19230fdc8d8SChris Lattner // We got an error string, lets use that 19386edbf41SGreg Clayton result.AppendError(error_cstr); 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner else 19630fdc8d8SChris Lattner { 19730fdc8d8SChris Lattner // No error string, output the usage information into result 198eb0103f2SGreg Clayton options->GenerateOptionUsage (result.GetErrorStream(), this); 19930fdc8d8SChris Lattner } 200f6b8b581SGreg Clayton } 20130fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 20230fdc8d8SChris Lattner return false; 20330fdc8d8SChris Lattner } 20430fdc8d8SChris Lattner return true; 20530fdc8d8SChris Lattner } 20630fdc8d8SChris Lattner 2075a988416SJim Ingham 2085a988416SJim Ingham 2095a988416SJim Ingham bool 210f9fc609fSGreg Clayton CommandObject::CheckRequirements (CommandReturnObject &result) 2115a988416SJim Ingham { 212f9fc609fSGreg Clayton #ifdef LLDB_CONFIGURATION_DEBUG 213f9fc609fSGreg Clayton // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx 214f9fc609fSGreg Clayton // has shared pointers to the target, process, thread and frame and we don't 215f9fc609fSGreg Clayton // want any CommandObject instances to keep any of these objects around 216f9fc609fSGreg Clayton // longer than for a single command. Every command should call 217f9fc609fSGreg Clayton // CommandObject::Cleanup() after it has completed 218f9fc609fSGreg Clayton assert (m_exe_ctx.GetTargetPtr() == NULL); 219f9fc609fSGreg Clayton assert (m_exe_ctx.GetProcessPtr() == NULL); 220f9fc609fSGreg Clayton assert (m_exe_ctx.GetThreadPtr() == NULL); 221f9fc609fSGreg Clayton assert (m_exe_ctx.GetFramePtr() == NULL); 222f9fc609fSGreg Clayton #endif 223f9fc609fSGreg Clayton 224f9fc609fSGreg Clayton // Lock down the interpreter's execution context prior to running the 225f9fc609fSGreg Clayton // command so we guarantee the selected target, process, thread and frame 226f9fc609fSGreg Clayton // can't go away during the execution 227f9fc609fSGreg Clayton m_exe_ctx = m_interpreter.GetExecutionContext(); 228f9fc609fSGreg Clayton 229f9fc609fSGreg Clayton const uint32_t flags = GetFlags().Get(); 230e87764f2SEnrico Granata if (flags & (eCommandRequiresTarget | 231e87764f2SEnrico Granata eCommandRequiresProcess | 232e87764f2SEnrico Granata eCommandRequiresThread | 233e87764f2SEnrico Granata eCommandRequiresFrame | 234e87764f2SEnrico Granata eCommandTryTargetAPILock )) 235f9fc609fSGreg Clayton { 236f9fc609fSGreg Clayton 237e87764f2SEnrico Granata if ((flags & eCommandRequiresTarget) && !m_exe_ctx.HasTargetScope()) 238f9fc609fSGreg Clayton { 239f9fc609fSGreg Clayton result.AppendError (GetInvalidTargetDescription()); 240f9fc609fSGreg Clayton return false; 241f9fc609fSGreg Clayton } 242f9fc609fSGreg Clayton 243e87764f2SEnrico Granata if ((flags & eCommandRequiresProcess) && !m_exe_ctx.HasProcessScope()) 244f9fc609fSGreg Clayton { 245e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 246e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 247e59b0d2cSJason Molenda else 248f9fc609fSGreg Clayton result.AppendError (GetInvalidProcessDescription()); 249f9fc609fSGreg Clayton return false; 250f9fc609fSGreg Clayton } 251f9fc609fSGreg Clayton 252e87764f2SEnrico Granata if ((flags & eCommandRequiresThread) && !m_exe_ctx.HasThreadScope()) 253f9fc609fSGreg Clayton { 254e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 255e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 256e59b0d2cSJason Molenda else if (!m_exe_ctx.HasProcessScope()) 257e59b0d2cSJason Molenda result.AppendError (GetInvalidProcessDescription()); 258e59b0d2cSJason Molenda else 259f9fc609fSGreg Clayton result.AppendError (GetInvalidThreadDescription()); 260f9fc609fSGreg Clayton return false; 261f9fc609fSGreg Clayton } 262f9fc609fSGreg Clayton 263e87764f2SEnrico Granata if ((flags & eCommandRequiresFrame) && !m_exe_ctx.HasFrameScope()) 264f9fc609fSGreg Clayton { 265e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 266e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 267e59b0d2cSJason Molenda else if (!m_exe_ctx.HasProcessScope()) 268e59b0d2cSJason Molenda result.AppendError (GetInvalidProcessDescription()); 269e59b0d2cSJason Molenda else if (!m_exe_ctx.HasThreadScope()) 270e59b0d2cSJason Molenda result.AppendError (GetInvalidThreadDescription()); 271e59b0d2cSJason Molenda else 272f9fc609fSGreg Clayton result.AppendError (GetInvalidFrameDescription()); 273f9fc609fSGreg Clayton return false; 274f9fc609fSGreg Clayton } 275f9fc609fSGreg Clayton 276e87764f2SEnrico Granata if ((flags & eCommandRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == nullptr)) 277f9fc609fSGreg Clayton { 278f9fc609fSGreg Clayton result.AppendError (GetInvalidRegContextDescription()); 279f9fc609fSGreg Clayton return false; 280f9fc609fSGreg Clayton } 281f9fc609fSGreg Clayton 282e87764f2SEnrico Granata if (flags & eCommandTryTargetAPILock) 283f9fc609fSGreg Clayton { 284f9fc609fSGreg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 285f9fc609fSGreg Clayton if (target) 2869b5442aeSGreg Clayton m_api_locker.Lock (target->GetAPIMutex()); 287f9fc609fSGreg Clayton } 288f9fc609fSGreg Clayton } 289f9fc609fSGreg Clayton 290e87764f2SEnrico Granata if (GetFlags().AnySet (eCommandProcessMustBeLaunched | eCommandProcessMustBePaused)) 291b766a73dSGreg Clayton { 292c14ee32dSGreg Clayton Process *process = m_interpreter.GetExecutionContext().GetProcessPtr(); 293d78c9576SEd Maste if (process == nullptr) 29430fdc8d8SChris Lattner { 295b8e8a5f3SJim Ingham // A process that is not running is considered paused. 296e87764f2SEnrico Granata if (GetFlags().Test(eCommandProcessMustBeLaunched)) 297b8e8a5f3SJim Ingham { 29830fdc8d8SChris Lattner result.AppendError ("Process must exist."); 29930fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 30030fdc8d8SChris Lattner return false; 30130fdc8d8SChris Lattner } 302b8e8a5f3SJim Ingham } 30330fdc8d8SChris Lattner else 30430fdc8d8SChris Lattner { 30530fdc8d8SChris Lattner StateType state = process->GetState(); 30630fdc8d8SChris Lattner switch (state) 30730fdc8d8SChris Lattner { 3087a5388bfSGreg Clayton case eStateInvalid: 30930fdc8d8SChris Lattner case eStateSuspended: 31030fdc8d8SChris Lattner case eStateCrashed: 31130fdc8d8SChris Lattner case eStateStopped: 31230fdc8d8SChris Lattner break; 31330fdc8d8SChris Lattner 314b766a73dSGreg Clayton case eStateConnected: 315b766a73dSGreg Clayton case eStateAttaching: 316b766a73dSGreg Clayton case eStateLaunching: 31730fdc8d8SChris Lattner case eStateDetached: 31830fdc8d8SChris Lattner case eStateExited: 31930fdc8d8SChris Lattner case eStateUnloaded: 320e87764f2SEnrico Granata if (GetFlags().Test(eCommandProcessMustBeLaunched)) 32130fdc8d8SChris Lattner { 32230fdc8d8SChris Lattner result.AppendError ("Process must be launched."); 32330fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 32430fdc8d8SChris Lattner return false; 32530fdc8d8SChris Lattner } 32630fdc8d8SChris Lattner break; 32730fdc8d8SChris Lattner 32830fdc8d8SChris Lattner case eStateRunning: 32930fdc8d8SChris Lattner case eStateStepping: 330e87764f2SEnrico Granata if (GetFlags().Test(eCommandProcessMustBePaused)) 33130fdc8d8SChris Lattner { 33230fdc8d8SChris Lattner result.AppendError ("Process is running. Use 'process interrupt' to pause execution."); 33330fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 33430fdc8d8SChris Lattner return false; 33530fdc8d8SChris Lattner } 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner } 338b766a73dSGreg Clayton } 3395a988416SJim Ingham return true; 34030fdc8d8SChris Lattner } 34130fdc8d8SChris Lattner 342f9fc609fSGreg Clayton void 343f9fc609fSGreg Clayton CommandObject::Cleanup () 344f9fc609fSGreg Clayton { 345f9fc609fSGreg Clayton m_exe_ctx.Clear(); 346f9fc609fSGreg Clayton m_api_locker.Unlock(); 347f9fc609fSGreg Clayton } 348f9fc609fSGreg Clayton 349f9fc609fSGreg Clayton 35030fdc8d8SChris Lattner class CommandDictCommandPartialMatch 35130fdc8d8SChris Lattner { 35230fdc8d8SChris Lattner public: 35330fdc8d8SChris Lattner CommandDictCommandPartialMatch (const char *match_str) 35430fdc8d8SChris Lattner { 35530fdc8d8SChris Lattner m_match_str = match_str; 35630fdc8d8SChris Lattner } 35730fdc8d8SChris Lattner bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const 35830fdc8d8SChris Lattner { 35930fdc8d8SChris Lattner // A NULL or empty string matches everything. 360d78c9576SEd Maste if (m_match_str == nullptr || *m_match_str == '\0') 361c7bece56SGreg Clayton return true; 36230fdc8d8SChris Lattner 363c7bece56SGreg Clayton return map_element.first.find (m_match_str, 0) == 0; 36430fdc8d8SChris Lattner } 36530fdc8d8SChris Lattner 36630fdc8d8SChris Lattner private: 36730fdc8d8SChris Lattner const char *m_match_str; 36830fdc8d8SChris Lattner }; 36930fdc8d8SChris Lattner 37030fdc8d8SChris Lattner int 37130fdc8d8SChris Lattner CommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str, 37230fdc8d8SChris Lattner StringList &matches) 37330fdc8d8SChris Lattner { 37430fdc8d8SChris Lattner int number_added = 0; 37530fdc8d8SChris Lattner CommandDictCommandPartialMatch matcher(cmd_str); 37630fdc8d8SChris Lattner 37730fdc8d8SChris Lattner CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher); 37830fdc8d8SChris Lattner 37930fdc8d8SChris Lattner while (matching_cmds != in_map.end()) 38030fdc8d8SChris Lattner { 38130fdc8d8SChris Lattner ++number_added; 38230fdc8d8SChris Lattner matches.AppendString((*matching_cmds).first.c_str()); 38330fdc8d8SChris Lattner matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);; 38430fdc8d8SChris Lattner } 38530fdc8d8SChris Lattner return number_added; 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner 38830fdc8d8SChris Lattner int 38930fdc8d8SChris Lattner CommandObject::HandleCompletion 39030fdc8d8SChris Lattner ( 39130fdc8d8SChris Lattner Args &input, 39230fdc8d8SChris Lattner int &cursor_index, 39330fdc8d8SChris Lattner int &cursor_char_position, 39430fdc8d8SChris Lattner int match_start_point, 39530fdc8d8SChris Lattner int max_return_elements, 396558ce124SJim Ingham bool &word_complete, 39730fdc8d8SChris Lattner StringList &matches 39830fdc8d8SChris Lattner ) 39930fdc8d8SChris Lattner { 400e171da5cSBruce Mitchener // Default implementation of WantsCompletion() is !WantsRawCommandString(). 4016561d15dSJohnny Chen // Subclasses who want raw command string but desire, for example, 4026561d15dSJohnny Chen // argument completion should override WantsCompletion() to return true, 4036561d15dSJohnny Chen // instead. 4046f99b637SJohnny Chen if (WantsRawCommandString() && !WantsCompletion()) 40530fdc8d8SChris Lattner { 40630fdc8d8SChris Lattner // FIXME: Abstract telling the completion to insert the completion character. 40730fdc8d8SChris Lattner matches.Clear(); 40830fdc8d8SChris Lattner return -1; 40930fdc8d8SChris Lattner } 41030fdc8d8SChris Lattner else 41130fdc8d8SChris Lattner { 41230fdc8d8SChris Lattner // Can we do anything generic with the options? 41330fdc8d8SChris Lattner Options *cur_options = GetOptions(); 41430fdc8d8SChris Lattner CommandReturnObject result; 41530fdc8d8SChris Lattner OptionElementVector opt_element_vector; 41630fdc8d8SChris Lattner 417d78c9576SEd Maste if (cur_options != nullptr) 41830fdc8d8SChris Lattner { 41930fdc8d8SChris Lattner // Re-insert the dummy command name string which will have been 42030fdc8d8SChris Lattner // stripped off: 42130fdc8d8SChris Lattner input.Unshift ("dummy-string"); 42230fdc8d8SChris Lattner cursor_index++; 42330fdc8d8SChris Lattner 42430fdc8d8SChris Lattner 42530fdc8d8SChris Lattner // I stick an element on the end of the input, because if the last element is 426b7ad58a0SGreg Clayton // option that requires an argument, getopt_long_only will freak out. 42730fdc8d8SChris Lattner 42830fdc8d8SChris Lattner input.AppendArgument ("<FAKE-VALUE>"); 42930fdc8d8SChris Lattner 430d43e0094SJim Ingham input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index); 43130fdc8d8SChris Lattner 43230fdc8d8SChris Lattner input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1); 43330fdc8d8SChris Lattner 43430fdc8d8SChris Lattner bool handled_by_options; 435eb0103f2SGreg Clayton handled_by_options = cur_options->HandleOptionCompletion (input, 43630fdc8d8SChris Lattner opt_element_vector, 43730fdc8d8SChris Lattner cursor_index, 43830fdc8d8SChris Lattner cursor_char_position, 43930fdc8d8SChris Lattner match_start_point, 44030fdc8d8SChris Lattner max_return_elements, 441558ce124SJim Ingham word_complete, 44230fdc8d8SChris Lattner matches); 44330fdc8d8SChris Lattner if (handled_by_options) 44430fdc8d8SChris Lattner return matches.GetSize(); 44530fdc8d8SChris Lattner } 44630fdc8d8SChris Lattner 44730fdc8d8SChris Lattner // If we got here, the last word is not an option or an option argument. 448a7015092SGreg Clayton return HandleArgumentCompletion (input, 44930fdc8d8SChris Lattner cursor_index, 45030fdc8d8SChris Lattner cursor_char_position, 45130fdc8d8SChris Lattner opt_element_vector, 45230fdc8d8SChris Lattner match_start_point, 45330fdc8d8SChris Lattner max_return_elements, 454558ce124SJim Ingham word_complete, 45530fdc8d8SChris Lattner matches); 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner } 45830fdc8d8SChris Lattner 45930fdc8d8SChris Lattner bool 460a7015092SGreg Clayton CommandObject::HelpTextContainsWord (const char *search_word) 46130fdc8d8SChris Lattner { 46230fdc8d8SChris Lattner std::string options_usage_help; 46330fdc8d8SChris Lattner 46430fdc8d8SChris Lattner bool found_word = false; 46530fdc8d8SChris Lattner 466998255bfSGreg Clayton const char *short_help = GetHelp(); 467998255bfSGreg Clayton const char *long_help = GetHelpLong(); 468998255bfSGreg Clayton const char *syntax_help = GetSyntax(); 46930fdc8d8SChris Lattner 470998255bfSGreg Clayton if (short_help && strcasestr (short_help, search_word)) 47130fdc8d8SChris Lattner found_word = true; 472998255bfSGreg Clayton else if (long_help && strcasestr (long_help, search_word)) 47330fdc8d8SChris Lattner found_word = true; 474998255bfSGreg Clayton else if (syntax_help && strcasestr (syntax_help, search_word)) 47530fdc8d8SChris Lattner found_word = true; 47630fdc8d8SChris Lattner 47730fdc8d8SChris Lattner if (!found_word 478d78c9576SEd Maste && GetOptions() != nullptr) 47930fdc8d8SChris Lattner { 48030fdc8d8SChris Lattner StreamString usage_help; 481eb0103f2SGreg Clayton GetOptions()->GenerateOptionUsage (usage_help, this); 48230fdc8d8SChris Lattner if (usage_help.GetSize() > 0) 48330fdc8d8SChris Lattner { 48430fdc8d8SChris Lattner const char *usage_text = usage_help.GetData(); 4854b6fbf37SCaroline Tice if (strcasestr (usage_text, search_word)) 48630fdc8d8SChris Lattner found_word = true; 48730fdc8d8SChris Lattner } 48830fdc8d8SChris Lattner } 48930fdc8d8SChris Lattner 49030fdc8d8SChris Lattner return found_word; 49130fdc8d8SChris Lattner } 492e139cf23SCaroline Tice 493e139cf23SCaroline Tice int 494e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries () 495e139cf23SCaroline Tice { 496e139cf23SCaroline Tice return m_arguments.size(); 497e139cf23SCaroline Tice } 498e139cf23SCaroline Tice 499e139cf23SCaroline Tice CommandObject::CommandArgumentEntry * 500e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx) 501e139cf23SCaroline Tice { 5023985c8c6SSaleem Abdulrasool if (static_cast<size_t>(idx) < m_arguments.size()) 503e139cf23SCaroline Tice return &(m_arguments[idx]); 504e139cf23SCaroline Tice 505d78c9576SEd Maste return nullptr; 506e139cf23SCaroline Tice } 507e139cf23SCaroline Tice 508d7e6a4f2SVince Harron const CommandObject::ArgumentTableEntry * 509e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type) 510e139cf23SCaroline Tice { 511e139cf23SCaroline Tice const ArgumentTableEntry *table = CommandObject::GetArgumentTable(); 512e139cf23SCaroline Tice 513e139cf23SCaroline Tice for (int i = 0; i < eArgTypeLastArg; ++i) 514e139cf23SCaroline Tice if (table[i].arg_type == arg_type) 515d7e6a4f2SVince Harron return &(table[i]); 516e139cf23SCaroline Tice 517d78c9576SEd Maste return nullptr; 518e139cf23SCaroline Tice } 519e139cf23SCaroline Tice 520e139cf23SCaroline Tice void 521e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter) 522e139cf23SCaroline Tice { 523e139cf23SCaroline Tice const ArgumentTableEntry* table = CommandObject::GetArgumentTable(); 524d7e6a4f2SVince Harron const ArgumentTableEntry *entry = &(table[arg_type]); 525e139cf23SCaroline Tice 526e139cf23SCaroline Tice // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up... 527e139cf23SCaroline Tice 528e139cf23SCaroline Tice if (entry->arg_type != arg_type) 529e139cf23SCaroline Tice entry = CommandObject::FindArgumentDataByType (arg_type); 530e139cf23SCaroline Tice 531e139cf23SCaroline Tice if (!entry) 532e139cf23SCaroline Tice return; 533e139cf23SCaroline Tice 534e139cf23SCaroline Tice StreamString name_str; 535e139cf23SCaroline Tice name_str.Printf ("<%s>", entry->arg_name); 536e139cf23SCaroline Tice 537fc7a7f3bSEnrico Granata if (entry->help_function) 53882a7d983SEnrico Granata { 539fc7a7f3bSEnrico Granata const char* help_text = entry->help_function(); 54082a7d983SEnrico Granata if (!entry->help_function.self_formatting) 54182a7d983SEnrico Granata { 54282a7d983SEnrico Granata interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text, 543e139cf23SCaroline Tice name_str.GetSize()); 54482a7d983SEnrico Granata } 54582a7d983SEnrico Granata else 54682a7d983SEnrico Granata { 54782a7d983SEnrico Granata interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text, 54882a7d983SEnrico Granata name_str.GetSize()); 54982a7d983SEnrico Granata } 55082a7d983SEnrico Granata } 551e139cf23SCaroline Tice else 552e139cf23SCaroline Tice interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize()); 553e139cf23SCaroline Tice } 554e139cf23SCaroline Tice 555e139cf23SCaroline Tice const char * 556e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type) 557e139cf23SCaroline Tice { 558d7e6a4f2SVince Harron const ArgumentTableEntry *entry = &(CommandObject::GetArgumentTable()[arg_type]); 559deaab222SCaroline Tice 560deaab222SCaroline Tice // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up... 561deaab222SCaroline Tice 562deaab222SCaroline Tice if (entry->arg_type != arg_type) 563deaab222SCaroline Tice entry = CommandObject::FindArgumentDataByType (arg_type); 564deaab222SCaroline Tice 565e6acf355SJohnny Chen if (entry) 566deaab222SCaroline Tice return entry->arg_name; 567e6acf355SJohnny Chen 568e6acf355SJohnny Chen StreamString str; 569e6acf355SJohnny Chen str << "Arg name for type (" << arg_type << ") not in arg table!"; 570e6acf355SJohnny Chen return str.GetData(); 571e139cf23SCaroline Tice } 572e139cf23SCaroline Tice 573405fe67fSCaroline Tice bool 574e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type) 575405fe67fSCaroline Tice { 576405fe67fSCaroline Tice if ((arg_repeat_type == eArgRepeatPairPlain) 577405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairOptional) 578405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairPlus) 579405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairStar) 580405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairRange) 581405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairRangeOptional)) 582405fe67fSCaroline Tice return true; 583405fe67fSCaroline Tice 584405fe67fSCaroline Tice return false; 585405fe67fSCaroline Tice } 586405fe67fSCaroline Tice 58734ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry 58834ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry) 58934ddc8dbSJohnny Chen { 59034ddc8dbSJohnny Chen CommandObject::CommandArgumentEntry ret_val; 59134ddc8dbSJohnny Chen for (unsigned i = 0; i < cmd_arg_entry.size(); ++i) 59234ddc8dbSJohnny Chen if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association) 59334ddc8dbSJohnny Chen ret_val.push_back(cmd_arg_entry[i]); 59434ddc8dbSJohnny Chen return ret_val; 59534ddc8dbSJohnny Chen } 59634ddc8dbSJohnny Chen 59734ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take 59834ddc8dbSJohnny Chen // all the argument data into account. On rare cases where some argument sticks 59934ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args. 600e139cf23SCaroline Tice void 60134ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask) 602e139cf23SCaroline Tice { 603e139cf23SCaroline Tice int num_args = m_arguments.size(); 604e139cf23SCaroline Tice for (int i = 0; i < num_args; ++i) 605e139cf23SCaroline Tice { 606e139cf23SCaroline Tice if (i > 0) 607e139cf23SCaroline Tice str.Printf (" "); 60834ddc8dbSJohnny Chen CommandArgumentEntry arg_entry = 60934ddc8dbSJohnny Chen opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i] 61034ddc8dbSJohnny Chen : OptSetFiltered(opt_set_mask, m_arguments[i]); 611e139cf23SCaroline Tice int num_alternatives = arg_entry.size(); 612405fe67fSCaroline Tice 613405fe67fSCaroline Tice if ((num_alternatives == 2) 614405fe67fSCaroline Tice && IsPairType (arg_entry[0].arg_repetition)) 615405fe67fSCaroline Tice { 616405fe67fSCaroline Tice const char *first_name = GetArgumentName (arg_entry[0].arg_type); 617405fe67fSCaroline Tice const char *second_name = GetArgumentName (arg_entry[1].arg_type); 618405fe67fSCaroline Tice switch (arg_entry[0].arg_repetition) 619405fe67fSCaroline Tice { 620405fe67fSCaroline Tice case eArgRepeatPairPlain: 621405fe67fSCaroline Tice str.Printf ("<%s> <%s>", first_name, second_name); 622405fe67fSCaroline Tice break; 623405fe67fSCaroline Tice case eArgRepeatPairOptional: 624405fe67fSCaroline Tice str.Printf ("[<%s> <%s>]", first_name, second_name); 625405fe67fSCaroline Tice break; 626405fe67fSCaroline Tice case eArgRepeatPairPlus: 627405fe67fSCaroline Tice str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name); 628405fe67fSCaroline Tice break; 629405fe67fSCaroline Tice case eArgRepeatPairStar: 630405fe67fSCaroline Tice str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name); 631405fe67fSCaroline Tice break; 632405fe67fSCaroline Tice case eArgRepeatPairRange: 633405fe67fSCaroline Tice str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name); 634405fe67fSCaroline Tice break; 635405fe67fSCaroline Tice case eArgRepeatPairRangeOptional: 636405fe67fSCaroline Tice str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name); 637405fe67fSCaroline Tice break; 638ca1176aaSCaroline Tice // Explicitly test for all the rest of the cases, so if new types get added we will notice the 639ca1176aaSCaroline Tice // missing case statement(s). 640ca1176aaSCaroline Tice case eArgRepeatPlain: 641ca1176aaSCaroline Tice case eArgRepeatOptional: 642ca1176aaSCaroline Tice case eArgRepeatPlus: 643ca1176aaSCaroline Tice case eArgRepeatStar: 644ca1176aaSCaroline Tice case eArgRepeatRange: 645ca1176aaSCaroline Tice // These should not be reached, as they should fail the IsPairType test above. 646ca1176aaSCaroline Tice break; 647405fe67fSCaroline Tice } 648405fe67fSCaroline Tice } 649405fe67fSCaroline Tice else 650405fe67fSCaroline Tice { 651e139cf23SCaroline Tice StreamString names; 652e139cf23SCaroline Tice for (int j = 0; j < num_alternatives; ++j) 653e139cf23SCaroline Tice { 654e139cf23SCaroline Tice if (j > 0) 655e139cf23SCaroline Tice names.Printf (" | "); 656e139cf23SCaroline Tice names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type)); 657e139cf23SCaroline Tice } 658e139cf23SCaroline Tice switch (arg_entry[0].arg_repetition) 659e139cf23SCaroline Tice { 660e139cf23SCaroline Tice case eArgRepeatPlain: 661e139cf23SCaroline Tice str.Printf ("<%s>", names.GetData()); 662e139cf23SCaroline Tice break; 663e139cf23SCaroline Tice case eArgRepeatPlus: 664e139cf23SCaroline Tice str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData()); 665e139cf23SCaroline Tice break; 666e139cf23SCaroline Tice case eArgRepeatStar: 667e139cf23SCaroline Tice str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData()); 668e139cf23SCaroline Tice break; 669e139cf23SCaroline Tice case eArgRepeatOptional: 670e139cf23SCaroline Tice str.Printf ("[<%s>]", names.GetData()); 671e139cf23SCaroline Tice break; 672405fe67fSCaroline Tice case eArgRepeatRange: 673fd54b368SJason Molenda str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData()); 674ca1176aaSCaroline Tice break; 675ca1176aaSCaroline Tice // Explicitly test for all the rest of the cases, so if new types get added we will notice the 676ca1176aaSCaroline Tice // missing case statement(s). 677ca1176aaSCaroline Tice case eArgRepeatPairPlain: 678ca1176aaSCaroline Tice case eArgRepeatPairOptional: 679ca1176aaSCaroline Tice case eArgRepeatPairPlus: 680ca1176aaSCaroline Tice case eArgRepeatPairStar: 681ca1176aaSCaroline Tice case eArgRepeatPairRange: 682ca1176aaSCaroline Tice case eArgRepeatPairRangeOptional: 683ca1176aaSCaroline Tice // These should not be hit, as they should pass the IsPairType test above, and control should 684ca1176aaSCaroline Tice // have gone into the other branch of the if statement. 685ca1176aaSCaroline Tice break; 686405fe67fSCaroline Tice } 687e139cf23SCaroline Tice } 688e139cf23SCaroline Tice } 689e139cf23SCaroline Tice } 690e139cf23SCaroline Tice 6910c16aa6dSStephen Wilson CommandArgumentType 692e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name) 693e139cf23SCaroline Tice { 694e139cf23SCaroline Tice CommandArgumentType return_type = eArgTypeLastArg; 695e139cf23SCaroline Tice 696e139cf23SCaroline Tice std::string arg_name_str (arg_name); 697e139cf23SCaroline Tice size_t len = arg_name_str.length(); 698e139cf23SCaroline Tice if (arg_name[0] == '<' 699e139cf23SCaroline Tice && arg_name[len-1] == '>') 700e139cf23SCaroline Tice arg_name_str = arg_name_str.substr (1, len-2); 701e139cf23SCaroline Tice 702331eff39SJohnny Chen const ArgumentTableEntry *table = GetArgumentTable(); 703e139cf23SCaroline Tice for (int i = 0; i < eArgTypeLastArg; ++i) 704331eff39SJohnny Chen if (arg_name_str.compare (table[i].arg_name) == 0) 705e139cf23SCaroline Tice return_type = g_arguments_data[i].arg_type; 706e139cf23SCaroline Tice 707e139cf23SCaroline Tice return return_type; 708e139cf23SCaroline Tice } 709e139cf23SCaroline Tice 710e139cf23SCaroline Tice static const char * 711931e674aSJim Ingham RegisterNameHelpTextCallback () 712931e674aSJim Ingham { 713931e674aSJim Ingham return "Register names can be specified using the architecture specific names. " 71484c7bd74SJim Ingham "They can also be specified using generic names. Not all generic entities have " 71584c7bd74SJim Ingham "registers backing them on all architectures. When they don't the generic name " 71684c7bd74SJim Ingham "will return an error.\n" 717931e674aSJim Ingham "The generic names defined in lldb are:\n" 718931e674aSJim Ingham "\n" 719931e674aSJim Ingham "pc - program counter register\n" 720931e674aSJim Ingham "ra - return address register\n" 721931e674aSJim Ingham "fp - frame pointer register\n" 722931e674aSJim Ingham "sp - stack pointer register\n" 72384c7bd74SJim Ingham "flags - the flags register\n" 724931e674aSJim Ingham "arg{1-6} - integer argument passing registers.\n"; 725931e674aSJim Ingham } 726931e674aSJim Ingham 727931e674aSJim Ingham static const char * 728e139cf23SCaroline Tice BreakpointIDHelpTextCallback () 729e139cf23SCaroline Tice { 73086edbf41SGreg Clayton return "Breakpoint ID's consist major and minor numbers; the major number " 73186edbf41SGreg Clayton "corresponds to the single entity that was created with a 'breakpoint set' " 73286edbf41SGreg Clayton "command; the minor numbers correspond to all the locations that were actually " 73386edbf41SGreg Clayton "found/set based on the major breakpoint. A full breakpoint ID might look like " 73486edbf41SGreg Clayton "3.14, meaning the 14th location set for the 3rd breakpoint. You can specify " 73586edbf41SGreg Clayton "all the locations of a breakpoint by just indicating the major breakpoint " 73686edbf41SGreg Clayton "number. A valid breakpoint id consists either of just the major id number, " 73786edbf41SGreg Clayton "or the major number, a dot, and the location number (e.g. 3 or 3.2 could " 73886edbf41SGreg Clayton "both be valid breakpoint ids)."; 739e139cf23SCaroline Tice } 740e139cf23SCaroline Tice 741e139cf23SCaroline Tice static const char * 742e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback () 743e139cf23SCaroline Tice { 74486edbf41SGreg Clayton return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. " 74586edbf41SGreg Clayton "This can be done through several mechanisms. The easiest way is to just " 74686edbf41SGreg Clayton "enter a space-separated list of breakpoint ids. To specify all the " 74786edbf41SGreg Clayton "breakpoint locations under a major breakpoint, you can use the major " 74886edbf41SGreg Clayton "breakpoint number followed by '.*', eg. '5.*' means all the locations under " 74986edbf41SGreg Clayton "breakpoint 5. You can also indicate a range of breakpoints by using " 75086edbf41SGreg Clayton "<start-bp-id> - <end-bp-id>. The start-bp-id and end-bp-id for a range can " 75186edbf41SGreg Clayton "be any valid breakpoint ids. It is not legal, however, to specify a range " 75286edbf41SGreg Clayton "using specific locations that cross major breakpoint numbers. I.e. 3.2 - 3.7" 75386edbf41SGreg Clayton " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal."; 75486edbf41SGreg Clayton } 75586edbf41SGreg Clayton 75686edbf41SGreg Clayton static const char * 7575e09c8c3SJim Ingham BreakpointNameHelpTextCallback () 7585e09c8c3SJim Ingham { 7595e09c8c3SJim Ingham return "A name that can be added to a breakpoint when it is created, or later " 7605e09c8c3SJim Ingham "on with the \"breakpoint name add\" command. " 7615e09c8c3SJim Ingham "Breakpoint names can be used to specify breakpoints in all the places breakpoint ID's " 7625e09c8c3SJim Ingham "and breakpoint ID ranges can be used. As such they provide a convenient way to group breakpoints, " 7635e09c8c3SJim Ingham "and to operate on breakpoints you create without having to track the breakpoint number. " 7645e09c8c3SJim Ingham "Note, the attributes you set when using a breakpoint name in a breakpoint command don't " 7655e09c8c3SJim Ingham "adhere to the name, but instead are set individually on all the breakpoints currently tagged with that name. Future breakpoints " 7665e09c8c3SJim Ingham "tagged with that name will not pick up the attributes previously given using that name. " 7675e09c8c3SJim Ingham "In order to distinguish breakpoint names from breakpoint ID's and ranges, " 7685e09c8c3SJim Ingham "names must start with a letter from a-z or A-Z and cannot contain spaces, \".\" or \"-\". " 7695e09c8c3SJim Ingham "Also, breakpoint names can only be applied to breakpoints, not to breakpoint locations."; 7705e09c8c3SJim Ingham } 7715e09c8c3SJim Ingham 7725e09c8c3SJim Ingham static const char * 77386edbf41SGreg Clayton GDBFormatHelpTextCallback () 77486edbf41SGreg Clayton { 775f91381e8SGreg Clayton return "A GDB format consists of a repeat count, a format letter and a size letter. " 776f91381e8SGreg Clayton "The repeat count is optional and defaults to 1. The format letter is optional " 777f91381e8SGreg Clayton "and defaults to the previous format that was used. The size letter is optional " 778f91381e8SGreg Clayton "and defaults to the previous size that was used.\n" 779f91381e8SGreg Clayton "\n" 780f91381e8SGreg Clayton "Format letters include:\n" 781f91381e8SGreg Clayton "o - octal\n" 782f91381e8SGreg Clayton "x - hexadecimal\n" 783f91381e8SGreg Clayton "d - decimal\n" 784f91381e8SGreg Clayton "u - unsigned decimal\n" 785f91381e8SGreg Clayton "t - binary\n" 786f91381e8SGreg Clayton "f - float\n" 787f91381e8SGreg Clayton "a - address\n" 788f91381e8SGreg Clayton "i - instruction\n" 789f91381e8SGreg Clayton "c - char\n" 790f91381e8SGreg Clayton "s - string\n" 791f91381e8SGreg Clayton "T - OSType\n" 792f91381e8SGreg Clayton "A - float as hex\n" 793f91381e8SGreg Clayton "\n" 794f91381e8SGreg Clayton "Size letters include:\n" 795f91381e8SGreg Clayton "b - 1 byte (byte)\n" 796f91381e8SGreg Clayton "h - 2 bytes (halfword)\n" 797f91381e8SGreg Clayton "w - 4 bytes (word)\n" 798f91381e8SGreg Clayton "g - 8 bytes (giant)\n" 799f91381e8SGreg Clayton "\n" 800f91381e8SGreg Clayton "Example formats:\n" 801f91381e8SGreg Clayton "32xb - show 32 1 byte hexadecimal integer values\n" 802f91381e8SGreg Clayton "16xh - show 16 2 byte hexadecimal integer values\n" 803f91381e8SGreg Clayton "64 - show 64 2 byte hexadecimal integer values (format and size from the last format)\n" 804f91381e8SGreg Clayton "dw - show 1 4 byte decimal integer value\n" 805f91381e8SGreg Clayton ; 806e139cf23SCaroline Tice } 807e139cf23SCaroline Tice 8080a3958e0SEnrico Granata static const char * 8090a3958e0SEnrico Granata FormatHelpTextCallback () 8100a3958e0SEnrico Granata { 81182a7d983SEnrico Granata 812d78c9576SEd Maste static char* help_text_ptr = nullptr; 81382a7d983SEnrico Granata 81482a7d983SEnrico Granata if (help_text_ptr) 81582a7d983SEnrico Granata return help_text_ptr; 81682a7d983SEnrico Granata 8170a3958e0SEnrico Granata StreamString sstr; 8180a3958e0SEnrico Granata sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n"; 8190a3958e0SEnrico Granata for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1)) 8200a3958e0SEnrico Granata { 82182a7d983SEnrico Granata if (f != eFormatDefault) 82282a7d983SEnrico Granata sstr.PutChar('\n'); 82382a7d983SEnrico Granata 8240a3958e0SEnrico Granata char format_char = FormatManager::GetFormatAsFormatChar(f); 8250a3958e0SEnrico Granata if (format_char) 8260a3958e0SEnrico Granata sstr.Printf("'%c' or ", format_char); 8270a3958e0SEnrico Granata 82882a7d983SEnrico Granata sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f)); 8290a3958e0SEnrico Granata } 8300a3958e0SEnrico Granata 8310a3958e0SEnrico Granata sstr.Flush(); 8320a3958e0SEnrico Granata 8330a3958e0SEnrico Granata std::string data = sstr.GetString(); 8340a3958e0SEnrico Granata 83582a7d983SEnrico Granata help_text_ptr = new char[data.length()+1]; 8360a3958e0SEnrico Granata 83782a7d983SEnrico Granata data.copy(help_text_ptr, data.length()); 8380a3958e0SEnrico Granata 83982a7d983SEnrico Granata return help_text_ptr; 8400a3958e0SEnrico Granata } 8410a3958e0SEnrico Granata 8420a3958e0SEnrico Granata static const char * 843d9477397SSean Callanan LanguageTypeHelpTextCallback () 844d9477397SSean Callanan { 845d78c9576SEd Maste static char* help_text_ptr = nullptr; 846d9477397SSean Callanan 847d9477397SSean Callanan if (help_text_ptr) 848d9477397SSean Callanan return help_text_ptr; 849d9477397SSean Callanan 850d9477397SSean Callanan StreamString sstr; 851d9477397SSean Callanan sstr << "One of the following languages:\n"; 852d9477397SSean Callanan 8530e0984eeSJim Ingham Language::PrintAllLanguages(sstr, " ", "\n"); 854d9477397SSean Callanan 855d9477397SSean Callanan sstr.Flush(); 856d9477397SSean Callanan 857d9477397SSean Callanan std::string data = sstr.GetString(); 858d9477397SSean Callanan 859d9477397SSean Callanan help_text_ptr = new char[data.length()+1]; 860d9477397SSean Callanan 861d9477397SSean Callanan data.copy(help_text_ptr, data.length()); 862d9477397SSean Callanan 863d9477397SSean Callanan return help_text_ptr; 864d9477397SSean Callanan } 865d9477397SSean Callanan 866d9477397SSean Callanan static const char * 86782a7d983SEnrico Granata SummaryStringHelpTextCallback() 8680a3958e0SEnrico Granata { 86982a7d983SEnrico Granata return 87082a7d983SEnrico Granata "A summary string is a way to extract information from variables in order to present them using a summary.\n" 87182a7d983SEnrico Granata "Summary strings contain static text, variables, scopes and control sequences:\n" 87282a7d983SEnrico Granata " - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n" 87382a7d983SEnrico Granata " - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n" 87482a7d983SEnrico 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" 87582a7d983SEnrico Granata " - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n" 87682a7d983SEnrico 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" 87782a7d983SEnrico 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" 87882a7d983SEnrico 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" 87982a7d983SEnrico 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" 8809128ee2fSEnrico 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." 8819128ee2fSEnrico 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" 88282a7d983SEnrico 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." 88382a7d983SEnrico 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" 88482a7d983SEnrico Granata " path refers to:\n" 88582a7d983SEnrico 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" 88682a7d983SEnrico Granata " and displayed as an individual variable\n" 88782a7d983SEnrico 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" 88882a7d983SEnrico 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" 8899128ee2fSEnrico 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" 8909128ee2fSEnrico 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" 8919128ee2fSEnrico Granata " special symbols only allowed as part of a variable:\n" 8929128ee2fSEnrico Granata " %V: show the value of the object by default\n" 8939128ee2fSEnrico Granata " %S: show the summary of the object by default\n" 8949128ee2fSEnrico Granata " %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n" 8959128ee2fSEnrico Granata " %L: show the location of the object (memory address or a register name)\n" 8969128ee2fSEnrico Granata " %#: show the number of children of the object\n" 8979128ee2fSEnrico Granata " %T: show the type of the object\n" 8989128ee2fSEnrico 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" 8999128ee2fSEnrico 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" 9009128ee2fSEnrico Granata " count the number of actual elements stored in an std::list:\n" 9019128ee2fSEnrico Granata "type summary add -s \"${svar%#}\" -x \"std::list<\""; 9029128ee2fSEnrico Granata } 9039128ee2fSEnrico Granata 9049128ee2fSEnrico Granata static const char * 9059128ee2fSEnrico Granata ExprPathHelpTextCallback() 9069128ee2fSEnrico Granata { 9079128ee2fSEnrico Granata return 9089128ee2fSEnrico 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" 9099128ee2fSEnrico Granata "For instance, given a class:\n" 9109128ee2fSEnrico Granata " class foo {\n" 9119128ee2fSEnrico Granata " int a;\n" 9129128ee2fSEnrico Granata " int b; .\n" 9139128ee2fSEnrico Granata " foo* next;\n" 9149128ee2fSEnrico Granata " };\n" 9159128ee2fSEnrico Granata "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n" 9169128ee2fSEnrico 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" 9179128ee2fSEnrico 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" 9189128ee2fSEnrico Granata "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n" 9199128ee2fSEnrico 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" 9209128ee2fSEnrico 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" 9219128ee2fSEnrico 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" 9229128ee2fSEnrico 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" 9239128ee2fSEnrico Granata " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory)."; 9240a3958e0SEnrico Granata } 9250a3958e0SEnrico Granata 926184d7a72SJohnny Chen void 927ea671fbdSKate Stone CommandObject::FormatLongHelpText (Stream &output_strm, const char *long_help) 928ea671fbdSKate Stone { 929ea671fbdSKate Stone CommandInterpreter& interpreter = GetCommandInterpreter(); 930ea671fbdSKate Stone std::stringstream lineStream (long_help); 931ea671fbdSKate Stone std::string line; 932ea671fbdSKate Stone while (std::getline (lineStream, line)) { 933ea671fbdSKate Stone if (line.empty()) { 934ea671fbdSKate Stone output_strm << "\n"; 935ea671fbdSKate Stone continue; 936ea671fbdSKate Stone } 937ea671fbdSKate Stone size_t result = line.find_first_not_of (" \t"); 938ea671fbdSKate Stone if (result == std::string::npos) { 939ea671fbdSKate Stone result = 0; 940ea671fbdSKate Stone } 941ea671fbdSKate Stone std::string whitespace_prefix = line.substr (0, result); 942ea671fbdSKate Stone std::string remainder = line.substr (result); 943ea671fbdSKate Stone interpreter.OutputFormattedHelpText(output_strm, whitespace_prefix.c_str(), remainder.c_str()); 944ea671fbdSKate Stone } 945ea671fbdSKate Stone } 946ea671fbdSKate Stone 947ea671fbdSKate Stone void 9489b62d1d5SEnrico Granata CommandObject::GenerateHelpText (CommandReturnObject &result) 9499b62d1d5SEnrico Granata { 9509b62d1d5SEnrico Granata GenerateHelpText(result.GetOutputStream()); 9519b62d1d5SEnrico Granata 9529b62d1d5SEnrico Granata result.SetStatus (eReturnStatusSuccessFinishNoResult); 9539b62d1d5SEnrico Granata } 9549b62d1d5SEnrico Granata 9559b62d1d5SEnrico Granata void 9569b62d1d5SEnrico Granata CommandObject::GenerateHelpText (Stream &output_strm) 9579b62d1d5SEnrico Granata { 9589b62d1d5SEnrico Granata CommandInterpreter& interpreter = GetCommandInterpreter(); 959d78c9576SEd Maste if (GetOptions() != nullptr) 9609b62d1d5SEnrico Granata { 9619b62d1d5SEnrico Granata if (WantsRawCommandString()) 9629b62d1d5SEnrico Granata { 9639b62d1d5SEnrico Granata std::string help_text (GetHelp()); 9649b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 9659b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 9669b62d1d5SEnrico Granata } 9679b62d1d5SEnrico Granata else 9689b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 9699b62d1d5SEnrico Granata output_strm.Printf ("\nSyntax: %s\n", GetSyntax()); 9709b62d1d5SEnrico Granata GetOptions()->GenerateOptionUsage (output_strm, this); 9719b62d1d5SEnrico Granata const char *long_help = GetHelpLong(); 972d78c9576SEd Maste if ((long_help != nullptr) 9739b62d1d5SEnrico Granata && (strlen (long_help) > 0)) 974ea671fbdSKate Stone FormatLongHelpText (output_strm, long_help); 9759b62d1d5SEnrico Granata if (WantsRawCommandString() && !WantsCompletion()) 9769b62d1d5SEnrico Granata { 9779b62d1d5SEnrico Granata // Emit the message about using ' -- ' between the end of the command options and the raw input 9789b62d1d5SEnrico Granata // conditionally, i.e., only if the command object does not want completion. 9799b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", 9809b62d1d5SEnrico Granata "\nIMPORTANT NOTE: Because this command takes 'raw' input, if you use any command options" 9819b62d1d5SEnrico Granata " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1); 9829b62d1d5SEnrico Granata } 9839b62d1d5SEnrico Granata else if (GetNumArgumentEntries() > 0 9849b62d1d5SEnrico Granata && GetOptions() 9859b62d1d5SEnrico Granata && GetOptions()->NumCommandOptions() > 0) 9869b62d1d5SEnrico Granata { 9879b62d1d5SEnrico Granata // Also emit a warning about using "--" in case you are using a command that takes options and arguments. 9889b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", 9899b62d1d5SEnrico Granata "\nThis command takes options and free-form arguments. If your arguments resemble" 9909b62d1d5SEnrico Granata " option specifiers (i.e., they start with a - or --), you must use ' -- ' between" 9919b62d1d5SEnrico Granata " the end of the command options and the beginning of the arguments.", 1); 9929b62d1d5SEnrico Granata } 9939b62d1d5SEnrico Granata } 9949b62d1d5SEnrico Granata else if (IsMultiwordObject()) 9959b62d1d5SEnrico Granata { 9969b62d1d5SEnrico Granata if (WantsRawCommandString()) 9979b62d1d5SEnrico Granata { 9989b62d1d5SEnrico Granata std::string help_text (GetHelp()); 9999b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 10009b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 10019b62d1d5SEnrico Granata } 10029b62d1d5SEnrico Granata else 10039b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 10049b62d1d5SEnrico Granata GenerateHelpText (output_strm); 10059b62d1d5SEnrico Granata } 10069b62d1d5SEnrico Granata else 10079b62d1d5SEnrico Granata { 10089b62d1d5SEnrico Granata const char *long_help = GetHelpLong(); 1009d78c9576SEd Maste if ((long_help != nullptr) 10109b62d1d5SEnrico Granata && (strlen (long_help) > 0)) 1011ea671fbdSKate Stone FormatLongHelpText (output_strm, long_help); 10129b62d1d5SEnrico Granata else if (WantsRawCommandString()) 10139b62d1d5SEnrico Granata { 10149b62d1d5SEnrico Granata std::string help_text (GetHelp()); 10159b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 10169b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 10179b62d1d5SEnrico Granata } 10189b62d1d5SEnrico Granata else 10199b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 10209b62d1d5SEnrico Granata output_strm.Printf ("\nSyntax: %s\n", GetSyntax()); 10219b62d1d5SEnrico Granata } 10229b62d1d5SEnrico Granata } 10239b62d1d5SEnrico Granata 10249b62d1d5SEnrico Granata void 1025de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange) 1026184d7a72SJohnny Chen { 1027184d7a72SJohnny Chen CommandArgumentData id_arg; 1028184d7a72SJohnny Chen CommandArgumentData id_range_arg; 1029184d7a72SJohnny Chen 1030184d7a72SJohnny Chen // Create the first variant for the first (and only) argument for this command. 1031de753464SJohnny Chen id_arg.arg_type = ID; 1032184d7a72SJohnny Chen id_arg.arg_repetition = eArgRepeatOptional; 1033184d7a72SJohnny Chen 1034184d7a72SJohnny Chen // Create the second variant for the first (and only) argument for this command. 1035de753464SJohnny Chen id_range_arg.arg_type = IDRange; 1036184d7a72SJohnny Chen id_range_arg.arg_repetition = eArgRepeatOptional; 1037184d7a72SJohnny Chen 1038a3234732SJohnny Chen // The first (and only) argument for this command could be either an id or an id_range. 1039184d7a72SJohnny Chen // Push both variants into the entry for the first argument for this command. 1040184d7a72SJohnny Chen arg.push_back(id_arg); 1041184d7a72SJohnny Chen arg.push_back(id_range_arg); 1042184d7a72SJohnny Chen } 1043184d7a72SJohnny Chen 10449d0402b1SGreg Clayton const char * 10459d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type) 10469d0402b1SGreg Clayton { 104748b475cbSZachary Turner assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentTypeAsCString"); 10489d0402b1SGreg Clayton return g_arguments_data[arg_type].arg_name; 10499d0402b1SGreg Clayton } 10509d0402b1SGreg Clayton 10519d0402b1SGreg Clayton const char * 10529d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type) 10539d0402b1SGreg Clayton { 105448b475cbSZachary Turner assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentDescriptionAsCString"); 10559d0402b1SGreg Clayton return g_arguments_data[arg_type].help_text; 10569d0402b1SGreg Clayton } 10579d0402b1SGreg Clayton 1058893c932aSJim Ingham Target * 1059893c932aSJim Ingham CommandObject::GetDummyTarget() 1060893c932aSJim Ingham { 1061893c932aSJim Ingham return m_interpreter.GetDebugger().GetDummyTarget(); 1062893c932aSJim Ingham } 1063893c932aSJim Ingham 1064893c932aSJim Ingham Target * 106533df7cd3SJim Ingham CommandObject::GetSelectedOrDummyTarget(bool prefer_dummy) 1066893c932aSJim Ingham { 106733df7cd3SJim Ingham return m_interpreter.GetDebugger().GetSelectedOrDummyTarget(prefer_dummy); 1068893c932aSJim Ingham } 1069893c932aSJim Ingham 10705a988416SJim Ingham bool 10715a988416SJim Ingham CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result) 10725a988416SJim Ingham { 10735a988416SJim Ingham bool handled = false; 10745a988416SJim Ingham Args cmd_args (args_string); 10753b652621SJim Ingham if (HasOverrideCallback()) 10765a988416SJim Ingham { 10775a988416SJim Ingham Args full_args (GetCommandName ()); 10785a988416SJim Ingham full_args.AppendArguments(cmd_args); 10793b652621SJim Ingham handled = InvokeOverrideCallback (full_args.GetConstArgumentVector(), result); 10805a988416SJim Ingham } 10815a988416SJim Ingham if (!handled) 10825a988416SJim Ingham { 10835a988416SJim Ingham for (size_t i = 0; i < cmd_args.GetArgumentCount(); ++i) 10845a988416SJim Ingham { 10855a988416SJim Ingham const char *tmp_str = cmd_args.GetArgumentAtIndex (i); 10865a988416SJim Ingham if (tmp_str[0] == '`') // back-quote 10875a988416SJim Ingham cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str)); 10885a988416SJim Ingham } 10895a988416SJim Ingham 1090f9fc609fSGreg Clayton if (CheckRequirements(result)) 1091f9fc609fSGreg Clayton { 1092f9fc609fSGreg Clayton if (ParseOptions (cmd_args, result)) 1093f9fc609fSGreg Clayton { 10945a988416SJim Ingham // Call the command-specific version of 'Execute', passing it the already processed arguments. 10955a988416SJim Ingham handled = DoExecute (cmd_args, result); 10965a988416SJim Ingham } 1097f9fc609fSGreg Clayton } 1098f9fc609fSGreg Clayton 1099f9fc609fSGreg Clayton Cleanup(); 1100f9fc609fSGreg Clayton } 11015a988416SJim Ingham return handled; 11025a988416SJim Ingham } 11035a988416SJim Ingham 11045a988416SJim Ingham bool 11055a988416SJim Ingham CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result) 11065a988416SJim Ingham { 11075a988416SJim Ingham bool handled = false; 11083b652621SJim Ingham if (HasOverrideCallback()) 11095a988416SJim Ingham { 11105a988416SJim Ingham std::string full_command (GetCommandName ()); 11115a988416SJim Ingham full_command += ' '; 11125a988416SJim Ingham full_command += args_string; 1113d78c9576SEd Maste const char *argv[2] = { nullptr, nullptr }; 11145a988416SJim Ingham argv[0] = full_command.c_str(); 11153b652621SJim Ingham handled = InvokeOverrideCallback (argv, result); 11165a988416SJim Ingham } 11175a988416SJim Ingham if (!handled) 11185a988416SJim Ingham { 1119f9fc609fSGreg Clayton if (CheckRequirements(result)) 11205a988416SJim Ingham handled = DoExecute (args_string, result); 1121f9fc609fSGreg Clayton 1122f9fc609fSGreg Clayton Cleanup(); 11235a988416SJim Ingham } 11245a988416SJim Ingham return handled; 11255a988416SJim Ingham } 11265a988416SJim Ingham 1127ca7835c6SJohnny Chen static 1128ca7835c6SJohnny Chen const char *arch_helper() 1129ca7835c6SJohnny Chen { 1130d70b14eaSGreg Clayton static StreamString g_archs_help; 1131797a1b37SJohnny Chen if (g_archs_help.Empty()) 1132d70b14eaSGreg Clayton { 1133ca7835c6SJohnny Chen StringList archs; 1134d78c9576SEd Maste ArchSpec::AutoComplete(nullptr, archs); 1135d70b14eaSGreg Clayton g_archs_help.Printf("These are the supported architecture names:\n"); 1136797a1b37SJohnny Chen archs.Join("\n", g_archs_help); 1137d70b14eaSGreg Clayton } 1138d70b14eaSGreg Clayton return g_archs_help.GetData(); 1139ca7835c6SJohnny Chen } 1140ca7835c6SJohnny Chen 1141e139cf23SCaroline Tice CommandObject::ArgumentTableEntry 1142e139cf23SCaroline Tice CommandObject::g_arguments_data[] = 1143e139cf23SCaroline Tice { 1144d78c9576SEd Maste { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid address in the target program's execution space." }, 1145d78c9576SEd Maste { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "An expression that resolves to an address." }, 1146d78c9576SEd Maste { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of an abbreviation (alias) for a debugger command." }, 1147d78c9576SEd 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.)" }, 1148ca7835c6SJohnny Chen { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." }, 1149d78c9576SEd Maste { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { nullptr, false }, "A Boolean value: 'true' or 'false'" }, 1150d78c9576SEd Maste { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, nullptr }, 1151d78c9576SEd Maste { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, nullptr }, 11525e09c8c3SJim Ingham { eArgTypeBreakpointName, "breakpoint-name", CommandCompletions::eNoCompletion, { BreakpointNameHelpTextCallback, false }, nullptr }, 1153d78c9576SEd Maste { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { nullptr, false }, "Number of bytes to use." }, 1154d78c9576SEd Maste { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { nullptr, false }, "Then name of a class from the debug information in the program." }, 1155d78c9576SEd Maste { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A debugger command (may be multiple words), without any options or arguments." }, 1156d78c9576SEd Maste { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." }, 1157d78c9576SEd Maste { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { nullptr, false }, "A directory name." }, 1158d78c9576SEd 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" }, 1159d78c9576SEd Maste { eArgTypeDescriptionVerbosity, "description-verbosity", CommandCompletions::eNoCompletion, { nullptr, false }, "How verbose the output of 'po' should be." }, 1160d78c9576SEd Maste { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1161d78c9576SEd Maste { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1162d78c9576SEd Maste { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, nullptr }, 1163d78c9576SEd 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] ]" }, 1164d78c9576SEd Maste { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "The name of a file (can include path)." }, 1165d78c9576SEd Maste { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, nullptr }, 1166d78c9576SEd Maste { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into a thread's list of frames." }, 1167d78c9576SEd Maste { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1168d78c9576SEd Maste { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function." }, 1169d78c9576SEd Maste { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function or symbol." }, 1170d78c9576SEd Maste { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, nullptr }, 1171735152e3SEnrico Granata { eArgTypeHelpText, "help-text", CommandCompletions::eNoCompletion, { nullptr, false }, "Text to be used as help for some other entity in LLDB" }, 1172d78c9576SEd Maste { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a list." }, 1173*7a67ee26SEnrico Granata { eArgTypeLanguage, "source-language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, nullptr }, 1174d78c9576SEd Maste { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { nullptr, false }, "Line number in a source file." }, 1175d78c9576SEd 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." }, 1176d78c9576SEd 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)." }, 1177d78c9576SEd Maste { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { nullptr, false }, "A C++ method name." }, 1178d78c9576SEd Maste { eArgTypeName, "name", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1179d78c9576SEd Maste { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1180d78c9576SEd Maste { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of lines to use." }, 1181d78c9576SEd Maste { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of items per line to display." }, 1182d78c9576SEd Maste { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1183d78c9576SEd Maste { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1184d78c9576SEd Maste { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { nullptr, false }, "A command that is entered as a single line of text." }, 1185d78c9576SEd Maste { eArgTypePath, "path", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "Path." }, 1186d78c9576SEd Maste { eArgTypePermissionsNumber, "perms-numeric", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as an octal number (e.g. 755)." }, 1187d78c9576SEd Maste { eArgTypePermissionsString, "perms=string", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as a string value (e.g. rw-r-xr--)." }, 1188d78c9576SEd Maste { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { nullptr, false }, "The process ID number." }, 1189d78c9576SEd Maste { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1190d78c9576SEd Maste { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the process." }, 1191d78c9576SEd Maste { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python class." }, 1192d78c9576SEd Maste { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python function." }, 1193d78c9576SEd Maste { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { nullptr, false }, "Source code written in Python." }, 1194d78c9576SEd Maste { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the thread queue." }, 1195d78c9576SEd Maste { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, nullptr }, 1196d78c9576SEd Maste { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "A regular expression." }, 1197d78c9576SEd Maste { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { nullptr, false }, "Arguments to be passed to the target program when it starts executing." }, 1198d78c9576SEd Maste { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1199d78c9576SEd Maste { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { nullptr, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." }, 1200d78c9576SEd Maste { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { nullptr, false }, "The scripting language to be used for script-based commands. Currently only Python is valid." }, 1201d78c9576SEd Maste { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { nullptr, false }, "The word for which you wish to search for information about." }, 1202d78c9576SEd Maste { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { nullptr, false }, "An Objective-C selector name." }, 1203d78c9576SEd 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)." }, 1204d78c9576SEd 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)." }, 1205d78c9576SEd Maste { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" }, 1206d78c9576SEd 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." }, 1207d78c9576SEd Maste { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a shared library." }, 1208d78c9576SEd Maste { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { nullptr, false }, "The name of a source file.." }, 1209d78c9576SEd Maste { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify a sort order when dumping lists." }, 1210d78c9576SEd Maste { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1211d78c9576SEd Maste { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, nullptr }, 1212d78c9576SEd Maste { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { nullptr, false }, "Any symbol name (function name, variable, argument, etc.)" }, 1213d78c9576SEd Maste { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Thread ID number." }, 1214d78c9576SEd Maste { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into the process' list of threads." }, 1215d78c9576SEd Maste { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The thread's name." }, 1216a72b31c7SJim Ingham { eArgTypeTypeName, "type-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A type name." }, 1217d78c9576SEd Maste { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." }, 1218d78c9576SEd Maste { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." }, 1219d78c9576SEd Maste { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a variable in your program." }, 1220d78c9576SEd Maste { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { nullptr, false }, "A value could be anything, depending on where and how it is used." }, 1221d78c9576SEd Maste { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1222d78c9576SEd Maste { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { nullptr, false }, "No help available for this." }, 1223d78c9576SEd 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." }, 1224d78c9576SEd Maste { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Watchpoint IDs are positive integers." }, 1225d78c9576SEd Maste { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { nullptr, false }, "For example, '1-3' or '1 to 3'." }, 1226d78c9576SEd Maste { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify the type for a watchpoint." } 1227e139cf23SCaroline Tice }; 1228e139cf23SCaroline Tice 1229e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry* 1230e139cf23SCaroline Tice CommandObject::GetArgumentTable () 1231e139cf23SCaroline Tice { 12329d0402b1SGreg Clayton // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration 12339d0402b1SGreg Clayton assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg); 1234e139cf23SCaroline Tice return CommandObject::g_arguments_data; 1235e139cf23SCaroline Tice } 1236e139cf23SCaroline Tice 1237e139cf23SCaroline Tice 1238