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> 1330fdc8d8SChris Lattner #include <map> 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include <getopt.h> 1630fdc8d8SChris Lattner #include <stdlib.h> 1730fdc8d8SChris Lattner #include <ctype.h> 1830fdc8d8SChris Lattner 1930fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2040af72e1SJim Ingham #include "lldb/Interpreter/Options.h" 2130fdc8d8SChris Lattner 2230fdc8d8SChris Lattner // These are for the Sourcename completers. 2330fdc8d8SChris Lattner // FIXME: Make a separate file for the completers. 2453239f00SGreg Clayton #include "lldb/Host/FileSpec.h" 2530fdc8d8SChris Lattner #include "lldb/Core/FileSpecList.h" 2630fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2730fdc8d8SChris Lattner #include "lldb/Target/Target.h" 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h" 3030fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 3130fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreter.h" 3230fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreterPython.h" 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner using namespace lldb; 3530fdc8d8SChris Lattner using namespace lldb_private; 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner //------------------------------------------------------------------------- 3830fdc8d8SChris Lattner // CommandObject 3930fdc8d8SChris Lattner //------------------------------------------------------------------------- 4030fdc8d8SChris Lattner 41a7015092SGreg Clayton CommandObject::CommandObject 42a7015092SGreg Clayton ( 43a7015092SGreg Clayton CommandInterpreter &interpreter, 44a7015092SGreg Clayton const char *name, 45a7015092SGreg Clayton const char *help, 46a7015092SGreg Clayton const char *syntax, 47a7015092SGreg Clayton uint32_t flags 48a7015092SGreg Clayton ) : 49a7015092SGreg Clayton m_interpreter (interpreter), 5030fdc8d8SChris Lattner m_cmd_name (name), 5130fdc8d8SChris Lattner m_cmd_help_short (), 5230fdc8d8SChris Lattner m_cmd_help_long (), 5330fdc8d8SChris Lattner m_cmd_syntax (), 54279a6c26SJim Ingham m_is_alias (false), 55e139cf23SCaroline Tice m_flags (flags), 56e139cf23SCaroline Tice m_arguments() 5730fdc8d8SChris Lattner { 5830fdc8d8SChris Lattner if (help && help[0]) 5930fdc8d8SChris Lattner m_cmd_help_short = help; 6030fdc8d8SChris Lattner if (syntax && syntax[0]) 6130fdc8d8SChris Lattner m_cmd_syntax = syntax; 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner 6430fdc8d8SChris Lattner CommandObject::~CommandObject () 6530fdc8d8SChris Lattner { 6630fdc8d8SChris Lattner } 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner const char * 6930fdc8d8SChris Lattner CommandObject::GetHelp () 7030fdc8d8SChris Lattner { 7130fdc8d8SChris Lattner return m_cmd_help_short.c_str(); 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 7430fdc8d8SChris Lattner const char * 7530fdc8d8SChris Lattner CommandObject::GetHelpLong () 7630fdc8d8SChris Lattner { 7730fdc8d8SChris Lattner return m_cmd_help_long.c_str(); 7830fdc8d8SChris Lattner } 7930fdc8d8SChris Lattner 8030fdc8d8SChris Lattner const char * 8130fdc8d8SChris Lattner CommandObject::GetSyntax () 8230fdc8d8SChris Lattner { 83e139cf23SCaroline Tice if (m_cmd_syntax.length() == 0) 84e139cf23SCaroline Tice { 85e139cf23SCaroline Tice StreamString syntax_str; 86e139cf23SCaroline Tice syntax_str.Printf ("%s", GetCommandName()); 87e139cf23SCaroline Tice if (GetOptions() != NULL) 88e139cf23SCaroline Tice syntax_str.Printf (" <cmd-options>"); 89e139cf23SCaroline Tice if (m_arguments.size() > 0) 90e139cf23SCaroline Tice { 91e139cf23SCaroline Tice syntax_str.Printf (" "); 92a4c6ad19SSean Callanan if (WantsRawCommandString()) 93a4c6ad19SSean Callanan syntax_str.Printf("-- "); 94e139cf23SCaroline Tice GetFormattedCommandArguments (syntax_str); 95e139cf23SCaroline Tice } 96e139cf23SCaroline Tice m_cmd_syntax = syntax_str.GetData (); 97e139cf23SCaroline Tice } 98e139cf23SCaroline Tice 9930fdc8d8SChris Lattner return m_cmd_syntax.c_str(); 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 10230fdc8d8SChris Lattner const char * 10330fdc8d8SChris Lattner CommandObject::Translate () 10430fdc8d8SChris Lattner { 10530fdc8d8SChris Lattner //return m_cmd_func_name.c_str(); 10630fdc8d8SChris Lattner return "This function is currently not implemented."; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner const char * 11030fdc8d8SChris Lattner CommandObject::GetCommandName () 11130fdc8d8SChris Lattner { 11230fdc8d8SChris Lattner return m_cmd_name.c_str(); 11330fdc8d8SChris Lattner } 11430fdc8d8SChris Lattner 11530fdc8d8SChris Lattner void 11630fdc8d8SChris Lattner CommandObject::SetCommandName (const char *name) 11730fdc8d8SChris Lattner { 11830fdc8d8SChris Lattner m_cmd_name = name; 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner 12130fdc8d8SChris Lattner void 12230fdc8d8SChris Lattner CommandObject::SetHelp (const char *cstr) 12330fdc8d8SChris Lattner { 12430fdc8d8SChris Lattner m_cmd_help_short = cstr; 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 12730fdc8d8SChris Lattner void 12830fdc8d8SChris Lattner CommandObject::SetHelpLong (const char *cstr) 12930fdc8d8SChris Lattner { 13030fdc8d8SChris Lattner m_cmd_help_long = cstr; 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 13330fdc8d8SChris Lattner void 13499f0b8f9SEnrico Granata CommandObject::SetHelpLong (std::string str) 13599f0b8f9SEnrico Granata { 13699f0b8f9SEnrico Granata m_cmd_help_long = str; 13799f0b8f9SEnrico Granata } 13899f0b8f9SEnrico Granata 13999f0b8f9SEnrico Granata void 14030fdc8d8SChris Lattner CommandObject::SetSyntax (const char *cstr) 14130fdc8d8SChris Lattner { 14230fdc8d8SChris Lattner m_cmd_syntax = cstr; 14330fdc8d8SChris Lattner } 14430fdc8d8SChris Lattner 14530fdc8d8SChris Lattner Options * 14630fdc8d8SChris Lattner CommandObject::GetOptions () 14730fdc8d8SChris Lattner { 14830fdc8d8SChris Lattner // By default commands don't have options unless this virtual function 14930fdc8d8SChris Lattner // is overridden by base classes. 15030fdc8d8SChris Lattner return NULL; 15130fdc8d8SChris Lattner } 15230fdc8d8SChris Lattner 15330fdc8d8SChris Lattner Flags& 15430fdc8d8SChris Lattner CommandObject::GetFlags() 15530fdc8d8SChris Lattner { 15630fdc8d8SChris Lattner return m_flags; 15730fdc8d8SChris Lattner } 15830fdc8d8SChris Lattner 15930fdc8d8SChris Lattner const Flags& 16030fdc8d8SChris Lattner CommandObject::GetFlags() const 16130fdc8d8SChris Lattner { 16230fdc8d8SChris Lattner return m_flags; 16330fdc8d8SChris Lattner } 16430fdc8d8SChris Lattner 16530fdc8d8SChris Lattner bool 16630fdc8d8SChris Lattner CommandObject::ExecuteCommandString 16730fdc8d8SChris Lattner ( 16830fdc8d8SChris Lattner const char *command_line, 16930fdc8d8SChris Lattner CommandReturnObject &result 17030fdc8d8SChris Lattner ) 17130fdc8d8SChris Lattner { 17230fdc8d8SChris Lattner Args command_args(command_line); 173a7015092SGreg Clayton return ExecuteWithOptions (command_args, result); 17430fdc8d8SChris Lattner } 17530fdc8d8SChris Lattner 17630fdc8d8SChris Lattner bool 17730fdc8d8SChris Lattner CommandObject::ParseOptions 17830fdc8d8SChris Lattner ( 17930fdc8d8SChris Lattner Args& args, 18030fdc8d8SChris Lattner CommandReturnObject &result 18130fdc8d8SChris Lattner ) 18230fdc8d8SChris Lattner { 18330fdc8d8SChris Lattner // See if the subclass has options? 18430fdc8d8SChris Lattner Options *options = GetOptions(); 18530fdc8d8SChris Lattner if (options != NULL) 18630fdc8d8SChris Lattner { 18730fdc8d8SChris Lattner Error error; 188f6b8b581SGreg Clayton options->NotifyOptionParsingStarting(); 18930fdc8d8SChris Lattner 19030fdc8d8SChris Lattner // ParseOptions calls getopt_long, which always skips the zero'th item in the array and starts at position 1, 19130fdc8d8SChris Lattner // so we need to push a dummy value into position zero. 19230fdc8d8SChris Lattner args.Unshift("dummy_string"); 19330fdc8d8SChris Lattner error = args.ParseOptions (*options); 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner // The "dummy_string" will have already been removed by ParseOptions, 19630fdc8d8SChris Lattner // so no need to remove it. 19730fdc8d8SChris Lattner 198f6b8b581SGreg Clayton if (error.Success()) 199f6b8b581SGreg Clayton error = options->NotifyOptionParsingFinished(); 200f6b8b581SGreg Clayton 201f6b8b581SGreg Clayton if (error.Success()) 202f6b8b581SGreg Clayton { 203f6b8b581SGreg Clayton if (options->VerifyOptions (result)) 204f6b8b581SGreg Clayton return true; 205f6b8b581SGreg Clayton } 206f6b8b581SGreg Clayton else 20730fdc8d8SChris Lattner { 20830fdc8d8SChris Lattner const char *error_cstr = error.AsCString(); 20930fdc8d8SChris Lattner if (error_cstr) 21030fdc8d8SChris Lattner { 21130fdc8d8SChris Lattner // We got an error string, lets use that 21286edbf41SGreg Clayton result.AppendError(error_cstr); 21330fdc8d8SChris Lattner } 21430fdc8d8SChris Lattner else 21530fdc8d8SChris Lattner { 21630fdc8d8SChris Lattner // No error string, output the usage information into result 217eb0103f2SGreg Clayton options->GenerateOptionUsage (result.GetErrorStream(), this); 21830fdc8d8SChris Lattner } 219f6b8b581SGreg Clayton } 22030fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 22130fdc8d8SChris Lattner return false; 22230fdc8d8SChris Lattner } 22330fdc8d8SChris Lattner return true; 22430fdc8d8SChris Lattner } 22530fdc8d8SChris Lattner bool 226a7015092SGreg Clayton CommandObject::ExecuteWithOptions (Args& args, CommandReturnObject &result) 22730fdc8d8SChris Lattner { 22830fdc8d8SChris Lattner for (size_t i = 0; i < args.GetArgumentCount(); ++i) 22930fdc8d8SChris Lattner { 23030fdc8d8SChris Lattner const char *tmp_str = args.GetArgumentAtIndex (i); 23130fdc8d8SChris Lattner if (tmp_str[0] == '`') // back-quote 232a7015092SGreg Clayton args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str)); 23330fdc8d8SChris Lattner } 23430fdc8d8SChris Lattner 235b766a73dSGreg Clayton if (GetFlags().AnySet (CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused)) 236b766a73dSGreg Clayton { 237c14ee32dSGreg Clayton Process *process = m_interpreter.GetExecutionContext().GetProcessPtr(); 23830fdc8d8SChris Lattner if (process == NULL) 23930fdc8d8SChris Lattner { 240b8e8a5f3SJim Ingham // A process that is not running is considered paused. 241b8e8a5f3SJim Ingham if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched)) 242b8e8a5f3SJim Ingham { 24330fdc8d8SChris Lattner result.AppendError ("Process must exist."); 24430fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 24530fdc8d8SChris Lattner return false; 24630fdc8d8SChris Lattner } 247b8e8a5f3SJim Ingham } 24830fdc8d8SChris Lattner else 24930fdc8d8SChris Lattner { 25030fdc8d8SChris Lattner StateType state = process->GetState(); 25130fdc8d8SChris Lattner 25230fdc8d8SChris Lattner switch (state) 25330fdc8d8SChris Lattner { 2547a5388bfSGreg Clayton case eStateInvalid: 25530fdc8d8SChris Lattner case eStateSuspended: 25630fdc8d8SChris Lattner case eStateCrashed: 25730fdc8d8SChris Lattner case eStateStopped: 25830fdc8d8SChris Lattner break; 25930fdc8d8SChris Lattner 260b766a73dSGreg Clayton case eStateConnected: 261b766a73dSGreg Clayton case eStateAttaching: 262b766a73dSGreg Clayton case eStateLaunching: 26330fdc8d8SChris Lattner case eStateDetached: 26430fdc8d8SChris Lattner case eStateExited: 26530fdc8d8SChris Lattner case eStateUnloaded: 26673b472d4SGreg Clayton if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched)) 26730fdc8d8SChris Lattner { 26830fdc8d8SChris Lattner result.AppendError ("Process must be launched."); 26930fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 27030fdc8d8SChris Lattner return false; 27130fdc8d8SChris Lattner } 27230fdc8d8SChris Lattner break; 27330fdc8d8SChris Lattner 27430fdc8d8SChris Lattner case eStateRunning: 27530fdc8d8SChris Lattner case eStateStepping: 27673b472d4SGreg Clayton if (GetFlags().Test(CommandObject::eFlagProcessMustBePaused)) 27730fdc8d8SChris Lattner { 27830fdc8d8SChris Lattner result.AppendError ("Process is running. Use 'process interrupt' to pause execution."); 27930fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 28030fdc8d8SChris Lattner return false; 28130fdc8d8SChris Lattner } 28230fdc8d8SChris Lattner } 28330fdc8d8SChris Lattner } 284b766a73dSGreg Clayton } 28530fdc8d8SChris Lattner 286a7015092SGreg Clayton if (!ParseOptions (args, result)) 28730fdc8d8SChris Lattner return false; 28830fdc8d8SChris Lattner 28930fdc8d8SChris Lattner // Call the command-specific version of 'Execute', passing it the already processed arguments. 290a7015092SGreg Clayton return Execute (args, result); 29130fdc8d8SChris Lattner } 29230fdc8d8SChris Lattner 29330fdc8d8SChris Lattner class CommandDictCommandPartialMatch 29430fdc8d8SChris Lattner { 29530fdc8d8SChris Lattner public: 29630fdc8d8SChris Lattner CommandDictCommandPartialMatch (const char *match_str) 29730fdc8d8SChris Lattner { 29830fdc8d8SChris Lattner m_match_str = match_str; 29930fdc8d8SChris Lattner } 30030fdc8d8SChris Lattner bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const 30130fdc8d8SChris Lattner { 30230fdc8d8SChris Lattner // A NULL or empty string matches everything. 30330fdc8d8SChris Lattner if (m_match_str == NULL || *m_match_str == '\0') 30430fdc8d8SChris Lattner return 1; 30530fdc8d8SChris Lattner 30630fdc8d8SChris Lattner size_t found = map_element.first.find (m_match_str, 0); 30730fdc8d8SChris Lattner if (found == std::string::npos) 30830fdc8d8SChris Lattner return 0; 30930fdc8d8SChris Lattner else 31030fdc8d8SChris Lattner return found == 0; 31130fdc8d8SChris Lattner } 31230fdc8d8SChris Lattner 31330fdc8d8SChris Lattner private: 31430fdc8d8SChris Lattner const char *m_match_str; 31530fdc8d8SChris Lattner }; 31630fdc8d8SChris Lattner 31730fdc8d8SChris Lattner int 31830fdc8d8SChris Lattner CommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str, 31930fdc8d8SChris Lattner StringList &matches) 32030fdc8d8SChris Lattner { 32130fdc8d8SChris Lattner int number_added = 0; 32230fdc8d8SChris Lattner CommandDictCommandPartialMatch matcher(cmd_str); 32330fdc8d8SChris Lattner 32430fdc8d8SChris Lattner CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher); 32530fdc8d8SChris Lattner 32630fdc8d8SChris Lattner while (matching_cmds != in_map.end()) 32730fdc8d8SChris Lattner { 32830fdc8d8SChris Lattner ++number_added; 32930fdc8d8SChris Lattner matches.AppendString((*matching_cmds).first.c_str()); 33030fdc8d8SChris Lattner matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);; 33130fdc8d8SChris Lattner } 33230fdc8d8SChris Lattner return number_added; 33330fdc8d8SChris Lattner } 33430fdc8d8SChris Lattner 33530fdc8d8SChris Lattner int 33630fdc8d8SChris Lattner CommandObject::HandleCompletion 33730fdc8d8SChris Lattner ( 33830fdc8d8SChris Lattner Args &input, 33930fdc8d8SChris Lattner int &cursor_index, 34030fdc8d8SChris Lattner int &cursor_char_position, 34130fdc8d8SChris Lattner int match_start_point, 34230fdc8d8SChris Lattner int max_return_elements, 343558ce124SJim Ingham bool &word_complete, 34430fdc8d8SChris Lattner StringList &matches 34530fdc8d8SChris Lattner ) 34630fdc8d8SChris Lattner { 3476561d15dSJohnny Chen // Default implmentation of WantsCompletion() is !WantsRawCommandString(). 3486561d15dSJohnny Chen // Subclasses who want raw command string but desire, for example, 3496561d15dSJohnny Chen // argument completion should override WantsCompletion() to return true, 3506561d15dSJohnny Chen // instead. 3516f99b637SJohnny Chen if (WantsRawCommandString() && !WantsCompletion()) 35230fdc8d8SChris Lattner { 35330fdc8d8SChris Lattner // FIXME: Abstract telling the completion to insert the completion character. 35430fdc8d8SChris Lattner matches.Clear(); 35530fdc8d8SChris Lattner return -1; 35630fdc8d8SChris Lattner } 35730fdc8d8SChris Lattner else 35830fdc8d8SChris Lattner { 35930fdc8d8SChris Lattner // Can we do anything generic with the options? 36030fdc8d8SChris Lattner Options *cur_options = GetOptions(); 36130fdc8d8SChris Lattner CommandReturnObject result; 36230fdc8d8SChris Lattner OptionElementVector opt_element_vector; 36330fdc8d8SChris Lattner 36430fdc8d8SChris Lattner if (cur_options != NULL) 36530fdc8d8SChris Lattner { 36630fdc8d8SChris Lattner // Re-insert the dummy command name string which will have been 36730fdc8d8SChris Lattner // stripped off: 36830fdc8d8SChris Lattner input.Unshift ("dummy-string"); 36930fdc8d8SChris Lattner cursor_index++; 37030fdc8d8SChris Lattner 37130fdc8d8SChris Lattner 37230fdc8d8SChris Lattner // I stick an element on the end of the input, because if the last element is 37330fdc8d8SChris Lattner // option that requires an argument, getopt_long will freak out. 37430fdc8d8SChris Lattner 37530fdc8d8SChris Lattner input.AppendArgument ("<FAKE-VALUE>"); 37630fdc8d8SChris Lattner 377d43e0094SJim Ingham input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index); 37830fdc8d8SChris Lattner 37930fdc8d8SChris Lattner input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1); 38030fdc8d8SChris Lattner 38130fdc8d8SChris Lattner bool handled_by_options; 382eb0103f2SGreg Clayton handled_by_options = cur_options->HandleOptionCompletion (input, 38330fdc8d8SChris Lattner opt_element_vector, 38430fdc8d8SChris Lattner cursor_index, 38530fdc8d8SChris Lattner cursor_char_position, 38630fdc8d8SChris Lattner match_start_point, 38730fdc8d8SChris Lattner max_return_elements, 388558ce124SJim Ingham word_complete, 38930fdc8d8SChris Lattner matches); 39030fdc8d8SChris Lattner if (handled_by_options) 39130fdc8d8SChris Lattner return matches.GetSize(); 39230fdc8d8SChris Lattner } 39330fdc8d8SChris Lattner 39430fdc8d8SChris Lattner // If we got here, the last word is not an option or an option argument. 395a7015092SGreg Clayton return HandleArgumentCompletion (input, 39630fdc8d8SChris Lattner cursor_index, 39730fdc8d8SChris Lattner cursor_char_position, 39830fdc8d8SChris Lattner opt_element_vector, 39930fdc8d8SChris Lattner match_start_point, 40030fdc8d8SChris Lattner max_return_elements, 401558ce124SJim Ingham word_complete, 40230fdc8d8SChris Lattner matches); 40330fdc8d8SChris Lattner } 40430fdc8d8SChris Lattner } 40530fdc8d8SChris Lattner 40630fdc8d8SChris Lattner bool 407a7015092SGreg Clayton CommandObject::HelpTextContainsWord (const char *search_word) 40830fdc8d8SChris Lattner { 40930fdc8d8SChris Lattner const char *short_help; 41030fdc8d8SChris Lattner const char *long_help; 41130fdc8d8SChris Lattner const char *syntax_help; 41230fdc8d8SChris Lattner std::string options_usage_help; 41330fdc8d8SChris Lattner 41430fdc8d8SChris Lattner 41530fdc8d8SChris Lattner bool found_word = false; 41630fdc8d8SChris Lattner 41730fdc8d8SChris Lattner short_help = GetHelp(); 41830fdc8d8SChris Lattner long_help = GetHelpLong(); 41930fdc8d8SChris Lattner syntax_help = GetSyntax(); 42030fdc8d8SChris Lattner 4214b6fbf37SCaroline Tice if (strcasestr (short_help, search_word)) 42230fdc8d8SChris Lattner found_word = true; 4234b6fbf37SCaroline Tice else if (strcasestr (long_help, search_word)) 42430fdc8d8SChris Lattner found_word = true; 4254b6fbf37SCaroline Tice else if (strcasestr (syntax_help, search_word)) 42630fdc8d8SChris Lattner found_word = true; 42730fdc8d8SChris Lattner 42830fdc8d8SChris Lattner if (!found_word 42930fdc8d8SChris Lattner && GetOptions() != NULL) 43030fdc8d8SChris Lattner { 43130fdc8d8SChris Lattner StreamString usage_help; 432eb0103f2SGreg Clayton GetOptions()->GenerateOptionUsage (usage_help, this); 43330fdc8d8SChris Lattner if (usage_help.GetSize() > 0) 43430fdc8d8SChris Lattner { 43530fdc8d8SChris Lattner const char *usage_text = usage_help.GetData(); 4364b6fbf37SCaroline Tice if (strcasestr (usage_text, search_word)) 43730fdc8d8SChris Lattner found_word = true; 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner } 44030fdc8d8SChris Lattner 44130fdc8d8SChris Lattner return found_word; 44230fdc8d8SChris Lattner } 443e139cf23SCaroline Tice 444e139cf23SCaroline Tice int 445e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries () 446e139cf23SCaroline Tice { 447e139cf23SCaroline Tice return m_arguments.size(); 448e139cf23SCaroline Tice } 449e139cf23SCaroline Tice 450e139cf23SCaroline Tice CommandObject::CommandArgumentEntry * 451e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx) 452e139cf23SCaroline Tice { 453e139cf23SCaroline Tice if (idx < m_arguments.size()) 454e139cf23SCaroline Tice return &(m_arguments[idx]); 455e139cf23SCaroline Tice 456e139cf23SCaroline Tice return NULL; 457e139cf23SCaroline Tice } 458e139cf23SCaroline Tice 459e139cf23SCaroline Tice CommandObject::ArgumentTableEntry * 460e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type) 461e139cf23SCaroline Tice { 462e139cf23SCaroline Tice const ArgumentTableEntry *table = CommandObject::GetArgumentTable(); 463e139cf23SCaroline Tice 464e139cf23SCaroline Tice for (int i = 0; i < eArgTypeLastArg; ++i) 465e139cf23SCaroline Tice if (table[i].arg_type == arg_type) 466e139cf23SCaroline Tice return (ArgumentTableEntry *) &(table[i]); 467e139cf23SCaroline Tice 468e139cf23SCaroline Tice return NULL; 469e139cf23SCaroline Tice } 470e139cf23SCaroline Tice 471e139cf23SCaroline Tice void 472e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter) 473e139cf23SCaroline Tice { 474e139cf23SCaroline Tice const ArgumentTableEntry* table = CommandObject::GetArgumentTable(); 475e139cf23SCaroline Tice ArgumentTableEntry *entry = (ArgumentTableEntry *) &(table[arg_type]); 476e139cf23SCaroline Tice 477e139cf23SCaroline Tice // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up... 478e139cf23SCaroline Tice 479e139cf23SCaroline Tice if (entry->arg_type != arg_type) 480e139cf23SCaroline Tice entry = CommandObject::FindArgumentDataByType (arg_type); 481e139cf23SCaroline Tice 482e139cf23SCaroline Tice if (!entry) 483e139cf23SCaroline Tice return; 484e139cf23SCaroline Tice 485e139cf23SCaroline Tice StreamString name_str; 486e139cf23SCaroline Tice name_str.Printf ("<%s>", entry->arg_name); 487e139cf23SCaroline Tice 488fc7a7f3bSEnrico Granata if (entry->help_function) 48982a7d983SEnrico Granata { 490fc7a7f3bSEnrico Granata const char* help_text = entry->help_function(); 49182a7d983SEnrico Granata if (!entry->help_function.self_formatting) 49282a7d983SEnrico Granata { 49382a7d983SEnrico Granata interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text, 494e139cf23SCaroline Tice name_str.GetSize()); 49582a7d983SEnrico Granata } 49682a7d983SEnrico Granata else 49782a7d983SEnrico Granata { 49882a7d983SEnrico Granata interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text, 49982a7d983SEnrico Granata name_str.GetSize()); 50082a7d983SEnrico Granata } 50182a7d983SEnrico Granata } 502e139cf23SCaroline Tice else 503e139cf23SCaroline Tice interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize()); 504e139cf23SCaroline Tice } 505e139cf23SCaroline Tice 506e139cf23SCaroline Tice const char * 507e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type) 508e139cf23SCaroline Tice { 509deaab222SCaroline Tice ArgumentTableEntry *entry = (ArgumentTableEntry *) &(CommandObject::GetArgumentTable()[arg_type]); 510deaab222SCaroline Tice 511deaab222SCaroline Tice // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up... 512deaab222SCaroline Tice 513deaab222SCaroline Tice if (entry->arg_type != arg_type) 514deaab222SCaroline Tice entry = CommandObject::FindArgumentDataByType (arg_type); 515deaab222SCaroline Tice 516e6acf355SJohnny Chen if (entry) 517deaab222SCaroline Tice return entry->arg_name; 518e6acf355SJohnny Chen 519e6acf355SJohnny Chen StreamString str; 520e6acf355SJohnny Chen str << "Arg name for type (" << arg_type << ") not in arg table!"; 521e6acf355SJohnny Chen return str.GetData(); 522e139cf23SCaroline Tice } 523e139cf23SCaroline Tice 524405fe67fSCaroline Tice bool 525e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type) 526405fe67fSCaroline Tice { 527405fe67fSCaroline Tice if ((arg_repeat_type == eArgRepeatPairPlain) 528405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairOptional) 529405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairPlus) 530405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairStar) 531405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairRange) 532405fe67fSCaroline Tice || (arg_repeat_type == eArgRepeatPairRangeOptional)) 533405fe67fSCaroline Tice return true; 534405fe67fSCaroline Tice 535405fe67fSCaroline Tice return false; 536405fe67fSCaroline Tice } 537405fe67fSCaroline Tice 538*34ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry 539*34ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry) 540*34ddc8dbSJohnny Chen { 541*34ddc8dbSJohnny Chen CommandObject::CommandArgumentEntry ret_val; 542*34ddc8dbSJohnny Chen for (unsigned i = 0; i < cmd_arg_entry.size(); ++i) 543*34ddc8dbSJohnny Chen if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association) 544*34ddc8dbSJohnny Chen ret_val.push_back(cmd_arg_entry[i]); 545*34ddc8dbSJohnny Chen return ret_val; 546*34ddc8dbSJohnny Chen } 547*34ddc8dbSJohnny Chen 548*34ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take 549*34ddc8dbSJohnny Chen // all the argument data into account. On rare cases where some argument sticks 550*34ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args. 551e139cf23SCaroline Tice void 552*34ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask) 553e139cf23SCaroline Tice { 554e139cf23SCaroline Tice int num_args = m_arguments.size(); 555e139cf23SCaroline Tice for (int i = 0; i < num_args; ++i) 556e139cf23SCaroline Tice { 557e139cf23SCaroline Tice if (i > 0) 558e139cf23SCaroline Tice str.Printf (" "); 559*34ddc8dbSJohnny Chen CommandArgumentEntry arg_entry = 560*34ddc8dbSJohnny Chen opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i] 561*34ddc8dbSJohnny Chen : OptSetFiltered(opt_set_mask, m_arguments[i]); 562e139cf23SCaroline Tice int num_alternatives = arg_entry.size(); 563405fe67fSCaroline Tice 564405fe67fSCaroline Tice if ((num_alternatives == 2) 565405fe67fSCaroline Tice && IsPairType (arg_entry[0].arg_repetition)) 566405fe67fSCaroline Tice { 567405fe67fSCaroline Tice const char *first_name = GetArgumentName (arg_entry[0].arg_type); 568405fe67fSCaroline Tice const char *second_name = GetArgumentName (arg_entry[1].arg_type); 569405fe67fSCaroline Tice switch (arg_entry[0].arg_repetition) 570405fe67fSCaroline Tice { 571405fe67fSCaroline Tice case eArgRepeatPairPlain: 572405fe67fSCaroline Tice str.Printf ("<%s> <%s>", first_name, second_name); 573405fe67fSCaroline Tice break; 574405fe67fSCaroline Tice case eArgRepeatPairOptional: 575405fe67fSCaroline Tice str.Printf ("[<%s> <%s>]", first_name, second_name); 576405fe67fSCaroline Tice break; 577405fe67fSCaroline Tice case eArgRepeatPairPlus: 578405fe67fSCaroline Tice str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name); 579405fe67fSCaroline Tice break; 580405fe67fSCaroline Tice case eArgRepeatPairStar: 581405fe67fSCaroline Tice str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name); 582405fe67fSCaroline Tice break; 583405fe67fSCaroline Tice case eArgRepeatPairRange: 584405fe67fSCaroline Tice str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name); 585405fe67fSCaroline Tice break; 586405fe67fSCaroline Tice case eArgRepeatPairRangeOptional: 587405fe67fSCaroline Tice str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name); 588405fe67fSCaroline Tice break; 589ca1176aaSCaroline Tice // Explicitly test for all the rest of the cases, so if new types get added we will notice the 590ca1176aaSCaroline Tice // missing case statement(s). 591ca1176aaSCaroline Tice case eArgRepeatPlain: 592ca1176aaSCaroline Tice case eArgRepeatOptional: 593ca1176aaSCaroline Tice case eArgRepeatPlus: 594ca1176aaSCaroline Tice case eArgRepeatStar: 595ca1176aaSCaroline Tice case eArgRepeatRange: 596ca1176aaSCaroline Tice // These should not be reached, as they should fail the IsPairType test above. 597ca1176aaSCaroline Tice break; 598405fe67fSCaroline Tice } 599405fe67fSCaroline Tice } 600405fe67fSCaroline Tice else 601405fe67fSCaroline Tice { 602e139cf23SCaroline Tice StreamString names; 603e139cf23SCaroline Tice for (int j = 0; j < num_alternatives; ++j) 604e139cf23SCaroline Tice { 605e139cf23SCaroline Tice if (j > 0) 606e139cf23SCaroline Tice names.Printf (" | "); 607e139cf23SCaroline Tice names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type)); 608e139cf23SCaroline Tice } 609e139cf23SCaroline Tice switch (arg_entry[0].arg_repetition) 610e139cf23SCaroline Tice { 611e139cf23SCaroline Tice case eArgRepeatPlain: 612e139cf23SCaroline Tice str.Printf ("<%s>", names.GetData()); 613e139cf23SCaroline Tice break; 614e139cf23SCaroline Tice case eArgRepeatPlus: 615e139cf23SCaroline Tice str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData()); 616e139cf23SCaroline Tice break; 617e139cf23SCaroline Tice case eArgRepeatStar: 618e139cf23SCaroline Tice str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData()); 619e139cf23SCaroline Tice break; 620e139cf23SCaroline Tice case eArgRepeatOptional: 621e139cf23SCaroline Tice str.Printf ("[<%s>]", names.GetData()); 622e139cf23SCaroline Tice break; 623405fe67fSCaroline Tice case eArgRepeatRange: 624fd54b368SJason Molenda str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData()); 625ca1176aaSCaroline Tice break; 626ca1176aaSCaroline Tice // Explicitly test for all the rest of the cases, so if new types get added we will notice the 627ca1176aaSCaroline Tice // missing case statement(s). 628ca1176aaSCaroline Tice case eArgRepeatPairPlain: 629ca1176aaSCaroline Tice case eArgRepeatPairOptional: 630ca1176aaSCaroline Tice case eArgRepeatPairPlus: 631ca1176aaSCaroline Tice case eArgRepeatPairStar: 632ca1176aaSCaroline Tice case eArgRepeatPairRange: 633ca1176aaSCaroline Tice case eArgRepeatPairRangeOptional: 634ca1176aaSCaroline Tice // These should not be hit, as they should pass the IsPairType test above, and control should 635ca1176aaSCaroline Tice // have gone into the other branch of the if statement. 636ca1176aaSCaroline Tice break; 637405fe67fSCaroline Tice } 638e139cf23SCaroline Tice } 639e139cf23SCaroline Tice } 640e139cf23SCaroline Tice } 641e139cf23SCaroline Tice 6420c16aa6dSStephen Wilson CommandArgumentType 643e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name) 644e139cf23SCaroline Tice { 645e139cf23SCaroline Tice CommandArgumentType return_type = eArgTypeLastArg; 646e139cf23SCaroline Tice 647e139cf23SCaroline Tice std::string arg_name_str (arg_name); 648e139cf23SCaroline Tice size_t len = arg_name_str.length(); 649e139cf23SCaroline Tice if (arg_name[0] == '<' 650e139cf23SCaroline Tice && arg_name[len-1] == '>') 651e139cf23SCaroline Tice arg_name_str = arg_name_str.substr (1, len-2); 652e139cf23SCaroline Tice 653331eff39SJohnny Chen const ArgumentTableEntry *table = GetArgumentTable(); 654e139cf23SCaroline Tice for (int i = 0; i < eArgTypeLastArg; ++i) 655331eff39SJohnny Chen if (arg_name_str.compare (table[i].arg_name) == 0) 656e139cf23SCaroline Tice return_type = g_arguments_data[i].arg_type; 657e139cf23SCaroline Tice 658e139cf23SCaroline Tice return return_type; 659e139cf23SCaroline Tice } 660e139cf23SCaroline Tice 661e139cf23SCaroline Tice static const char * 662e139cf23SCaroline Tice BreakpointIDHelpTextCallback () 663e139cf23SCaroline Tice { 66486edbf41SGreg Clayton return "Breakpoint ID's consist major and minor numbers; the major number " 66586edbf41SGreg Clayton "corresponds to the single entity that was created with a 'breakpoint set' " 66686edbf41SGreg Clayton "command; the minor numbers correspond to all the locations that were actually " 66786edbf41SGreg Clayton "found/set based on the major breakpoint. A full breakpoint ID might look like " 66886edbf41SGreg Clayton "3.14, meaning the 14th location set for the 3rd breakpoint. You can specify " 66986edbf41SGreg Clayton "all the locations of a breakpoint by just indicating the major breakpoint " 67086edbf41SGreg Clayton "number. A valid breakpoint id consists either of just the major id number, " 67186edbf41SGreg Clayton "or the major number, a dot, and the location number (e.g. 3 or 3.2 could " 67286edbf41SGreg Clayton "both be valid breakpoint ids)."; 673e139cf23SCaroline Tice } 674e139cf23SCaroline Tice 675e139cf23SCaroline Tice static const char * 676e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback () 677e139cf23SCaroline Tice { 67886edbf41SGreg Clayton return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. " 67986edbf41SGreg Clayton "This can be done through several mechanisms. The easiest way is to just " 68086edbf41SGreg Clayton "enter a space-separated list of breakpoint ids. To specify all the " 68186edbf41SGreg Clayton "breakpoint locations under a major breakpoint, you can use the major " 68286edbf41SGreg Clayton "breakpoint number followed by '.*', eg. '5.*' means all the locations under " 68386edbf41SGreg Clayton "breakpoint 5. You can also indicate a range of breakpoints by using " 68486edbf41SGreg Clayton "<start-bp-id> - <end-bp-id>. The start-bp-id and end-bp-id for a range can " 68586edbf41SGreg Clayton "be any valid breakpoint ids. It is not legal, however, to specify a range " 68686edbf41SGreg Clayton "using specific locations that cross major breakpoint numbers. I.e. 3.2 - 3.7" 68786edbf41SGreg Clayton " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal."; 68886edbf41SGreg Clayton } 68986edbf41SGreg Clayton 69086edbf41SGreg Clayton static const char * 69186edbf41SGreg Clayton GDBFormatHelpTextCallback () 69286edbf41SGreg Clayton { 693f91381e8SGreg Clayton return "A GDB format consists of a repeat count, a format letter and a size letter. " 694f91381e8SGreg Clayton "The repeat count is optional and defaults to 1. The format letter is optional " 695f91381e8SGreg Clayton "and defaults to the previous format that was used. The size letter is optional " 696f91381e8SGreg Clayton "and defaults to the previous size that was used.\n" 697f91381e8SGreg Clayton "\n" 698f91381e8SGreg Clayton "Format letters include:\n" 699f91381e8SGreg Clayton "o - octal\n" 700f91381e8SGreg Clayton "x - hexadecimal\n" 701f91381e8SGreg Clayton "d - decimal\n" 702f91381e8SGreg Clayton "u - unsigned decimal\n" 703f91381e8SGreg Clayton "t - binary\n" 704f91381e8SGreg Clayton "f - float\n" 705f91381e8SGreg Clayton "a - address\n" 706f91381e8SGreg Clayton "i - instruction\n" 707f91381e8SGreg Clayton "c - char\n" 708f91381e8SGreg Clayton "s - string\n" 709f91381e8SGreg Clayton "T - OSType\n" 710f91381e8SGreg Clayton "A - float as hex\n" 711f91381e8SGreg Clayton "\n" 712f91381e8SGreg Clayton "Size letters include:\n" 713f91381e8SGreg Clayton "b - 1 byte (byte)\n" 714f91381e8SGreg Clayton "h - 2 bytes (halfword)\n" 715f91381e8SGreg Clayton "w - 4 bytes (word)\n" 716f91381e8SGreg Clayton "g - 8 bytes (giant)\n" 717f91381e8SGreg Clayton "\n" 718f91381e8SGreg Clayton "Example formats:\n" 719f91381e8SGreg Clayton "32xb - show 32 1 byte hexadecimal integer values\n" 720f91381e8SGreg Clayton "16xh - show 16 2 byte hexadecimal integer values\n" 721f91381e8SGreg Clayton "64 - show 64 2 byte hexadecimal integer values (format and size from the last format)\n" 722f91381e8SGreg Clayton "dw - show 1 4 byte decimal integer value\n" 723f91381e8SGreg Clayton ; 724e139cf23SCaroline Tice } 725e139cf23SCaroline Tice 7260a3958e0SEnrico Granata static const char * 7270a3958e0SEnrico Granata FormatHelpTextCallback () 7280a3958e0SEnrico Granata { 72982a7d983SEnrico Granata 73082a7d983SEnrico Granata static char* help_text_ptr = NULL; 73182a7d983SEnrico Granata 73282a7d983SEnrico Granata if (help_text_ptr) 73382a7d983SEnrico Granata return help_text_ptr; 73482a7d983SEnrico Granata 7350a3958e0SEnrico Granata StreamString sstr; 7360a3958e0SEnrico Granata sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n"; 7370a3958e0SEnrico Granata for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1)) 7380a3958e0SEnrico Granata { 73982a7d983SEnrico Granata if (f != eFormatDefault) 74082a7d983SEnrico Granata sstr.PutChar('\n'); 74182a7d983SEnrico Granata 7420a3958e0SEnrico Granata char format_char = FormatManager::GetFormatAsFormatChar(f); 7430a3958e0SEnrico Granata if (format_char) 7440a3958e0SEnrico Granata sstr.Printf("'%c' or ", format_char); 7450a3958e0SEnrico Granata 74682a7d983SEnrico Granata sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f)); 7470a3958e0SEnrico Granata } 7480a3958e0SEnrico Granata 7490a3958e0SEnrico Granata sstr.Flush(); 7500a3958e0SEnrico Granata 7510a3958e0SEnrico Granata std::string data = sstr.GetString(); 7520a3958e0SEnrico Granata 75382a7d983SEnrico Granata help_text_ptr = new char[data.length()+1]; 7540a3958e0SEnrico Granata 75582a7d983SEnrico Granata data.copy(help_text_ptr, data.length()); 7560a3958e0SEnrico Granata 75782a7d983SEnrico Granata return help_text_ptr; 7580a3958e0SEnrico Granata } 7590a3958e0SEnrico Granata 7600a3958e0SEnrico Granata static const char * 76182a7d983SEnrico Granata SummaryStringHelpTextCallback() 7620a3958e0SEnrico Granata { 76382a7d983SEnrico Granata return 76482a7d983SEnrico Granata "A summary string is a way to extract information from variables in order to present them using a summary.\n" 76582a7d983SEnrico Granata "Summary strings contain static text, variables, scopes and control sequences:\n" 76682a7d983SEnrico Granata " - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n" 76782a7d983SEnrico Granata " - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n" 76882a7d983SEnrico 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" 76982a7d983SEnrico Granata " - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n" 77082a7d983SEnrico 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" 77182a7d983SEnrico 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" 77282a7d983SEnrico 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" 77382a7d983SEnrico 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" 7749128ee2fSEnrico 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." 7759128ee2fSEnrico 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" 77682a7d983SEnrico 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." 77782a7d983SEnrico 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" 77882a7d983SEnrico Granata " path refers to:\n" 77982a7d983SEnrico 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" 78082a7d983SEnrico Granata " and displayed as an individual variable\n" 78182a7d983SEnrico 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" 78282a7d983SEnrico 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" 7839128ee2fSEnrico 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" 7849128ee2fSEnrico 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" 7859128ee2fSEnrico Granata " special symbols only allowed as part of a variable:\n" 7869128ee2fSEnrico Granata " %V: show the value of the object by default\n" 7879128ee2fSEnrico Granata " %S: show the summary of the object by default\n" 7889128ee2fSEnrico Granata " %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n" 7899128ee2fSEnrico Granata " %L: show the location of the object (memory address or a register name)\n" 7909128ee2fSEnrico Granata " %#: show the number of children of the object\n" 7919128ee2fSEnrico Granata " %T: show the type of the object\n" 7929128ee2fSEnrico 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" 7939128ee2fSEnrico 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" 7949128ee2fSEnrico Granata " count the number of actual elements stored in an std::list:\n" 7959128ee2fSEnrico Granata "type summary add -s \"${svar%#}\" -x \"std::list<\""; 7969128ee2fSEnrico Granata } 7979128ee2fSEnrico Granata 7989128ee2fSEnrico Granata static const char * 7999128ee2fSEnrico Granata ExprPathHelpTextCallback() 8009128ee2fSEnrico Granata { 8019128ee2fSEnrico Granata return 8029128ee2fSEnrico 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" 8039128ee2fSEnrico Granata "For instance, given a class:\n" 8049128ee2fSEnrico Granata " class foo {\n" 8059128ee2fSEnrico Granata " int a;\n" 8069128ee2fSEnrico Granata " int b; .\n" 8079128ee2fSEnrico Granata " foo* next;\n" 8089128ee2fSEnrico Granata " };\n" 8099128ee2fSEnrico Granata "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n" 8109128ee2fSEnrico 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" 8119128ee2fSEnrico 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" 8129128ee2fSEnrico Granata "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n" 8139128ee2fSEnrico 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" 8149128ee2fSEnrico 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" 8159128ee2fSEnrico 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" 8169128ee2fSEnrico 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" 8179128ee2fSEnrico Granata " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory)."; 8180a3958e0SEnrico Granata } 8190a3958e0SEnrico Granata 820184d7a72SJohnny Chen void 821de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange) 822184d7a72SJohnny Chen { 823184d7a72SJohnny Chen CommandArgumentData id_arg; 824184d7a72SJohnny Chen CommandArgumentData id_range_arg; 825184d7a72SJohnny Chen 826184d7a72SJohnny Chen // Create the first variant for the first (and only) argument for this command. 827de753464SJohnny Chen id_arg.arg_type = ID; 828184d7a72SJohnny Chen id_arg.arg_repetition = eArgRepeatOptional; 829184d7a72SJohnny Chen 830184d7a72SJohnny Chen // Create the second variant for the first (and only) argument for this command. 831de753464SJohnny Chen id_range_arg.arg_type = IDRange; 832184d7a72SJohnny Chen id_range_arg.arg_repetition = eArgRepeatOptional; 833184d7a72SJohnny Chen 834a3234732SJohnny Chen // The first (and only) argument for this command could be either an id or an id_range. 835184d7a72SJohnny Chen // Push both variants into the entry for the first argument for this command. 836184d7a72SJohnny Chen arg.push_back(id_arg); 837184d7a72SJohnny Chen arg.push_back(id_range_arg); 838184d7a72SJohnny Chen } 839184d7a72SJohnny Chen 8409d0402b1SGreg Clayton const char * 8419d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type) 8429d0402b1SGreg Clayton { 8439d0402b1SGreg Clayton if (arg_type >=0 && arg_type < eArgTypeLastArg) 8449d0402b1SGreg Clayton return g_arguments_data[arg_type].arg_name; 8459d0402b1SGreg Clayton return NULL; 8469d0402b1SGreg Clayton 8479d0402b1SGreg Clayton } 8489d0402b1SGreg Clayton 8499d0402b1SGreg Clayton const char * 8509d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type) 8519d0402b1SGreg Clayton { 8529d0402b1SGreg Clayton if (arg_type >=0 && arg_type < eArgTypeLastArg) 8539d0402b1SGreg Clayton return g_arguments_data[arg_type].help_text; 8549d0402b1SGreg Clayton return NULL; 8559d0402b1SGreg Clayton } 8569d0402b1SGreg Clayton 857e139cf23SCaroline Tice CommandObject::ArgumentTableEntry 858e139cf23SCaroline Tice CommandObject::g_arguments_data[] = 859e139cf23SCaroline Tice { 8607f941d95SEnrico Granata { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { NULL, false }, "A valid address in the target program's execution space." }, 8617f941d95SEnrico Granata { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of an abbreviation (alias) for a debugger command." }, 8627f941d95SEnrico Granata { eArgTypeAliasOptions, "options-for-aliased-command", CommandCompletions::eNoCompletion, { NULL, false }, "Command options to be used as part of an alias (abbreviation) definition. (See 'help commands alias' for more information.)" }, 8637f941d95SEnrico Granata { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { NULL, false }, "The architecture name, e.g. i386 or x86_64." }, 8647f941d95SEnrico Granata { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { NULL, false }, "A Boolean value: 'true' or 'false'" }, 8657f941d95SEnrico Granata { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, NULL }, 8667f941d95SEnrico Granata { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, NULL }, 8677f941d95SEnrico Granata { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { NULL, false }, "Number of bytes to use." }, 8687f941d95SEnrico Granata { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { NULL, false }, "Then name of a class from the debug information in the program." }, 8697f941d95SEnrico Granata { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { NULL, false }, "A debugger command (may be multiple words), without any options or arguments." }, 8707f941d95SEnrico Granata { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { NULL, false }, "An unsigned integer." }, 8717f941d95SEnrico Granata { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8727f941d95SEnrico Granata { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8739128ee2fSEnrico Granata { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, NULL }, 8747f941d95SEnrico Granata { eArgTypeExprFormat, "expression-format", CommandCompletions::eNoCompletion, { NULL, false }, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]" }, 8757f941d95SEnrico Granata { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { NULL, false }, "The name of a file (can include path)." }, 8767f941d95SEnrico Granata { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, NULL }, 8777f941d95SEnrico Granata { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { NULL, false }, "Index into a thread's list of frames." }, 8787f941d95SEnrico Granata { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8797f941d95SEnrico Granata { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a function." }, 88086edbf41SGreg Clayton { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, NULL }, 8817f941d95SEnrico Granata { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { NULL, false }, "An index into a list." }, 8827f941d95SEnrico Granata { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { NULL, false }, "Line number in a source file." }, 8837f941d95SEnrico Granata { eArgTypeLogCategory, "log-category", CommandCompletions::eNoCompletion, { NULL, 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." }, 8847f941d95SEnrico Granata { eArgTypeLogChannel, "log-channel", CommandCompletions::eNoCompletion, { NULL, 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)." }, 8857f941d95SEnrico Granata { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { NULL, false }, "A C++ method name." }, 8867f941d95SEnrico Granata { eArgTypeName, "name", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8877f941d95SEnrico Granata { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8887f941d95SEnrico Granata { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { NULL, false }, "The number of lines to use." }, 8897f941d95SEnrico Granata { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { NULL, false }, "The number of items per line to display." }, 8907f941d95SEnrico Granata { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8917f941d95SEnrico Granata { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8927f941d95SEnrico Granata { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { NULL, false }, "A command that is entered as a single line of text." }, 8937f941d95SEnrico Granata { eArgTypePath, "path", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8947f941d95SEnrico Granata { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { NULL, false }, "The process ID number." }, 8957f941d95SEnrico Granata { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 8967f941d95SEnrico Granata { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of the process." }, 8979128ee2fSEnrico Granata { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a Python class." }, 8989128ee2fSEnrico Granata { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a Python function." }, 8999128ee2fSEnrico Granata { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { NULL, false }, "Source code written in Python." }, 9007f941d95SEnrico Granata { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of the thread queue." }, 9017f941d95SEnrico Granata { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { NULL, false }, "A register name." }, 9027f941d95SEnrico Granata { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { NULL, false }, "A regular expression." }, 9037f941d95SEnrico Granata { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { NULL, false }, "Arguments to be passed to the target program when it starts executing." }, 9047f941d95SEnrico Granata { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 9050a305db7SEnrico Granata { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { NULL, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." }, 9067f941d95SEnrico Granata { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { NULL, false }, "The scripting language to be used for script-based commands. Currently only Python is valid." }, 9077f941d95SEnrico Granata { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { NULL, false }, "The word for which you wish to search for information about." }, 9087f941d95SEnrico Granata { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { NULL, false }, "An Objective-C selector name." }, 9097f941d95SEnrico Granata { eArgTypeSettingIndex, "setting-index", CommandCompletions::eNoCompletion, { NULL, false }, "An index into a settings variable that is an array (try 'settings list' to see all the possible settings variables and their types)." }, 9107f941d95SEnrico Granata { eArgTypeSettingKey, "setting-key", CommandCompletions::eNoCompletion, { NULL, false }, "A key into a settings variables that is a dictionary (try 'settings list' to see all the possible settings variables and their types)." }, 9117f941d95SEnrico Granata { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" }, 9127f941d95SEnrico Granata { eArgTypeSettingVariableName, "setting-variable-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a settable internal debugger variable. Type 'settings list' to see a complete list of such variables." }, 9137f941d95SEnrico Granata { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a shared library." }, 9147f941d95SEnrico Granata { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { NULL, false }, "The name of a source file.." }, 9157f941d95SEnrico Granata { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { NULL, false }, "Specify a sort order when dumping lists." }, 9167f941d95SEnrico Granata { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 9177f941d95SEnrico Granata { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, NULL }, 9187f941d95SEnrico Granata { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { NULL, false }, "Any symbol name (function name, variable, argument, etc.)" }, 9197f941d95SEnrico Granata { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { NULL, false }, "Thread ID number." }, 9207f941d95SEnrico Granata { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { NULL, false }, "Index into the process' list of threads." }, 9217f941d95SEnrico Granata { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { NULL, false }, "The thread's name." }, 922331eff39SJohnny Chen { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { NULL, false }, "An unsigned integer." }, 9237f941d95SEnrico Granata { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { NULL, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." }, 9247f941d95SEnrico Granata { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a variable in your program." }, 9257f941d95SEnrico Granata { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { NULL, false }, "A value could be anything, depending on where and how it is used." }, 9267f941d95SEnrico Granata { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." }, 9277f941d95SEnrico Granata { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { NULL, false }, "No help available for this." }, 928b1d7529eSJohnny Chen { eArgTypePlatform, "platform-name", CommandCompletions::ePlatformPluginCompletion, { NULL, false }, "The name of an installed platform plug-in . Type 'platform list' to see a complete list of installed platforms." }, 929de753464SJohnny Chen { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { NULL, false }, "Watchpoint IDs are positive integers." }, 930de753464SJohnny Chen { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { NULL, false }, "For example, '1-3' or '1 to 3'." }, 931887062aeSJohnny Chen { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { NULL, false }, "Specify the type for a watchpoint." } 932e139cf23SCaroline Tice }; 933e139cf23SCaroline Tice 934e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry* 935e139cf23SCaroline Tice CommandObject::GetArgumentTable () 936e139cf23SCaroline Tice { 9379d0402b1SGreg Clayton // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration 9389d0402b1SGreg Clayton assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg); 939e139cf23SCaroline Tice return CommandObject::g_arguments_data; 940e139cf23SCaroline Tice } 941e139cf23SCaroline Tice 942e139cf23SCaroline Tice 943