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 1093a64300SDaniel Malea #include "lldb/lldb-python.h" 1193a64300SDaniel Malea 1230fdc8d8SChris Lattner #include "lldb/Interpreter/CommandObject.h" 1330fdc8d8SChris Lattner 1430fdc8d8SChris Lattner #include <string> 1530fdc8d8SChris Lattner #include <map> 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner #include <stdlib.h> 1830fdc8d8SChris Lattner #include <ctype.h> 1930fdc8d8SChris Lattner 2030fdc8d8SChris Lattner #include "lldb/Core/Address.h" 21ca7835c6SJohnny Chen #include "lldb/Core/ArchSpec.h" 2240af72e1SJim Ingham #include "lldb/Interpreter/Options.h" 2330fdc8d8SChris Lattner 2430fdc8d8SChris Lattner // These are for the Sourcename completers. 2530fdc8d8SChris Lattner // FIXME: Make a separate file for the completers. 2653239f00SGreg Clayton #include "lldb/Host/FileSpec.h" 2730fdc8d8SChris Lattner #include "lldb/Core/FileSpecList.h" 2830fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2930fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h" 3230fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 3330fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreter.h" 3430fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreterPython.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 12630fdc8d8SChris Lattner CommandObject::SetHelpLong (const char *cstr) 12730fdc8d8SChris Lattner { 12830fdc8d8SChris Lattner m_cmd_help_long = cstr; 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 13130fdc8d8SChris Lattner void 13299f0b8f9SEnrico Granata CommandObject::SetHelpLong (std::string str) 13399f0b8f9SEnrico Granata { 13499f0b8f9SEnrico Granata m_cmd_help_long = str; 13599f0b8f9SEnrico Granata } 13699f0b8f9SEnrico Granata 13799f0b8f9SEnrico Granata void 13830fdc8d8SChris Lattner CommandObject::SetSyntax (const char *cstr) 13930fdc8d8SChris Lattner { 14030fdc8d8SChris Lattner m_cmd_syntax = cstr; 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner 14330fdc8d8SChris Lattner Options * 14430fdc8d8SChris Lattner CommandObject::GetOptions () 14530fdc8d8SChris Lattner { 14630fdc8d8SChris Lattner // By default commands don't have options unless this virtual function 14730fdc8d8SChris Lattner // is overridden by base classes. 148d78c9576SEd Maste return nullptr; 14930fdc8d8SChris Lattner } 15030fdc8d8SChris Lattner 15130fdc8d8SChris Lattner bool 15230fdc8d8SChris Lattner CommandObject::ParseOptions 15330fdc8d8SChris Lattner ( 15430fdc8d8SChris Lattner Args& args, 15530fdc8d8SChris Lattner CommandReturnObject &result 15630fdc8d8SChris Lattner ) 15730fdc8d8SChris Lattner { 15830fdc8d8SChris Lattner // See if the subclass has options? 15930fdc8d8SChris Lattner Options *options = GetOptions(); 160d78c9576SEd Maste if (options != nullptr) 16130fdc8d8SChris Lattner { 16230fdc8d8SChris Lattner Error error; 163f6b8b581SGreg Clayton options->NotifyOptionParsingStarting(); 16430fdc8d8SChris Lattner 165b7ad58a0SGreg Clayton // ParseOptions calls getopt_long_only, which always skips the zero'th item in the array and starts at position 1, 16630fdc8d8SChris Lattner // so we need to push a dummy value into position zero. 16730fdc8d8SChris Lattner args.Unshift("dummy_string"); 16830fdc8d8SChris Lattner error = args.ParseOptions (*options); 16930fdc8d8SChris Lattner 17030fdc8d8SChris Lattner // The "dummy_string" will have already been removed by ParseOptions, 17130fdc8d8SChris Lattner // so no need to remove it. 17230fdc8d8SChris Lattner 173f6b8b581SGreg Clayton if (error.Success()) 174f6b8b581SGreg Clayton error = options->NotifyOptionParsingFinished(); 175f6b8b581SGreg Clayton 176f6b8b581SGreg Clayton if (error.Success()) 177f6b8b581SGreg Clayton { 178f6b8b581SGreg Clayton if (options->VerifyOptions (result)) 179f6b8b581SGreg Clayton return true; 180f6b8b581SGreg Clayton } 181f6b8b581SGreg Clayton else 18230fdc8d8SChris Lattner { 18330fdc8d8SChris Lattner const char *error_cstr = error.AsCString(); 18430fdc8d8SChris Lattner if (error_cstr) 18530fdc8d8SChris Lattner { 18630fdc8d8SChris Lattner // We got an error string, lets use that 18786edbf41SGreg Clayton result.AppendError(error_cstr); 18830fdc8d8SChris Lattner } 18930fdc8d8SChris Lattner else 19030fdc8d8SChris Lattner { 19130fdc8d8SChris Lattner // No error string, output the usage information into result 192eb0103f2SGreg Clayton options->GenerateOptionUsage (result.GetErrorStream(), this); 19330fdc8d8SChris Lattner } 194f6b8b581SGreg Clayton } 19530fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 19630fdc8d8SChris Lattner return false; 19730fdc8d8SChris Lattner } 19830fdc8d8SChris Lattner return true; 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 2015a988416SJim Ingham 2025a988416SJim Ingham 2035a988416SJim Ingham bool 204f9fc609fSGreg Clayton CommandObject::CheckRequirements (CommandReturnObject &result) 2055a988416SJim Ingham { 206f9fc609fSGreg Clayton #ifdef LLDB_CONFIGURATION_DEBUG 207f9fc609fSGreg Clayton // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx 208f9fc609fSGreg Clayton // has shared pointers to the target, process, thread and frame and we don't 209f9fc609fSGreg Clayton // want any CommandObject instances to keep any of these objects around 210f9fc609fSGreg Clayton // longer than for a single command. Every command should call 211f9fc609fSGreg Clayton // CommandObject::Cleanup() after it has completed 212f9fc609fSGreg Clayton assert (m_exe_ctx.GetTargetPtr() == NULL); 213f9fc609fSGreg Clayton assert (m_exe_ctx.GetProcessPtr() == NULL); 214f9fc609fSGreg Clayton assert (m_exe_ctx.GetThreadPtr() == NULL); 215f9fc609fSGreg Clayton assert (m_exe_ctx.GetFramePtr() == NULL); 216f9fc609fSGreg Clayton #endif 217f9fc609fSGreg Clayton 218f9fc609fSGreg Clayton // Lock down the interpreter's execution context prior to running the 219f9fc609fSGreg Clayton // command so we guarantee the selected target, process, thread and frame 220f9fc609fSGreg Clayton // can't go away during the execution 221f9fc609fSGreg Clayton m_exe_ctx = m_interpreter.GetExecutionContext(); 222f9fc609fSGreg Clayton 223f9fc609fSGreg Clayton const uint32_t flags = GetFlags().Get(); 224f9fc609fSGreg Clayton if (flags & (eFlagRequiresTarget | 225f9fc609fSGreg Clayton eFlagRequiresProcess | 226f9fc609fSGreg Clayton eFlagRequiresThread | 227f9fc609fSGreg Clayton eFlagRequiresFrame | 228f9fc609fSGreg Clayton eFlagTryTargetAPILock )) 229f9fc609fSGreg Clayton { 230f9fc609fSGreg Clayton 231f9fc609fSGreg Clayton if ((flags & eFlagRequiresTarget) && !m_exe_ctx.HasTargetScope()) 232f9fc609fSGreg Clayton { 233f9fc609fSGreg Clayton result.AppendError (GetInvalidTargetDescription()); 234f9fc609fSGreg Clayton return false; 235f9fc609fSGreg Clayton } 236f9fc609fSGreg Clayton 237f9fc609fSGreg Clayton if ((flags & eFlagRequiresProcess) && !m_exe_ctx.HasProcessScope()) 238f9fc609fSGreg Clayton { 239e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 240e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 241e59b0d2cSJason Molenda else 242f9fc609fSGreg Clayton result.AppendError (GetInvalidProcessDescription()); 243f9fc609fSGreg Clayton return false; 244f9fc609fSGreg Clayton } 245f9fc609fSGreg Clayton 246f9fc609fSGreg Clayton if ((flags & eFlagRequiresThread) && !m_exe_ctx.HasThreadScope()) 247f9fc609fSGreg Clayton { 248e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 249e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 250e59b0d2cSJason Molenda else if (!m_exe_ctx.HasProcessScope()) 251e59b0d2cSJason Molenda result.AppendError (GetInvalidProcessDescription()); 252e59b0d2cSJason Molenda else 253f9fc609fSGreg Clayton result.AppendError (GetInvalidThreadDescription()); 254f9fc609fSGreg Clayton return false; 255f9fc609fSGreg Clayton } 256f9fc609fSGreg Clayton 257f9fc609fSGreg Clayton if ((flags & eFlagRequiresFrame) && !m_exe_ctx.HasFrameScope()) 258f9fc609fSGreg Clayton { 259e59b0d2cSJason Molenda if (!m_exe_ctx.HasTargetScope()) 260e59b0d2cSJason Molenda result.AppendError (GetInvalidTargetDescription()); 261e59b0d2cSJason Molenda else if (!m_exe_ctx.HasProcessScope()) 262e59b0d2cSJason Molenda result.AppendError (GetInvalidProcessDescription()); 263e59b0d2cSJason Molenda else if (!m_exe_ctx.HasThreadScope()) 264e59b0d2cSJason Molenda result.AppendError (GetInvalidThreadDescription()); 265e59b0d2cSJason Molenda else 266f9fc609fSGreg Clayton result.AppendError (GetInvalidFrameDescription()); 267f9fc609fSGreg Clayton return false; 268f9fc609fSGreg Clayton } 269f9fc609fSGreg Clayton 270d78c9576SEd Maste if ((flags & eFlagRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == nullptr)) 271f9fc609fSGreg Clayton { 272f9fc609fSGreg Clayton result.AppendError (GetInvalidRegContextDescription()); 273f9fc609fSGreg Clayton return false; 274f9fc609fSGreg Clayton } 275f9fc609fSGreg Clayton 276f9fc609fSGreg Clayton if (flags & eFlagTryTargetAPILock) 277f9fc609fSGreg Clayton { 278f9fc609fSGreg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 279f9fc609fSGreg Clayton if (target) 2809b5442aeSGreg Clayton m_api_locker.Lock (target->GetAPIMutex()); 281f9fc609fSGreg Clayton } 282f9fc609fSGreg Clayton } 283f9fc609fSGreg Clayton 284b766a73dSGreg Clayton if (GetFlags().AnySet (CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused)) 285b766a73dSGreg Clayton { 286c14ee32dSGreg Clayton Process *process = m_interpreter.GetExecutionContext().GetProcessPtr(); 287d78c9576SEd Maste if (process == nullptr) 28830fdc8d8SChris Lattner { 289b8e8a5f3SJim Ingham // A process that is not running is considered paused. 290b8e8a5f3SJim Ingham if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched)) 291b8e8a5f3SJim Ingham { 29230fdc8d8SChris Lattner result.AppendError ("Process must exist."); 29330fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 29430fdc8d8SChris Lattner return false; 29530fdc8d8SChris Lattner } 296b8e8a5f3SJim Ingham } 29730fdc8d8SChris Lattner else 29830fdc8d8SChris Lattner { 29930fdc8d8SChris Lattner StateType state = process->GetState(); 30030fdc8d8SChris Lattner switch (state) 30130fdc8d8SChris Lattner { 3027a5388bfSGreg Clayton case eStateInvalid: 30330fdc8d8SChris Lattner case eStateSuspended: 30430fdc8d8SChris Lattner case eStateCrashed: 30530fdc8d8SChris Lattner case eStateStopped: 30630fdc8d8SChris Lattner break; 30730fdc8d8SChris Lattner 308b766a73dSGreg Clayton case eStateConnected: 309b766a73dSGreg Clayton case eStateAttaching: 310b766a73dSGreg Clayton case eStateLaunching: 31130fdc8d8SChris Lattner case eStateDetached: 31230fdc8d8SChris Lattner case eStateExited: 31330fdc8d8SChris Lattner case eStateUnloaded: 31473b472d4SGreg Clayton if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched)) 31530fdc8d8SChris Lattner { 31630fdc8d8SChris Lattner result.AppendError ("Process must be launched."); 31730fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 31830fdc8d8SChris Lattner return false; 31930fdc8d8SChris Lattner } 32030fdc8d8SChris Lattner break; 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner case eStateRunning: 32330fdc8d8SChris Lattner case eStateStepping: 32473b472d4SGreg Clayton if (GetFlags().Test(CommandObject::eFlagProcessMustBePaused)) 32530fdc8d8SChris Lattner { 32630fdc8d8SChris Lattner result.AppendError ("Process is running. Use 'process interrupt' to pause execution."); 32730fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 32830fdc8d8SChris Lattner return false; 32930fdc8d8SChris Lattner } 33030fdc8d8SChris Lattner } 33130fdc8d8SChris Lattner } 332b766a73dSGreg Clayton } 3335a988416SJim Ingham return true; 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner 336f9fc609fSGreg Clayton void 337f9fc609fSGreg Clayton CommandObject::Cleanup () 338f9fc609fSGreg Clayton { 339f9fc609fSGreg Clayton m_exe_ctx.Clear(); 340f9fc609fSGreg Clayton m_api_locker.Unlock(); 341f9fc609fSGreg Clayton } 342f9fc609fSGreg Clayton 343f9fc609fSGreg Clayton 34430fdc8d8SChris Lattner class CommandDictCommandPartialMatch 34530fdc8d8SChris Lattner { 34630fdc8d8SChris Lattner public: 34730fdc8d8SChris Lattner CommandDictCommandPartialMatch (const char *match_str) 34830fdc8d8SChris Lattner { 34930fdc8d8SChris Lattner m_match_str = match_str; 35030fdc8d8SChris Lattner } 35130fdc8d8SChris Lattner bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const 35230fdc8d8SChris Lattner { 35330fdc8d8SChris Lattner // A NULL or empty string matches everything. 354d78c9576SEd Maste if (m_match_str == nullptr || *m_match_str == '\0') 355c7bece56SGreg Clayton return true; 35630fdc8d8SChris Lattner 357c7bece56SGreg Clayton return map_element.first.find (m_match_str, 0) == 0; 35830fdc8d8SChris Lattner } 35930fdc8d8SChris Lattner 36030fdc8d8SChris Lattner private: 36130fdc8d8SChris Lattner const char *m_match_str; 36230fdc8d8SChris Lattner }; 36330fdc8d8SChris Lattner 36430fdc8d8SChris Lattner int 36530fdc8d8SChris Lattner CommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str, 36630fdc8d8SChris Lattner StringList &matches) 36730fdc8d8SChris Lattner { 36830fdc8d8SChris Lattner int number_added = 0; 36930fdc8d8SChris Lattner CommandDictCommandPartialMatch matcher(cmd_str); 37030fdc8d8SChris Lattner 37130fdc8d8SChris Lattner CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher); 37230fdc8d8SChris Lattner 37330fdc8d8SChris Lattner while (matching_cmds != in_map.end()) 37430fdc8d8SChris Lattner { 37530fdc8d8SChris Lattner ++number_added; 37630fdc8d8SChris Lattner matches.AppendString((*matching_cmds).first.c_str()); 37730fdc8d8SChris Lattner matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);; 37830fdc8d8SChris Lattner } 37930fdc8d8SChris Lattner return number_added; 38030fdc8d8SChris Lattner } 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner int 38330fdc8d8SChris Lattner CommandObject::HandleCompletion 38430fdc8d8SChris Lattner ( 38530fdc8d8SChris Lattner Args &input, 38630fdc8d8SChris Lattner int &cursor_index, 38730fdc8d8SChris Lattner int &cursor_char_position, 38830fdc8d8SChris Lattner int match_start_point, 38930fdc8d8SChris Lattner int max_return_elements, 390558ce124SJim Ingham bool &word_complete, 39130fdc8d8SChris Lattner StringList &matches 39230fdc8d8SChris Lattner ) 39330fdc8d8SChris Lattner { 3946561d15dSJohnny Chen // Default implmentation of WantsCompletion() is !WantsRawCommandString(). 3956561d15dSJohnny Chen // Subclasses who want raw command string but desire, for example, 3966561d15dSJohnny Chen // argument completion should override WantsCompletion() to return true, 3976561d15dSJohnny Chen // instead. 3986f99b637SJohnny Chen if (WantsRawCommandString() && !WantsCompletion()) 39930fdc8d8SChris Lattner { 40030fdc8d8SChris Lattner // FIXME: Abstract telling the completion to insert the completion character. 40130fdc8d8SChris Lattner matches.Clear(); 40230fdc8d8SChris Lattner return -1; 40330fdc8d8SChris Lattner } 40430fdc8d8SChris Lattner else 40530fdc8d8SChris Lattner { 40630fdc8d8SChris Lattner // Can we do anything generic with the options? 40730fdc8d8SChris Lattner Options *cur_options = GetOptions(); 40830fdc8d8SChris Lattner CommandReturnObject result; 40930fdc8d8SChris Lattner OptionElementVector opt_element_vector; 41030fdc8d8SChris Lattner 411d78c9576SEd Maste if (cur_options != nullptr) 41230fdc8d8SChris Lattner { 41330fdc8d8SChris Lattner // Re-insert the dummy command name string which will have been 41430fdc8d8SChris Lattner // stripped off: 41530fdc8d8SChris Lattner input.Unshift ("dummy-string"); 41630fdc8d8SChris Lattner cursor_index++; 41730fdc8d8SChris Lattner 41830fdc8d8SChris Lattner 41930fdc8d8SChris Lattner // I stick an element on the end of the input, because if the last element is 420b7ad58a0SGreg Clayton // option that requires an argument, getopt_long_only will freak out. 42130fdc8d8SChris Lattner 42230fdc8d8SChris Lattner input.AppendArgument ("<FAKE-VALUE>"); 42330fdc8d8SChris Lattner 424d43e0094SJim Ingham input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index); 42530fdc8d8SChris Lattner 42630fdc8d8SChris Lattner input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1); 42730fdc8d8SChris Lattner 42830fdc8d8SChris Lattner bool handled_by_options; 429eb0103f2SGreg Clayton handled_by_options = cur_options->HandleOptionCompletion (input, 43030fdc8d8SChris Lattner opt_element_vector, 43130fdc8d8SChris Lattner cursor_index, 43230fdc8d8SChris Lattner cursor_char_position, 43330fdc8d8SChris Lattner match_start_point, 43430fdc8d8SChris Lattner max_return_elements, 435558ce124SJim Ingham word_complete, 43630fdc8d8SChris Lattner matches); 43730fdc8d8SChris Lattner if (handled_by_options) 43830fdc8d8SChris Lattner return matches.GetSize(); 43930fdc8d8SChris Lattner } 44030fdc8d8SChris Lattner 44130fdc8d8SChris Lattner // If we got here, the last word is not an option or an option argument. 442a7015092SGreg Clayton return HandleArgumentCompletion (input, 44330fdc8d8SChris Lattner cursor_index, 44430fdc8d8SChris Lattner cursor_char_position, 44530fdc8d8SChris Lattner opt_element_vector, 44630fdc8d8SChris Lattner match_start_point, 44730fdc8d8SChris Lattner max_return_elements, 448558ce124SJim Ingham word_complete, 44930fdc8d8SChris Lattner matches); 45030fdc8d8SChris Lattner } 45130fdc8d8SChris Lattner } 45230fdc8d8SChris Lattner 45330fdc8d8SChris Lattner bool 454a7015092SGreg Clayton CommandObject::HelpTextContainsWord (const char *search_word) 45530fdc8d8SChris Lattner { 45630fdc8d8SChris Lattner std::string options_usage_help; 45730fdc8d8SChris Lattner 45830fdc8d8SChris Lattner bool found_word = false; 45930fdc8d8SChris Lattner 460998255bfSGreg Clayton const char *short_help = GetHelp(); 461998255bfSGreg Clayton const char *long_help = GetHelpLong(); 462998255bfSGreg Clayton const char *syntax_help = GetSyntax(); 46330fdc8d8SChris Lattner 464998255bfSGreg Clayton if (short_help && strcasestr (short_help, search_word)) 46530fdc8d8SChris Lattner found_word = true; 466998255bfSGreg Clayton else if (long_help && strcasestr (long_help, search_word)) 46730fdc8d8SChris Lattner found_word = true; 468998255bfSGreg Clayton else if (syntax_help && strcasestr (syntax_help, search_word)) 46930fdc8d8SChris Lattner found_word = true; 47030fdc8d8SChris Lattner 47130fdc8d8SChris Lattner if (!found_word 472d78c9576SEd Maste && GetOptions() != nullptr) 47330fdc8d8SChris Lattner { 47430fdc8d8SChris Lattner StreamString usage_help; 475eb0103f2SGreg Clayton GetOptions()->GenerateOptionUsage (usage_help, this); 47630fdc8d8SChris Lattner if (usage_help.GetSize() > 0) 47730fdc8d8SChris Lattner { 47830fdc8d8SChris Lattner const char *usage_text = usage_help.GetData(); 4794b6fbf37SCaroline Tice if (strcasestr (usage_text, search_word)) 48030fdc8d8SChris Lattner found_word = true; 48130fdc8d8SChris Lattner } 48230fdc8d8SChris Lattner } 48330fdc8d8SChris Lattner 48430fdc8d8SChris Lattner return found_word; 48530fdc8d8SChris Lattner } 486e139cf23SCaroline Tice 487e139cf23SCaroline Tice int 488e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries () 489e139cf23SCaroline Tice { 490e139cf23SCaroline Tice return m_arguments.size(); 491e139cf23SCaroline Tice } 492e139cf23SCaroline Tice 493e139cf23SCaroline Tice CommandObject::CommandArgumentEntry * 494e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx) 495e139cf23SCaroline Tice { 4963985c8c6SSaleem Abdulrasool if (static_cast<size_t>(idx) < m_arguments.size()) 497e139cf23SCaroline Tice return &(m_arguments[idx]); 498e139cf23SCaroline Tice 499d78c9576SEd Maste return nullptr; 500e139cf23SCaroline Tice } 501e139cf23SCaroline Tice 502e139cf23SCaroline Tice CommandObject::ArgumentTableEntry * 503e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type) 504e139cf23SCaroline Tice { 505e139cf23SCaroline Tice const ArgumentTableEntry *table = CommandObject::GetArgumentTable(); 506e139cf23SCaroline Tice 507e139cf23SCaroline Tice for (int i = 0; i < eArgTypeLastArg; ++i) 508e139cf23SCaroline Tice if (table[i].arg_type == arg_type) 509e139cf23SCaroline Tice return (ArgumentTableEntry *) &(table[i]); 510e139cf23SCaroline Tice 511d78c9576SEd Maste return nullptr; 512e139cf23SCaroline Tice } 513e139cf23SCaroline Tice 514e139cf23SCaroline Tice void 515e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter) 516e139cf23SCaroline Tice { 517e139cf23SCaroline Tice const ArgumentTableEntry* table = CommandObject::GetArgumentTable(); 518e139cf23SCaroline Tice ArgumentTableEntry *entry = (ArgumentTableEntry *) &(table[arg_type]); 519e139cf23SCaroline Tice 520e139cf23SCaroline Tice // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up... 521e139cf23SCaroline Tice 522e139cf23SCaroline Tice if (entry->arg_type != arg_type) 523e139cf23SCaroline Tice entry = CommandObject::FindArgumentDataByType (arg_type); 524e139cf23SCaroline Tice 525e139cf23SCaroline Tice if (!entry) 526e139cf23SCaroline Tice return; 527e139cf23SCaroline Tice 528e139cf23SCaroline Tice StreamString name_str; 529e139cf23SCaroline Tice name_str.Printf ("<%s>", entry->arg_name); 530e139cf23SCaroline Tice 531fc7a7f3bSEnrico Granata if (entry->help_function) 53282a7d983SEnrico Granata { 533fc7a7f3bSEnrico Granata const char* help_text = entry->help_function(); 53482a7d983SEnrico Granata if (!entry->help_function.self_formatting) 53582a7d983SEnrico Granata { 53682a7d983SEnrico Granata interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text, 537e139cf23SCaroline Tice name_str.GetSize()); 53882a7d983SEnrico Granata } 53982a7d983SEnrico Granata else 54082a7d983SEnrico Granata { 54182a7d983SEnrico Granata interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text, 54282a7d983SEnrico Granata name_str.GetSize()); 54382a7d983SEnrico Granata } 54482a7d983SEnrico Granata } 545e139cf23SCaroline Tice else 546e139cf23SCaroline Tice interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize()); 547e139cf23SCaroline Tice } 548e139cf23SCaroline Tice 549e139cf23SCaroline Tice const char * 550e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type) 551e139cf23SCaroline Tice { 552deaab222SCaroline Tice ArgumentTableEntry *entry = (ArgumentTableEntry *) &(CommandObject::GetArgumentTable()[arg_type]); 553deaab222SCaroline Tice 554deaab222SCaroline Tice // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up... 555deaab222SCaroline Tice 556deaab222SCaroline Tice if (entry->arg_type != arg_type) 557deaab222SCaroline Tice entry = CommandObject::FindArgumentDataByType (arg_type); 558deaab222SCaroline Tice 559e6acf355SJohnny Chen if (entry) 560deaab222SCaroline Tice return entry->arg_name; 561e6acf355SJohnny Chen 562e6acf355SJohnny Chen StreamString str; 563e6acf355SJohnny Chen str << "Arg name for type (" << arg_type << ") not in arg table!"; 564e6acf355SJohnny Chen return str.GetData(); 565e139cf23SCaroline Tice } 566e139cf23SCaroline Tice 567405fe67fSCaroline Tice bool 568e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type) 569405fe67fSCaroline Tice { 570405fe67fSCaroline Tice if ((arg_repeat_type == eArgRepeatPairPlain) 571405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairOptional) 572405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairPlus) 573405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairStar) 574405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairRange) 575405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairRangeOptional)) 576405fe67fSCaroline Tice return true; 577405fe67fSCaroline Tice 578405fe67fSCaroline Tice return false; 579405fe67fSCaroline Tice } 580405fe67fSCaroline Tice 58134ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry 58234ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry) 58334ddc8dbSJohnny Chen { 58434ddc8dbSJohnny Chen CommandObject::CommandArgumentEntry ret_val; 58534ddc8dbSJohnny Chen for (unsigned i = 0; i < cmd_arg_entry.size(); ++i) 58634ddc8dbSJohnny Chen if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association) 58734ddc8dbSJohnny Chen ret_val.push_back(cmd_arg_entry[i]); 58834ddc8dbSJohnny Chen return ret_val; 58934ddc8dbSJohnny Chen } 59034ddc8dbSJohnny Chen 59134ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take 59234ddc8dbSJohnny Chen // all the argument data into account. On rare cases where some argument sticks 59334ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args. 594e139cf23SCaroline Tice void 59534ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask) 596e139cf23SCaroline Tice { 597e139cf23SCaroline Tice int num_args = m_arguments.size(); 598e139cf23SCaroline Tice for (int i = 0; i < num_args; ++i) 599e139cf23SCaroline Tice { 600e139cf23SCaroline Tice if (i > 0) 601e139cf23SCaroline Tice str.Printf (" "); 60234ddc8dbSJohnny Chen CommandArgumentEntry arg_entry = 60334ddc8dbSJohnny Chen opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i] 60434ddc8dbSJohnny Chen : OptSetFiltered(opt_set_mask, m_arguments[i]); 605e139cf23SCaroline Tice int num_alternatives = arg_entry.size(); 606405fe67fSCaroline Tice 607405fe67fSCaroline Tice if ((num_alternatives == 2) 608405fe67fSCaroline Tice && IsPairType (arg_entry[0].arg_repetition)) 609405fe67fSCaroline Tice { 610405fe67fSCaroline Tice const char *first_name = GetArgumentName (arg_entry[0].arg_type); 611405fe67fSCaroline Tice const char *second_name = GetArgumentName (arg_entry[1].arg_type); 612405fe67fSCaroline Tice switch (arg_entry[0].arg_repetition) 613405fe67fSCaroline Tice { 614405fe67fSCaroline Tice case eArgRepeatPairPlain: 615405fe67fSCaroline Tice str.Printf ("<%s> <%s>", first_name, second_name); 616405fe67fSCaroline Tice break; 617405fe67fSCaroline Tice case eArgRepeatPairOptional: 618405fe67fSCaroline Tice str.Printf ("[<%s> <%s>]", first_name, second_name); 619405fe67fSCaroline Tice break; 620405fe67fSCaroline Tice case eArgRepeatPairPlus: 621405fe67fSCaroline Tice str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name); 622405fe67fSCaroline Tice break; 623405fe67fSCaroline Tice case eArgRepeatPairStar: 624405fe67fSCaroline Tice str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name); 625405fe67fSCaroline Tice break; 626405fe67fSCaroline Tice case eArgRepeatPairRange: 627405fe67fSCaroline Tice str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name); 628405fe67fSCaroline Tice break; 629405fe67fSCaroline Tice case eArgRepeatPairRangeOptional: 630405fe67fSCaroline Tice str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name); 631405fe67fSCaroline Tice break; 632ca1176aaSCaroline Tice // Explicitly test for all the rest of the cases, so if new types get added we will notice the 633ca1176aaSCaroline Tice // missing case statement(s). 634ca1176aaSCaroline Tice case eArgRepeatPlain: 635ca1176aaSCaroline Tice case eArgRepeatOptional: 636ca1176aaSCaroline Tice case eArgRepeatPlus: 637ca1176aaSCaroline Tice case eArgRepeatStar: 638ca1176aaSCaroline Tice case eArgRepeatRange: 639ca1176aaSCaroline Tice // These should not be reached, as they should fail the IsPairType test above. 640ca1176aaSCaroline Tice break; 641405fe67fSCaroline Tice } 642405fe67fSCaroline Tice } 643405fe67fSCaroline Tice else 644405fe67fSCaroline Tice { 645e139cf23SCaroline Tice StreamString names; 646e139cf23SCaroline Tice for (int j = 0; j < num_alternatives; ++j) 647e139cf23SCaroline Tice { 648e139cf23SCaroline Tice if (j > 0) 649e139cf23SCaroline Tice names.Printf (" | "); 650e139cf23SCaroline Tice names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type)); 651e139cf23SCaroline Tice } 652e139cf23SCaroline Tice switch (arg_entry[0].arg_repetition) 653e139cf23SCaroline Tice { 654e139cf23SCaroline Tice case eArgRepeatPlain: 655e139cf23SCaroline Tice str.Printf ("<%s>", names.GetData()); 656e139cf23SCaroline Tice break; 657e139cf23SCaroline Tice case eArgRepeatPlus: 658e139cf23SCaroline Tice str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData()); 659e139cf23SCaroline Tice break; 660e139cf23SCaroline Tice case eArgRepeatStar: 661e139cf23SCaroline Tice str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData()); 662e139cf23SCaroline Tice break; 663e139cf23SCaroline Tice case eArgRepeatOptional: 664e139cf23SCaroline Tice str.Printf ("[<%s>]", names.GetData()); 665e139cf23SCaroline Tice break; 666405fe67fSCaroline Tice case eArgRepeatRange: 667fd54b368SJason Molenda str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData()); 668ca1176aaSCaroline Tice break; 669ca1176aaSCaroline Tice // Explicitly test for all the rest of the cases, so if new types get added we will notice the 670ca1176aaSCaroline Tice // missing case statement(s). 671ca1176aaSCaroline Tice case eArgRepeatPairPlain: 672ca1176aaSCaroline Tice case eArgRepeatPairOptional: 673ca1176aaSCaroline Tice case eArgRepeatPairPlus: 674ca1176aaSCaroline Tice case eArgRepeatPairStar: 675ca1176aaSCaroline Tice case eArgRepeatPairRange: 676ca1176aaSCaroline Tice case eArgRepeatPairRangeOptional: 677ca1176aaSCaroline Tice // These should not be hit, as they should pass the IsPairType test above, and control should 678ca1176aaSCaroline Tice // have gone into the other branch of the if statement. 679ca1176aaSCaroline Tice break; 680405fe67fSCaroline Tice } 681e139cf23SCaroline Tice } 682e139cf23SCaroline Tice } 683e139cf23SCaroline Tice } 684e139cf23SCaroline Tice 6850c16aa6dSStephen Wilson CommandArgumentType 686e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name) 687e139cf23SCaroline Tice { 688e139cf23SCaroline Tice CommandArgumentType return_type = eArgTypeLastArg; 689e139cf23SCaroline Tice 690e139cf23SCaroline Tice std::string arg_name_str (arg_name); 691e139cf23SCaroline Tice size_t len = arg_name_str.length(); 692e139cf23SCaroline Tice if (arg_name[0] == '<' 693e139cf23SCaroline Tice && arg_name[len-1] == '>') 694e139cf23SCaroline Tice arg_name_str = arg_name_str.substr (1, len-2); 695e139cf23SCaroline Tice 696331eff39SJohnny Chen const ArgumentTableEntry *table = GetArgumentTable(); 697e139cf23SCaroline Tice for (int i = 0; i < eArgTypeLastArg; ++i) 698331eff39SJohnny Chen if (arg_name_str.compare (table[i].arg_name) == 0) 699e139cf23SCaroline Tice return_type = g_arguments_data[i].arg_type; 700e139cf23SCaroline Tice 701e139cf23SCaroline Tice return return_type; 702e139cf23SCaroline Tice } 703e139cf23SCaroline Tice 704e139cf23SCaroline Tice static const char * 705931e674aSJim Ingham RegisterNameHelpTextCallback () 706931e674aSJim Ingham { 707931e674aSJim Ingham return "Register names can be specified using the architecture specific names. " 70884c7bd74SJim Ingham "They can also be specified using generic names. Not all generic entities have " 70984c7bd74SJim Ingham "registers backing them on all architectures. When they don't the generic name " 71084c7bd74SJim Ingham "will return an error.\n" 711931e674aSJim Ingham "The generic names defined in lldb are:\n" 712931e674aSJim Ingham "\n" 713931e674aSJim Ingham "pc - program counter register\n" 714931e674aSJim Ingham "ra - return address register\n" 715931e674aSJim Ingham "fp - frame pointer register\n" 716931e674aSJim Ingham "sp - stack pointer register\n" 71784c7bd74SJim Ingham "flags - the flags register\n" 718931e674aSJim Ingham "arg{1-6} - integer argument passing registers.\n"; 719931e674aSJim Ingham } 720931e674aSJim Ingham 721931e674aSJim Ingham static const char * 722e139cf23SCaroline Tice BreakpointIDHelpTextCallback () 723e139cf23SCaroline Tice { 72486edbf41SGreg Clayton return "Breakpoint ID's consist major and minor numbers; the major number " 72586edbf41SGreg Clayton "corresponds to the single entity that was created with a 'breakpoint set' " 72686edbf41SGreg Clayton "command; the minor numbers correspond to all the locations that were actually " 72786edbf41SGreg Clayton "found/set based on the major breakpoint. A full breakpoint ID might look like " 72886edbf41SGreg Clayton "3.14, meaning the 14th location set for the 3rd breakpoint. You can specify " 72986edbf41SGreg Clayton "all the locations of a breakpoint by just indicating the major breakpoint " 73086edbf41SGreg Clayton "number. A valid breakpoint id consists either of just the major id number, " 73186edbf41SGreg Clayton "or the major number, a dot, and the location number (e.g. 3 or 3.2 could " 73286edbf41SGreg Clayton "both be valid breakpoint ids)."; 733e139cf23SCaroline Tice } 734e139cf23SCaroline Tice 735e139cf23SCaroline Tice static const char * 736e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback () 737e139cf23SCaroline Tice { 73886edbf41SGreg Clayton return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. " 73986edbf41SGreg Clayton "This can be done through several mechanisms. The easiest way is to just " 74086edbf41SGreg Clayton "enter a space-separated list of breakpoint ids. To specify all the " 74186edbf41SGreg Clayton "breakpoint locations under a major breakpoint, you can use the major " 74286edbf41SGreg Clayton "breakpoint number followed by '.*', eg. '5.*' means all the locations under " 74386edbf41SGreg Clayton "breakpoint 5. You can also indicate a range of breakpoints by using " 74486edbf41SGreg Clayton "<start-bp-id> - <end-bp-id>. The start-bp-id and end-bp-id for a range can " 74586edbf41SGreg Clayton "be any valid breakpoint ids. It is not legal, however, to specify a range " 74686edbf41SGreg Clayton "using specific locations that cross major breakpoint numbers. I.e. 3.2 - 3.7" 74786edbf41SGreg Clayton " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal."; 74886edbf41SGreg Clayton } 74986edbf41SGreg Clayton 75086edbf41SGreg Clayton static const char * 75186edbf41SGreg Clayton GDBFormatHelpTextCallback () 75286edbf41SGreg Clayton { 753f91381e8SGreg Clayton return "A GDB format consists of a repeat count, a format letter and a size letter. " 754f91381e8SGreg Clayton "The repeat count is optional and defaults to 1. The format letter is optional " 755f91381e8SGreg Clayton "and defaults to the previous format that was used. The size letter is optional " 756f91381e8SGreg Clayton "and defaults to the previous size that was used.\n" 757f91381e8SGreg Clayton "\n" 758f91381e8SGreg Clayton "Format letters include:\n" 759f91381e8SGreg Clayton "o - octal\n" 760f91381e8SGreg Clayton "x - hexadecimal\n" 761f91381e8SGreg Clayton "d - decimal\n" 762f91381e8SGreg Clayton "u - unsigned decimal\n" 763f91381e8SGreg Clayton "t - binary\n" 764f91381e8SGreg Clayton "f - float\n" 765f91381e8SGreg Clayton "a - address\n" 766f91381e8SGreg Clayton "i - instruction\n" 767f91381e8SGreg Clayton "c - char\n" 768f91381e8SGreg Clayton "s - string\n" 769f91381e8SGreg Clayton "T - OSType\n" 770f91381e8SGreg Clayton "A - float as hex\n" 771f91381e8SGreg Clayton "\n" 772f91381e8SGreg Clayton "Size letters include:\n" 773f91381e8SGreg Clayton "b - 1 byte (byte)\n" 774f91381e8SGreg Clayton "h - 2 bytes (halfword)\n" 775f91381e8SGreg Clayton "w - 4 bytes (word)\n" 776f91381e8SGreg Clayton "g - 8 bytes (giant)\n" 777f91381e8SGreg Clayton "\n" 778f91381e8SGreg Clayton "Example formats:\n" 779f91381e8SGreg Clayton "32xb - show 32 1 byte hexadecimal integer values\n" 780f91381e8SGreg Clayton "16xh - show 16 2 byte hexadecimal integer values\n" 781f91381e8SGreg Clayton "64 - show 64 2 byte hexadecimal integer values (format and size from the last format)\n" 782f91381e8SGreg Clayton "dw - show 1 4 byte decimal integer value\n" 783f91381e8SGreg Clayton ; 784e139cf23SCaroline Tice } 785e139cf23SCaroline Tice 7860a3958e0SEnrico Granata static const char * 7870a3958e0SEnrico Granata FormatHelpTextCallback () 7880a3958e0SEnrico Granata { 78982a7d983SEnrico Granata 790d78c9576SEd Maste static char* help_text_ptr = nullptr; 79182a7d983SEnrico Granata 79282a7d983SEnrico Granata if (help_text_ptr) 79382a7d983SEnrico Granata return help_text_ptr; 79482a7d983SEnrico Granata 7950a3958e0SEnrico Granata StreamString sstr; 7960a3958e0SEnrico Granata sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n"; 7970a3958e0SEnrico Granata for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1)) 7980a3958e0SEnrico Granata { 79982a7d983SEnrico Granata if (f != eFormatDefault) 80082a7d983SEnrico Granata sstr.PutChar('\n'); 80182a7d983SEnrico Granata 8020a3958e0SEnrico Granata char format_char = FormatManager::GetFormatAsFormatChar(f); 8030a3958e0SEnrico Granata if (format_char) 8040a3958e0SEnrico Granata sstr.Printf("'%c' or ", format_char); 8050a3958e0SEnrico Granata 80682a7d983SEnrico Granata sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f)); 8070a3958e0SEnrico Granata } 8080a3958e0SEnrico Granata 8090a3958e0SEnrico Granata sstr.Flush(); 8100a3958e0SEnrico Granata 8110a3958e0SEnrico Granata std::string data = sstr.GetString(); 8120a3958e0SEnrico Granata 81382a7d983SEnrico Granata help_text_ptr = new char[data.length()+1]; 8140a3958e0SEnrico Granata 81582a7d983SEnrico Granata data.copy(help_text_ptr, data.length()); 8160a3958e0SEnrico Granata 81782a7d983SEnrico Granata return help_text_ptr; 8180a3958e0SEnrico Granata } 8190a3958e0SEnrico Granata 8200a3958e0SEnrico Granata static const char * 821d9477397SSean Callanan LanguageTypeHelpTextCallback () 822d9477397SSean Callanan { 823d78c9576SEd Maste static char* help_text_ptr = nullptr; 824d9477397SSean Callanan 825d9477397SSean Callanan if (help_text_ptr) 826d9477397SSean Callanan return help_text_ptr; 827d9477397SSean Callanan 828d9477397SSean Callanan StreamString sstr; 829d9477397SSean Callanan sstr << "One of the following languages:\n"; 830d9477397SSean Callanan 83148947c7bSDaniel Malea for (unsigned int l = eLanguageTypeUnknown; l < eNumLanguageTypes; ++l) 832d9477397SSean Callanan { 83348947c7bSDaniel Malea sstr << " " << LanguageRuntime::GetNameForLanguageType(static_cast<LanguageType>(l)) << "\n"; 834d9477397SSean Callanan } 835d9477397SSean Callanan 836d9477397SSean Callanan sstr.Flush(); 837d9477397SSean Callanan 838d9477397SSean Callanan std::string data = sstr.GetString(); 839d9477397SSean Callanan 840d9477397SSean Callanan help_text_ptr = new char[data.length()+1]; 841d9477397SSean Callanan 842d9477397SSean Callanan data.copy(help_text_ptr, data.length()); 843d9477397SSean Callanan 844d9477397SSean Callanan return help_text_ptr; 845d9477397SSean Callanan } 846d9477397SSean Callanan 847d9477397SSean Callanan static const char * 84882a7d983SEnrico Granata SummaryStringHelpTextCallback() 8490a3958e0SEnrico Granata { 85082a7d983SEnrico Granata return 85182a7d983SEnrico Granata "A summary string is a way to extract information from variables in order to present them using a summary.\n" 85282a7d983SEnrico Granata "Summary strings contain static text, variables, scopes and control sequences:\n" 85382a7d983SEnrico Granata " - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n" 85482a7d983SEnrico Granata " - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n" 85582a7d983SEnrico 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" 85682a7d983SEnrico Granata " - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n" 85782a7d983SEnrico 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" 85882a7d983SEnrico 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" 85982a7d983SEnrico 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" 86082a7d983SEnrico 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" 8619128ee2fSEnrico 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." 8629128ee2fSEnrico 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" 86382a7d983SEnrico 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." 86482a7d983SEnrico 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" 86582a7d983SEnrico Granata " path refers to:\n" 86682a7d983SEnrico 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" 86782a7d983SEnrico Granata " and displayed as an individual variable\n" 86882a7d983SEnrico 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" 86982a7d983SEnrico 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" 8709128ee2fSEnrico 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" 8719128ee2fSEnrico 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" 8729128ee2fSEnrico Granata " special symbols only allowed as part of a variable:\n" 8739128ee2fSEnrico Granata " %V: show the value of the object by default\n" 8749128ee2fSEnrico Granata " %S: show the summary of the object by default\n" 8759128ee2fSEnrico Granata " %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n" 8769128ee2fSEnrico Granata " %L: show the location of the object (memory address or a register name)\n" 8779128ee2fSEnrico Granata " %#: show the number of children of the object\n" 8789128ee2fSEnrico Granata " %T: show the type of the object\n" 8799128ee2fSEnrico 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" 8809128ee2fSEnrico 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" 8819128ee2fSEnrico Granata " count the number of actual elements stored in an std::list:\n" 8829128ee2fSEnrico Granata "type summary add -s \"${svar%#}\" -x \"std::list<\""; 8839128ee2fSEnrico Granata } 8849128ee2fSEnrico Granata 8859128ee2fSEnrico Granata static const char * 8869128ee2fSEnrico Granata ExprPathHelpTextCallback() 8879128ee2fSEnrico Granata { 8889128ee2fSEnrico Granata return 8899128ee2fSEnrico 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" 8909128ee2fSEnrico Granata "For instance, given a class:\n" 8919128ee2fSEnrico Granata " class foo {\n" 8929128ee2fSEnrico Granata " int a;\n" 8939128ee2fSEnrico Granata " int b; .\n" 8949128ee2fSEnrico Granata " foo* next;\n" 8959128ee2fSEnrico Granata " };\n" 8969128ee2fSEnrico Granata "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n" 8979128ee2fSEnrico 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" 8989128ee2fSEnrico 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" 8999128ee2fSEnrico Granata "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n" 9009128ee2fSEnrico 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" 9019128ee2fSEnrico 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" 9029128ee2fSEnrico 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" 9039128ee2fSEnrico 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" 9049128ee2fSEnrico Granata " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory)."; 9050a3958e0SEnrico Granata } 9060a3958e0SEnrico Granata 907184d7a72SJohnny Chen void 9089b62d1d5SEnrico Granata CommandObject::GenerateHelpText (CommandReturnObject &result) 9099b62d1d5SEnrico Granata { 9109b62d1d5SEnrico Granata GenerateHelpText(result.GetOutputStream()); 9119b62d1d5SEnrico Granata 9129b62d1d5SEnrico Granata result.SetStatus (eReturnStatusSuccessFinishNoResult); 9139b62d1d5SEnrico Granata } 9149b62d1d5SEnrico Granata 9159b62d1d5SEnrico Granata void 9169b62d1d5SEnrico Granata CommandObject::GenerateHelpText (Stream &output_strm) 9179b62d1d5SEnrico Granata { 9189b62d1d5SEnrico Granata CommandInterpreter& interpreter = GetCommandInterpreter(); 919d78c9576SEd Maste if (GetOptions() != nullptr) 9209b62d1d5SEnrico Granata { 9219b62d1d5SEnrico Granata if (WantsRawCommandString()) 9229b62d1d5SEnrico Granata { 9239b62d1d5SEnrico Granata std::string help_text (GetHelp()); 9249b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 9259b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 9269b62d1d5SEnrico Granata } 9279b62d1d5SEnrico Granata else 9289b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 9299b62d1d5SEnrico Granata output_strm.Printf ("\nSyntax: %s\n", GetSyntax()); 9309b62d1d5SEnrico Granata GetOptions()->GenerateOptionUsage (output_strm, this); 9319b62d1d5SEnrico Granata const char *long_help = GetHelpLong(); 932d78c9576SEd Maste if ((long_help != nullptr) 9339b62d1d5SEnrico Granata && (strlen (long_help) > 0)) 9349b62d1d5SEnrico Granata output_strm.Printf ("\n%s", long_help); 9359b62d1d5SEnrico Granata if (WantsRawCommandString() && !WantsCompletion()) 9369b62d1d5SEnrico Granata { 9379b62d1d5SEnrico Granata // Emit the message about using ' -- ' between the end of the command options and the raw input 9389b62d1d5SEnrico Granata // conditionally, i.e., only if the command object does not want completion. 9399b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", 9409b62d1d5SEnrico Granata "\nIMPORTANT NOTE: Because this command takes 'raw' input, if you use any command options" 9419b62d1d5SEnrico Granata " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1); 9429b62d1d5SEnrico Granata } 9439b62d1d5SEnrico Granata else if (GetNumArgumentEntries() > 0 9449b62d1d5SEnrico Granata && GetOptions() 9459b62d1d5SEnrico Granata && GetOptions()->NumCommandOptions() > 0) 9469b62d1d5SEnrico Granata { 9479b62d1d5SEnrico Granata // Also emit a warning about using "--" in case you are using a command that takes options and arguments. 9489b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", 9499b62d1d5SEnrico Granata "\nThis command takes options and free-form arguments. If your arguments resemble" 9509b62d1d5SEnrico Granata " option specifiers (i.e., they start with a - or --), you must use ' -- ' between" 9519b62d1d5SEnrico Granata " the end of the command options and the beginning of the arguments.", 1); 9529b62d1d5SEnrico Granata } 9539b62d1d5SEnrico Granata } 9549b62d1d5SEnrico Granata else if (IsMultiwordObject()) 9559b62d1d5SEnrico Granata { 9569b62d1d5SEnrico Granata if (WantsRawCommandString()) 9579b62d1d5SEnrico Granata { 9589b62d1d5SEnrico Granata std::string help_text (GetHelp()); 9599b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 9609b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 9619b62d1d5SEnrico Granata } 9629b62d1d5SEnrico Granata else 9639b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 9649b62d1d5SEnrico Granata GenerateHelpText (output_strm); 9659b62d1d5SEnrico Granata } 9669b62d1d5SEnrico Granata else 9679b62d1d5SEnrico Granata { 9689b62d1d5SEnrico Granata const char *long_help = GetHelpLong(); 969d78c9576SEd Maste if ((long_help != nullptr) 9709b62d1d5SEnrico Granata && (strlen (long_help) > 0)) 9719b62d1d5SEnrico Granata output_strm.Printf ("%s", long_help); 9729b62d1d5SEnrico Granata else if (WantsRawCommandString()) 9739b62d1d5SEnrico Granata { 9749b62d1d5SEnrico Granata std::string help_text (GetHelp()); 9759b62d1d5SEnrico Granata help_text.append (" This command takes 'raw' input (no need to quote stuff)."); 9769b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1); 9779b62d1d5SEnrico Granata } 9789b62d1d5SEnrico Granata else 9799b62d1d5SEnrico Granata interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1); 9809b62d1d5SEnrico Granata output_strm.Printf ("\nSyntax: %s\n", GetSyntax()); 9819b62d1d5SEnrico Granata } 9829b62d1d5SEnrico Granata } 9839b62d1d5SEnrico Granata 9849b62d1d5SEnrico Granata void 985de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange) 986184d7a72SJohnny Chen { 987184d7a72SJohnny Chen CommandArgumentData id_arg; 988184d7a72SJohnny Chen CommandArgumentData id_range_arg; 989184d7a72SJohnny Chen 990184d7a72SJohnny Chen // Create the first variant for the first (and only) argument for this command. 991de753464SJohnny Chen id_arg.arg_type = ID; 992184d7a72SJohnny Chen id_arg.arg_repetition = eArgRepeatOptional; 993184d7a72SJohnny Chen 994184d7a72SJohnny Chen // Create the second variant for the first (and only) argument for this command. 995de753464SJohnny Chen id_range_arg.arg_type = IDRange; 996184d7a72SJohnny Chen id_range_arg.arg_repetition = eArgRepeatOptional; 997184d7a72SJohnny Chen 998a3234732SJohnny Chen // The first (and only) argument for this command could be either an id or an id_range. 999184d7a72SJohnny Chen // Push both variants into the entry for the first argument for this command. 1000184d7a72SJohnny Chen arg.push_back(id_arg); 1001184d7a72SJohnny Chen arg.push_back(id_range_arg); 1002184d7a72SJohnny Chen } 1003184d7a72SJohnny Chen 10049d0402b1SGreg Clayton const char * 10059d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type) 10069d0402b1SGreg Clayton { 10079d0402b1SGreg Clayton if (arg_type >=0 && arg_type < eArgTypeLastArg) 10089d0402b1SGreg Clayton return g_arguments_data[arg_type].arg_name; 1009d78c9576SEd Maste return nullptr; 10109d0402b1SGreg Clayton 10119d0402b1SGreg Clayton } 10129d0402b1SGreg Clayton 10139d0402b1SGreg Clayton const char * 10149d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type) 10159d0402b1SGreg Clayton { 10169d0402b1SGreg Clayton if (arg_type >=0 && arg_type < eArgTypeLastArg) 10179d0402b1SGreg Clayton return g_arguments_data[arg_type].help_text; 1018d78c9576SEd Maste return nullptr; 10199d0402b1SGreg Clayton } 10209d0402b1SGreg Clayton 1021893c932aSJim Ingham Target * 1022893c932aSJim Ingham CommandObject::GetDummyTarget() 1023893c932aSJim Ingham { 1024893c932aSJim Ingham return m_interpreter.GetDebugger().GetDummyTarget(); 1025893c932aSJim Ingham } 1026893c932aSJim Ingham 1027893c932aSJim Ingham Target * 1028*33df7cd3SJim Ingham CommandObject::GetSelectedOrDummyTarget(bool prefer_dummy) 1029893c932aSJim Ingham { 1030*33df7cd3SJim Ingham return m_interpreter.GetDebugger().GetSelectedOrDummyTarget(prefer_dummy); 1031893c932aSJim Ingham } 1032893c932aSJim Ingham 10335a988416SJim Ingham bool 10345a988416SJim Ingham CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result) 10355a988416SJim Ingham { 10365a988416SJim Ingham bool handled = false; 10375a988416SJim Ingham Args cmd_args (args_string); 10383b652621SJim Ingham if (HasOverrideCallback()) 10395a988416SJim Ingham { 10405a988416SJim Ingham Args full_args (GetCommandName ()); 10415a988416SJim Ingham full_args.AppendArguments(cmd_args); 10423b652621SJim Ingham handled = InvokeOverrideCallback (full_args.GetConstArgumentVector(), result); 10435a988416SJim Ingham } 10445a988416SJim Ingham if (!handled) 10455a988416SJim Ingham { 10465a988416SJim Ingham for (size_t i = 0; i < cmd_args.GetArgumentCount(); ++i) 10475a988416SJim Ingham { 10485a988416SJim Ingham const char *tmp_str = cmd_args.GetArgumentAtIndex (i); 10495a988416SJim Ingham if (tmp_str[0] == '`') // back-quote 10505a988416SJim Ingham cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str)); 10515a988416SJim Ingham } 10525a988416SJim Ingham 1053f9fc609fSGreg Clayton if (CheckRequirements(result)) 1054f9fc609fSGreg Clayton { 1055f9fc609fSGreg Clayton if (ParseOptions (cmd_args, result)) 1056f9fc609fSGreg Clayton { 10575a988416SJim Ingham // Call the command-specific version of 'Execute', passing it the already processed arguments. 10585a988416SJim Ingham handled = DoExecute (cmd_args, result); 10595a988416SJim Ingham } 1060f9fc609fSGreg Clayton } 1061f9fc609fSGreg Clayton 1062f9fc609fSGreg Clayton Cleanup(); 1063f9fc609fSGreg Clayton } 10645a988416SJim Ingham return handled; 10655a988416SJim Ingham } 10665a988416SJim Ingham 10675a988416SJim Ingham bool 10685a988416SJim Ingham CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result) 10695a988416SJim Ingham { 10705a988416SJim Ingham bool handled = false; 10713b652621SJim Ingham if (HasOverrideCallback()) 10725a988416SJim Ingham { 10735a988416SJim Ingham std::string full_command (GetCommandName ()); 10745a988416SJim Ingham full_command += ' '; 10755a988416SJim Ingham full_command += args_string; 1076d78c9576SEd Maste const char *argv[2] = { nullptr, nullptr }; 10775a988416SJim Ingham argv[0] = full_command.c_str(); 10783b652621SJim Ingham handled = InvokeOverrideCallback (argv, result); 10795a988416SJim Ingham } 10805a988416SJim Ingham if (!handled) 10815a988416SJim Ingham { 1082f9fc609fSGreg Clayton if (CheckRequirements(result)) 10835a988416SJim Ingham handled = DoExecute (args_string, result); 1084f9fc609fSGreg Clayton 1085f9fc609fSGreg Clayton Cleanup(); 10865a988416SJim Ingham } 10875a988416SJim Ingham return handled; 10885a988416SJim Ingham } 10895a988416SJim Ingham 1090ca7835c6SJohnny Chen static 1091ca7835c6SJohnny Chen const char *arch_helper() 1092ca7835c6SJohnny Chen { 1093d70b14eaSGreg Clayton static StreamString g_archs_help; 1094797a1b37SJohnny Chen if (g_archs_help.Empty()) 1095d70b14eaSGreg Clayton { 1096ca7835c6SJohnny Chen StringList archs; 1097d78c9576SEd Maste ArchSpec::AutoComplete(nullptr, archs); 1098d70b14eaSGreg Clayton g_archs_help.Printf("These are the supported architecture names:\n"); 1099797a1b37SJohnny Chen archs.Join("\n", g_archs_help); 1100d70b14eaSGreg Clayton } 1101d70b14eaSGreg Clayton return g_archs_help.GetData(); 1102ca7835c6SJohnny Chen } 1103ca7835c6SJohnny Chen 1104e139cf23SCaroline Tice CommandObject::ArgumentTableEntry 1105e139cf23SCaroline Tice CommandObject::g_arguments_data[] = 1106e139cf23SCaroline Tice { 1107d78c9576SEd Maste { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid address in the target program's execution space." }, 1108d78c9576SEd Maste { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "An expression that resolves to an address." }, 1109d78c9576SEd Maste { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of an abbreviation (alias) for a debugger command." }, 1110d78c9576SEd 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.)" }, 1111ca7835c6SJohnny Chen { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." }, 1112d78c9576SEd Maste { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { nullptr, false }, "A Boolean value: 'true' or 'false'" }, 1113d78c9576SEd Maste { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, nullptr }, 1114d78c9576SEd Maste { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, nullptr }, 1115d78c9576SEd Maste { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { nullptr, false }, "Number of bytes to use." }, 1116d78c9576SEd Maste { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { nullptr, false }, "Then name of a class from the debug information in the program." }, 1117d78c9576SEd Maste { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A debugger command (may be multiple words), without any options or arguments." }, 1118d78c9576SEd Maste { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." }, 1119d78c9576SEd Maste { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { nullptr, false }, "A directory name." }, 1120d78c9576SEd 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" }, 1121d78c9576SEd Maste { eArgTypeDescriptionVerbosity, "description-verbosity", CommandCompletions::eNoCompletion, { nullptr, false }, "How verbose the output of 'po' should be." }, 1122d78c9576SEd Maste { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1123d78c9576SEd Maste { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1124d78c9576SEd Maste { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, nullptr }, 1125d78c9576SEd 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] ]" }, 1126d78c9576SEd Maste { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "The name of a file (can include path)." }, 1127d78c9576SEd Maste { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, nullptr }, 1128d78c9576SEd Maste { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into a thread's list of frames." }, 1129d78c9576SEd Maste { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1130d78c9576SEd Maste { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function." }, 1131d78c9576SEd Maste { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function or symbol." }, 1132d78c9576SEd Maste { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, nullptr }, 1133735152e3SEnrico Granata { eArgTypeHelpText, "help-text", CommandCompletions::eNoCompletion, { nullptr, false }, "Text to be used as help for some other entity in LLDB" }, 1134d78c9576SEd Maste { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a list." }, 1135d78c9576SEd Maste { eArgTypeLanguage, "language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, nullptr }, 1136d78c9576SEd Maste { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { nullptr, false }, "Line number in a source file." }, 1137d78c9576SEd 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." }, 1138d78c9576SEd 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)." }, 1139d78c9576SEd Maste { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { nullptr, false }, "A C++ method name." }, 1140d78c9576SEd Maste { eArgTypeName, "name", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1141d78c9576SEd Maste { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1142d78c9576SEd Maste { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of lines to use." }, 1143d78c9576SEd Maste { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of items per line to display." }, 1144d78c9576SEd Maste { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1145d78c9576SEd Maste { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1146d78c9576SEd Maste { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { nullptr, false }, "A command that is entered as a single line of text." }, 1147d78c9576SEd Maste { eArgTypePath, "path", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "Path." }, 1148d78c9576SEd Maste { eArgTypePermissionsNumber, "perms-numeric", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as an octal number (e.g. 755)." }, 1149d78c9576SEd Maste { eArgTypePermissionsString, "perms=string", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as a string value (e.g. rw-r-xr--)." }, 1150d78c9576SEd Maste { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { nullptr, false }, "The process ID number." }, 1151d78c9576SEd Maste { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1152d78c9576SEd Maste { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the process." }, 1153d78c9576SEd Maste { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python class." }, 1154d78c9576SEd Maste { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python function." }, 1155d78c9576SEd Maste { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { nullptr, false }, "Source code written in Python." }, 1156d78c9576SEd Maste { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the thread queue." }, 1157d78c9576SEd Maste { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, nullptr }, 1158d78c9576SEd Maste { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "A regular expression." }, 1159d78c9576SEd Maste { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { nullptr, false }, "Arguments to be passed to the target program when it starts executing." }, 1160d78c9576SEd Maste { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1161d78c9576SEd Maste { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { nullptr, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." }, 1162d78c9576SEd Maste { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { nullptr, false }, "The scripting language to be used for script-based commands. Currently only Python is valid." }, 1163d78c9576SEd Maste { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { nullptr, false }, "The word for which you wish to search for information about." }, 1164d78c9576SEd Maste { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { nullptr, false }, "An Objective-C selector name." }, 1165d78c9576SEd 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)." }, 1166d78c9576SEd 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)." }, 1167d78c9576SEd Maste { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" }, 1168d78c9576SEd 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." }, 1169d78c9576SEd Maste { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a shared library." }, 1170d78c9576SEd Maste { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { nullptr, false }, "The name of a source file.." }, 1171d78c9576SEd Maste { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify a sort order when dumping lists." }, 1172d78c9576SEd Maste { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1173d78c9576SEd Maste { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, nullptr }, 1174d78c9576SEd Maste { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { nullptr, false }, "Any symbol name (function name, variable, argument, etc.)" }, 1175d78c9576SEd Maste { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Thread ID number." }, 1176d78c9576SEd Maste { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into the process' list of threads." }, 1177d78c9576SEd Maste { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The thread's name." }, 1178d78c9576SEd Maste { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." }, 1179d78c9576SEd Maste { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." }, 1180d78c9576SEd Maste { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a variable in your program." }, 1181d78c9576SEd Maste { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { nullptr, false }, "A value could be anything, depending on where and how it is used." }, 1182d78c9576SEd Maste { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." }, 1183d78c9576SEd Maste { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { nullptr, false }, "No help available for this." }, 1184d78c9576SEd 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." }, 1185d78c9576SEd Maste { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Watchpoint IDs are positive integers." }, 1186d78c9576SEd Maste { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { nullptr, false }, "For example, '1-3' or '1 to 3'." }, 1187d78c9576SEd Maste { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify the type for a watchpoint." } 1188e139cf23SCaroline Tice }; 1189e139cf23SCaroline Tice 1190e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry* 1191e139cf23SCaroline Tice CommandObject::GetArgumentTable () 1192e139cf23SCaroline Tice { 11939d0402b1SGreg Clayton // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration 11949d0402b1SGreg Clayton assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg); 1195e139cf23SCaroline Tice return CommandObject::g_arguments_data; 1196e139cf23SCaroline Tice } 1197e139cf23SCaroline Tice 1198e139cf23SCaroline Tice 1199