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 <getopt.h>
1830fdc8d8SChris Lattner #include <stdlib.h>
1930fdc8d8SChris Lattner #include <ctype.h>
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner #include "lldb/Core/Address.h"
22ca7835c6SJohnny Chen #include "lldb/Core/ArchSpec.h"
2340af72e1SJim Ingham #include "lldb/Interpreter/Options.h"
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner // These are for the Sourcename completers.
2630fdc8d8SChris Lattner // FIXME: Make a separate file for the completers.
2753239f00SGreg Clayton #include "lldb/Host/FileSpec.h"
2830fdc8d8SChris Lattner #include "lldb/Core/FileSpecList.h"
2930fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3030fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
3330fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
3430fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreter.h"
3530fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreterPython.h"
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner using namespace lldb;
3830fdc8d8SChris Lattner using namespace lldb_private;
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner //-------------------------------------------------------------------------
4130fdc8d8SChris Lattner // CommandObject
4230fdc8d8SChris Lattner //-------------------------------------------------------------------------
4330fdc8d8SChris Lattner 
44a7015092SGreg Clayton CommandObject::CommandObject
45a7015092SGreg Clayton (
46a7015092SGreg Clayton     CommandInterpreter &interpreter,
47a7015092SGreg Clayton     const char *name,
48a7015092SGreg Clayton     const char *help,
49a7015092SGreg Clayton     const char *syntax,
50a7015092SGreg Clayton     uint32_t flags
51a7015092SGreg Clayton ) :
52a7015092SGreg Clayton     m_interpreter (interpreter),
5330fdc8d8SChris Lattner     m_cmd_name (name),
5430fdc8d8SChris Lattner     m_cmd_help_short (),
5530fdc8d8SChris Lattner     m_cmd_help_long (),
5630fdc8d8SChris Lattner     m_cmd_syntax (),
57279a6c26SJim Ingham     m_is_alias (false),
58e139cf23SCaroline Tice     m_flags (flags),
59a9f7b79dSGreg Clayton     m_arguments(),
60a9f7b79dSGreg Clayton     m_command_override_callback (NULL),
61a9f7b79dSGreg Clayton     m_command_override_baton (NULL)
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());
92e139cf23SCaroline Tice         if (GetOptions() != NULL)
93e139cf23SCaroline Tice             syntax_str.Printf (" <cmd-options>");
94e139cf23SCaroline Tice         if (m_arguments.size() > 0)
95e139cf23SCaroline Tice         {
96e139cf23SCaroline Tice             syntax_str.Printf (" ");
97*ca5acdbeSEnrico 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.
14830fdc8d8SChris Lattner     return NULL;
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();
16030fdc8d8SChris Lattner     if (options != NULL)
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         {
239f9fc609fSGreg Clayton             result.AppendError (GetInvalidProcessDescription());
240f9fc609fSGreg Clayton             return false;
241f9fc609fSGreg Clayton         }
242f9fc609fSGreg Clayton 
243f9fc609fSGreg Clayton         if ((flags & eFlagRequiresThread) && !m_exe_ctx.HasThreadScope())
244f9fc609fSGreg Clayton         {
245f9fc609fSGreg Clayton             result.AppendError (GetInvalidThreadDescription());
246f9fc609fSGreg Clayton             return false;
247f9fc609fSGreg Clayton         }
248f9fc609fSGreg Clayton 
249f9fc609fSGreg Clayton         if ((flags & eFlagRequiresFrame) && !m_exe_ctx.HasFrameScope())
250f9fc609fSGreg Clayton         {
251f9fc609fSGreg Clayton             result.AppendError (GetInvalidFrameDescription());
252f9fc609fSGreg Clayton             return false;
253f9fc609fSGreg Clayton         }
254f9fc609fSGreg Clayton 
255f9fc609fSGreg Clayton         if ((flags & eFlagRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == NULL))
256f9fc609fSGreg Clayton         {
257f9fc609fSGreg Clayton             result.AppendError (GetInvalidRegContextDescription());
258f9fc609fSGreg Clayton             return false;
259f9fc609fSGreg Clayton         }
260f9fc609fSGreg Clayton 
261f9fc609fSGreg Clayton         if (flags & eFlagTryTargetAPILock)
262f9fc609fSGreg Clayton         {
263f9fc609fSGreg Clayton             Target *target = m_exe_ctx.GetTargetPtr();
264f9fc609fSGreg Clayton             if (target)
265f9fc609fSGreg Clayton             {
266f9fc609fSGreg Clayton                 if (m_api_locker.TryLock (target->GetAPIMutex(), NULL) == false)
267f9fc609fSGreg Clayton                 {
268f9fc609fSGreg Clayton                     result.AppendError ("failed to get API lock");
269f9fc609fSGreg Clayton                     return false;
270f9fc609fSGreg Clayton                 }
271f9fc609fSGreg Clayton             }
272f9fc609fSGreg Clayton         }
273f9fc609fSGreg Clayton     }
274f9fc609fSGreg Clayton 
275b766a73dSGreg Clayton     if (GetFlags().AnySet (CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused))
276b766a73dSGreg Clayton     {
277c14ee32dSGreg Clayton         Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
27830fdc8d8SChris Lattner         if (process == NULL)
27930fdc8d8SChris Lattner         {
280b8e8a5f3SJim Ingham             // A process that is not running is considered paused.
281b8e8a5f3SJim Ingham             if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched))
282b8e8a5f3SJim Ingham             {
28330fdc8d8SChris Lattner                 result.AppendError ("Process must exist.");
28430fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
28530fdc8d8SChris Lattner                 return false;
28630fdc8d8SChris Lattner             }
287b8e8a5f3SJim Ingham         }
28830fdc8d8SChris Lattner         else
28930fdc8d8SChris Lattner         {
29030fdc8d8SChris Lattner             StateType state = process->GetState();
29130fdc8d8SChris Lattner             switch (state)
29230fdc8d8SChris Lattner             {
2937a5388bfSGreg Clayton             case eStateInvalid:
29430fdc8d8SChris Lattner             case eStateSuspended:
29530fdc8d8SChris Lattner             case eStateCrashed:
29630fdc8d8SChris Lattner             case eStateStopped:
29730fdc8d8SChris Lattner                 break;
29830fdc8d8SChris Lattner 
299b766a73dSGreg Clayton             case eStateConnected:
300b766a73dSGreg Clayton             case eStateAttaching:
301b766a73dSGreg Clayton             case eStateLaunching:
30230fdc8d8SChris Lattner             case eStateDetached:
30330fdc8d8SChris Lattner             case eStateExited:
30430fdc8d8SChris Lattner             case eStateUnloaded:
30573b472d4SGreg Clayton                 if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched))
30630fdc8d8SChris Lattner                 {
30730fdc8d8SChris Lattner                     result.AppendError ("Process must be launched.");
30830fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
30930fdc8d8SChris Lattner                     return false;
31030fdc8d8SChris Lattner                 }
31130fdc8d8SChris Lattner                 break;
31230fdc8d8SChris Lattner 
31330fdc8d8SChris Lattner             case eStateRunning:
31430fdc8d8SChris Lattner             case eStateStepping:
31573b472d4SGreg Clayton                 if (GetFlags().Test(CommandObject::eFlagProcessMustBePaused))
31630fdc8d8SChris Lattner                 {
31730fdc8d8SChris Lattner                     result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
31830fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
31930fdc8d8SChris Lattner                     return false;
32030fdc8d8SChris Lattner                 }
32130fdc8d8SChris Lattner             }
32230fdc8d8SChris Lattner         }
323b766a73dSGreg Clayton     }
3245a988416SJim Ingham     return true;
32530fdc8d8SChris Lattner }
32630fdc8d8SChris Lattner 
327f9fc609fSGreg Clayton void
328f9fc609fSGreg Clayton CommandObject::Cleanup ()
329f9fc609fSGreg Clayton {
330f9fc609fSGreg Clayton     m_exe_ctx.Clear();
331f9fc609fSGreg Clayton     m_api_locker.Unlock();
332f9fc609fSGreg Clayton }
333f9fc609fSGreg Clayton 
334f9fc609fSGreg Clayton 
33530fdc8d8SChris Lattner class CommandDictCommandPartialMatch
33630fdc8d8SChris Lattner {
33730fdc8d8SChris Lattner     public:
33830fdc8d8SChris Lattner         CommandDictCommandPartialMatch (const char *match_str)
33930fdc8d8SChris Lattner         {
34030fdc8d8SChris Lattner             m_match_str = match_str;
34130fdc8d8SChris Lattner         }
34230fdc8d8SChris Lattner         bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const
34330fdc8d8SChris Lattner         {
34430fdc8d8SChris Lattner             // A NULL or empty string matches everything.
34530fdc8d8SChris Lattner             if (m_match_str == NULL || *m_match_str == '\0')
346c7bece56SGreg Clayton                 return true;
34730fdc8d8SChris Lattner 
348c7bece56SGreg Clayton             return map_element.first.find (m_match_str, 0) == 0;
34930fdc8d8SChris Lattner         }
35030fdc8d8SChris Lattner 
35130fdc8d8SChris Lattner     private:
35230fdc8d8SChris Lattner         const char *m_match_str;
35330fdc8d8SChris Lattner };
35430fdc8d8SChris Lattner 
35530fdc8d8SChris Lattner int
35630fdc8d8SChris Lattner CommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str,
35730fdc8d8SChris Lattner                                               StringList &matches)
35830fdc8d8SChris Lattner {
35930fdc8d8SChris Lattner     int number_added = 0;
36030fdc8d8SChris Lattner     CommandDictCommandPartialMatch matcher(cmd_str);
36130fdc8d8SChris Lattner 
36230fdc8d8SChris Lattner     CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher);
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner     while (matching_cmds != in_map.end())
36530fdc8d8SChris Lattner     {
36630fdc8d8SChris Lattner         ++number_added;
36730fdc8d8SChris Lattner         matches.AppendString((*matching_cmds).first.c_str());
36830fdc8d8SChris Lattner         matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);;
36930fdc8d8SChris Lattner     }
37030fdc8d8SChris Lattner     return number_added;
37130fdc8d8SChris Lattner }
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner int
37430fdc8d8SChris Lattner CommandObject::HandleCompletion
37530fdc8d8SChris Lattner (
37630fdc8d8SChris Lattner     Args &input,
37730fdc8d8SChris Lattner     int &cursor_index,
37830fdc8d8SChris Lattner     int &cursor_char_position,
37930fdc8d8SChris Lattner     int match_start_point,
38030fdc8d8SChris Lattner     int max_return_elements,
381558ce124SJim Ingham     bool &word_complete,
38230fdc8d8SChris Lattner     StringList &matches
38330fdc8d8SChris Lattner )
38430fdc8d8SChris Lattner {
3856561d15dSJohnny Chen     // Default implmentation of WantsCompletion() is !WantsRawCommandString().
3866561d15dSJohnny Chen     // Subclasses who want raw command string but desire, for example,
3876561d15dSJohnny Chen     // argument completion should override WantsCompletion() to return true,
3886561d15dSJohnny Chen     // instead.
3896f99b637SJohnny Chen     if (WantsRawCommandString() && !WantsCompletion())
39030fdc8d8SChris Lattner     {
39130fdc8d8SChris Lattner         // FIXME: Abstract telling the completion to insert the completion character.
39230fdc8d8SChris Lattner         matches.Clear();
39330fdc8d8SChris Lattner         return -1;
39430fdc8d8SChris Lattner     }
39530fdc8d8SChris Lattner     else
39630fdc8d8SChris Lattner     {
39730fdc8d8SChris Lattner         // Can we do anything generic with the options?
39830fdc8d8SChris Lattner         Options *cur_options = GetOptions();
39930fdc8d8SChris Lattner         CommandReturnObject result;
40030fdc8d8SChris Lattner         OptionElementVector opt_element_vector;
40130fdc8d8SChris Lattner 
40230fdc8d8SChris Lattner         if (cur_options != NULL)
40330fdc8d8SChris Lattner         {
40430fdc8d8SChris Lattner             // Re-insert the dummy command name string which will have been
40530fdc8d8SChris Lattner             // stripped off:
40630fdc8d8SChris Lattner             input.Unshift ("dummy-string");
40730fdc8d8SChris Lattner             cursor_index++;
40830fdc8d8SChris Lattner 
40930fdc8d8SChris Lattner 
41030fdc8d8SChris Lattner             // I stick an element on the end of the input, because if the last element is
411b7ad58a0SGreg Clayton             // option that requires an argument, getopt_long_only will freak out.
41230fdc8d8SChris Lattner 
41330fdc8d8SChris Lattner             input.AppendArgument ("<FAKE-VALUE>");
41430fdc8d8SChris Lattner 
415d43e0094SJim Ingham             input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index);
41630fdc8d8SChris Lattner 
41730fdc8d8SChris Lattner             input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1);
41830fdc8d8SChris Lattner 
41930fdc8d8SChris Lattner             bool handled_by_options;
420eb0103f2SGreg Clayton             handled_by_options = cur_options->HandleOptionCompletion (input,
42130fdc8d8SChris Lattner                                                                       opt_element_vector,
42230fdc8d8SChris Lattner                                                                       cursor_index,
42330fdc8d8SChris Lattner                                                                       cursor_char_position,
42430fdc8d8SChris Lattner                                                                       match_start_point,
42530fdc8d8SChris Lattner                                                                       max_return_elements,
426558ce124SJim Ingham                                                                       word_complete,
42730fdc8d8SChris Lattner                                                                       matches);
42830fdc8d8SChris Lattner             if (handled_by_options)
42930fdc8d8SChris Lattner                 return matches.GetSize();
43030fdc8d8SChris Lattner         }
43130fdc8d8SChris Lattner 
43230fdc8d8SChris Lattner         // If we got here, the last word is not an option or an option argument.
433a7015092SGreg Clayton         return HandleArgumentCompletion (input,
43430fdc8d8SChris Lattner                                          cursor_index,
43530fdc8d8SChris Lattner                                          cursor_char_position,
43630fdc8d8SChris Lattner                                          opt_element_vector,
43730fdc8d8SChris Lattner                                          match_start_point,
43830fdc8d8SChris Lattner                                          max_return_elements,
439558ce124SJim Ingham                                          word_complete,
44030fdc8d8SChris Lattner                                          matches);
44130fdc8d8SChris Lattner     }
44230fdc8d8SChris Lattner }
44330fdc8d8SChris Lattner 
44430fdc8d8SChris Lattner bool
445a7015092SGreg Clayton CommandObject::HelpTextContainsWord (const char *search_word)
44630fdc8d8SChris Lattner {
44730fdc8d8SChris Lattner     std::string options_usage_help;
44830fdc8d8SChris Lattner 
44930fdc8d8SChris Lattner     bool found_word = false;
45030fdc8d8SChris Lattner 
451998255bfSGreg Clayton     const char *short_help = GetHelp();
452998255bfSGreg Clayton     const char *long_help = GetHelpLong();
453998255bfSGreg Clayton     const char *syntax_help = GetSyntax();
45430fdc8d8SChris Lattner 
455998255bfSGreg Clayton     if (short_help && strcasestr (short_help, search_word))
45630fdc8d8SChris Lattner         found_word = true;
457998255bfSGreg Clayton     else if (long_help && strcasestr (long_help, search_word))
45830fdc8d8SChris Lattner         found_word = true;
459998255bfSGreg Clayton     else if (syntax_help && strcasestr (syntax_help, search_word))
46030fdc8d8SChris Lattner         found_word = true;
46130fdc8d8SChris Lattner 
46230fdc8d8SChris Lattner     if (!found_word
46330fdc8d8SChris Lattner         && GetOptions() != NULL)
46430fdc8d8SChris Lattner     {
46530fdc8d8SChris Lattner         StreamString usage_help;
466eb0103f2SGreg Clayton         GetOptions()->GenerateOptionUsage (usage_help, this);
46730fdc8d8SChris Lattner         if (usage_help.GetSize() > 0)
46830fdc8d8SChris Lattner         {
46930fdc8d8SChris Lattner             const char *usage_text = usage_help.GetData();
4704b6fbf37SCaroline Tice             if (strcasestr (usage_text, search_word))
47130fdc8d8SChris Lattner               found_word = true;
47230fdc8d8SChris Lattner         }
47330fdc8d8SChris Lattner     }
47430fdc8d8SChris Lattner 
47530fdc8d8SChris Lattner     return found_word;
47630fdc8d8SChris Lattner }
477e139cf23SCaroline Tice 
478e139cf23SCaroline Tice int
479e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries  ()
480e139cf23SCaroline Tice {
481e139cf23SCaroline Tice     return m_arguments.size();
482e139cf23SCaroline Tice }
483e139cf23SCaroline Tice 
484e139cf23SCaroline Tice CommandObject::CommandArgumentEntry *
485e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx)
486e139cf23SCaroline Tice {
487e139cf23SCaroline Tice     if (idx < m_arguments.size())
488e139cf23SCaroline Tice         return &(m_arguments[idx]);
489e139cf23SCaroline Tice 
490e139cf23SCaroline Tice     return NULL;
491e139cf23SCaroline Tice }
492e139cf23SCaroline Tice 
493e139cf23SCaroline Tice CommandObject::ArgumentTableEntry *
494e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type)
495e139cf23SCaroline Tice {
496e139cf23SCaroline Tice     const ArgumentTableEntry *table = CommandObject::GetArgumentTable();
497e139cf23SCaroline Tice 
498e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
499e139cf23SCaroline Tice         if (table[i].arg_type == arg_type)
500e139cf23SCaroline Tice             return (ArgumentTableEntry *) &(table[i]);
501e139cf23SCaroline Tice 
502e139cf23SCaroline Tice     return NULL;
503e139cf23SCaroline Tice }
504e139cf23SCaroline Tice 
505e139cf23SCaroline Tice void
506e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter)
507e139cf23SCaroline Tice {
508e139cf23SCaroline Tice     const ArgumentTableEntry* table = CommandObject::GetArgumentTable();
509e139cf23SCaroline Tice     ArgumentTableEntry *entry = (ArgumentTableEntry *) &(table[arg_type]);
510e139cf23SCaroline Tice 
511e139cf23SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
512e139cf23SCaroline Tice 
513e139cf23SCaroline Tice     if (entry->arg_type != arg_type)
514e139cf23SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
515e139cf23SCaroline Tice 
516e139cf23SCaroline Tice     if (!entry)
517e139cf23SCaroline Tice         return;
518e139cf23SCaroline Tice 
519e139cf23SCaroline Tice     StreamString name_str;
520e139cf23SCaroline Tice     name_str.Printf ("<%s>", entry->arg_name);
521e139cf23SCaroline Tice 
522fc7a7f3bSEnrico Granata     if (entry->help_function)
52382a7d983SEnrico Granata     {
524fc7a7f3bSEnrico Granata         const char* help_text = entry->help_function();
52582a7d983SEnrico Granata         if (!entry->help_function.self_formatting)
52682a7d983SEnrico Granata         {
52782a7d983SEnrico Granata             interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text,
528e139cf23SCaroline Tice                                                  name_str.GetSize());
52982a7d983SEnrico Granata         }
53082a7d983SEnrico Granata         else
53182a7d983SEnrico Granata         {
53282a7d983SEnrico Granata             interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text,
53382a7d983SEnrico Granata                                        name_str.GetSize());
53482a7d983SEnrico Granata         }
53582a7d983SEnrico Granata     }
536e139cf23SCaroline Tice     else
537e139cf23SCaroline Tice         interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize());
538e139cf23SCaroline Tice }
539e139cf23SCaroline Tice 
540e139cf23SCaroline Tice const char *
541e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type)
542e139cf23SCaroline Tice {
543deaab222SCaroline Tice     ArgumentTableEntry *entry = (ArgumentTableEntry *) &(CommandObject::GetArgumentTable()[arg_type]);
544deaab222SCaroline Tice 
545deaab222SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
546deaab222SCaroline Tice 
547deaab222SCaroline Tice     if (entry->arg_type != arg_type)
548deaab222SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
549deaab222SCaroline Tice 
550e6acf355SJohnny Chen     if (entry)
551deaab222SCaroline Tice         return entry->arg_name;
552e6acf355SJohnny Chen 
553e6acf355SJohnny Chen     StreamString str;
554e6acf355SJohnny Chen     str << "Arg name for type (" << arg_type << ") not in arg table!";
555e6acf355SJohnny Chen     return str.GetData();
556e139cf23SCaroline Tice }
557e139cf23SCaroline Tice 
558405fe67fSCaroline Tice bool
559e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type)
560405fe67fSCaroline Tice {
561405fe67fSCaroline Tice     if ((arg_repeat_type == eArgRepeatPairPlain)
562405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairOptional)
563405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairPlus)
564405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairStar)
565405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRange)
566405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRangeOptional))
567405fe67fSCaroline Tice         return true;
568405fe67fSCaroline Tice 
569405fe67fSCaroline Tice     return false;
570405fe67fSCaroline Tice }
571405fe67fSCaroline Tice 
57234ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry
57334ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry)
57434ddc8dbSJohnny Chen {
57534ddc8dbSJohnny Chen     CommandObject::CommandArgumentEntry ret_val;
57634ddc8dbSJohnny Chen     for (unsigned i = 0; i < cmd_arg_entry.size(); ++i)
57734ddc8dbSJohnny Chen         if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association)
57834ddc8dbSJohnny Chen             ret_val.push_back(cmd_arg_entry[i]);
57934ddc8dbSJohnny Chen     return ret_val;
58034ddc8dbSJohnny Chen }
58134ddc8dbSJohnny Chen 
58234ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take
58334ddc8dbSJohnny Chen // all the argument data into account.  On rare cases where some argument sticks
58434ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args.
585e139cf23SCaroline Tice void
58634ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask)
587e139cf23SCaroline Tice {
588e139cf23SCaroline Tice     int num_args = m_arguments.size();
589e139cf23SCaroline Tice     for (int i = 0; i < num_args; ++i)
590e139cf23SCaroline Tice     {
591e139cf23SCaroline Tice         if (i > 0)
592e139cf23SCaroline Tice             str.Printf (" ");
59334ddc8dbSJohnny Chen         CommandArgumentEntry arg_entry =
59434ddc8dbSJohnny Chen             opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i]
59534ddc8dbSJohnny Chen                                              : OptSetFiltered(opt_set_mask, m_arguments[i]);
596e139cf23SCaroline Tice         int num_alternatives = arg_entry.size();
597405fe67fSCaroline Tice 
598405fe67fSCaroline Tice         if ((num_alternatives == 2)
599405fe67fSCaroline Tice             && IsPairType (arg_entry[0].arg_repetition))
600405fe67fSCaroline Tice         {
601405fe67fSCaroline Tice             const char *first_name = GetArgumentName (arg_entry[0].arg_type);
602405fe67fSCaroline Tice             const char *second_name = GetArgumentName (arg_entry[1].arg_type);
603405fe67fSCaroline Tice             switch (arg_entry[0].arg_repetition)
604405fe67fSCaroline Tice             {
605405fe67fSCaroline Tice                 case eArgRepeatPairPlain:
606405fe67fSCaroline Tice                     str.Printf ("<%s> <%s>", first_name, second_name);
607405fe67fSCaroline Tice                     break;
608405fe67fSCaroline Tice                 case eArgRepeatPairOptional:
609405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s>]", first_name, second_name);
610405fe67fSCaroline Tice                     break;
611405fe67fSCaroline Tice                 case eArgRepeatPairPlus:
612405fe67fSCaroline Tice                     str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name);
613405fe67fSCaroline Tice                     break;
614405fe67fSCaroline Tice                 case eArgRepeatPairStar:
615405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name);
616405fe67fSCaroline Tice                     break;
617405fe67fSCaroline Tice                 case eArgRepeatPairRange:
618405fe67fSCaroline Tice                     str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name);
619405fe67fSCaroline Tice                     break;
620405fe67fSCaroline Tice                 case eArgRepeatPairRangeOptional:
621405fe67fSCaroline Tice                     str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name);
622405fe67fSCaroline Tice                     break;
623ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
624ca1176aaSCaroline Tice                 // missing case statement(s).
625ca1176aaSCaroline Tice                 case eArgRepeatPlain:
626ca1176aaSCaroline Tice                 case eArgRepeatOptional:
627ca1176aaSCaroline Tice                 case eArgRepeatPlus:
628ca1176aaSCaroline Tice                 case eArgRepeatStar:
629ca1176aaSCaroline Tice                 case eArgRepeatRange:
630ca1176aaSCaroline Tice                     // These should not be reached, as they should fail the IsPairType test above.
631ca1176aaSCaroline Tice                     break;
632405fe67fSCaroline Tice             }
633405fe67fSCaroline Tice         }
634405fe67fSCaroline Tice         else
635405fe67fSCaroline Tice         {
636e139cf23SCaroline Tice             StreamString names;
637e139cf23SCaroline Tice             for (int j = 0; j < num_alternatives; ++j)
638e139cf23SCaroline Tice             {
639e139cf23SCaroline Tice                 if (j > 0)
640e139cf23SCaroline Tice                     names.Printf (" | ");
641e139cf23SCaroline Tice                 names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type));
642e139cf23SCaroline Tice             }
643e139cf23SCaroline Tice             switch (arg_entry[0].arg_repetition)
644e139cf23SCaroline Tice             {
645e139cf23SCaroline Tice                 case eArgRepeatPlain:
646e139cf23SCaroline Tice                     str.Printf ("<%s>", names.GetData());
647e139cf23SCaroline Tice                     break;
648e139cf23SCaroline Tice                 case eArgRepeatPlus:
649e139cf23SCaroline Tice                     str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData());
650e139cf23SCaroline Tice                     break;
651e139cf23SCaroline Tice                 case eArgRepeatStar:
652e139cf23SCaroline Tice                     str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData());
653e139cf23SCaroline Tice                     break;
654e139cf23SCaroline Tice                 case eArgRepeatOptional:
655e139cf23SCaroline Tice                     str.Printf ("[<%s>]", names.GetData());
656e139cf23SCaroline Tice                     break;
657405fe67fSCaroline Tice                 case eArgRepeatRange:
658fd54b368SJason Molenda                     str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData());
659ca1176aaSCaroline Tice                     break;
660ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
661ca1176aaSCaroline Tice                 // missing case statement(s).
662ca1176aaSCaroline Tice                 case eArgRepeatPairPlain:
663ca1176aaSCaroline Tice                 case eArgRepeatPairOptional:
664ca1176aaSCaroline Tice                 case eArgRepeatPairPlus:
665ca1176aaSCaroline Tice                 case eArgRepeatPairStar:
666ca1176aaSCaroline Tice                 case eArgRepeatPairRange:
667ca1176aaSCaroline Tice                 case eArgRepeatPairRangeOptional:
668ca1176aaSCaroline Tice                     // These should not be hit, as they should pass the IsPairType test above, and control should
669ca1176aaSCaroline Tice                     // have gone into the other branch of the if statement.
670ca1176aaSCaroline Tice                     break;
671405fe67fSCaroline Tice             }
672e139cf23SCaroline Tice         }
673e139cf23SCaroline Tice     }
674e139cf23SCaroline Tice }
675e139cf23SCaroline Tice 
6760c16aa6dSStephen Wilson CommandArgumentType
677e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name)
678e139cf23SCaroline Tice {
679e139cf23SCaroline Tice     CommandArgumentType return_type = eArgTypeLastArg;
680e139cf23SCaroline Tice 
681e139cf23SCaroline Tice     std::string arg_name_str (arg_name);
682e139cf23SCaroline Tice     size_t len = arg_name_str.length();
683e139cf23SCaroline Tice     if (arg_name[0] == '<'
684e139cf23SCaroline Tice         && arg_name[len-1] == '>')
685e139cf23SCaroline Tice         arg_name_str = arg_name_str.substr (1, len-2);
686e139cf23SCaroline Tice 
687331eff39SJohnny Chen     const ArgumentTableEntry *table = GetArgumentTable();
688e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
689331eff39SJohnny Chen         if (arg_name_str.compare (table[i].arg_name) == 0)
690e139cf23SCaroline Tice             return_type = g_arguments_data[i].arg_type;
691e139cf23SCaroline Tice 
692e139cf23SCaroline Tice     return return_type;
693e139cf23SCaroline Tice }
694e139cf23SCaroline Tice 
695e139cf23SCaroline Tice static const char *
696931e674aSJim Ingham RegisterNameHelpTextCallback ()
697931e674aSJim Ingham {
698931e674aSJim Ingham     return "Register names can be specified using the architecture specific names.  "
69984c7bd74SJim Ingham     "They can also be specified using generic names.  Not all generic entities have "
70084c7bd74SJim Ingham     "registers backing them on all architectures.  When they don't the generic name "
70184c7bd74SJim Ingham     "will return an error.\n"
702931e674aSJim Ingham     "The generic names defined in lldb are:\n"
703931e674aSJim Ingham     "\n"
704931e674aSJim Ingham     "pc       - program counter register\n"
705931e674aSJim Ingham     "ra       - return address register\n"
706931e674aSJim Ingham     "fp       - frame pointer register\n"
707931e674aSJim Ingham     "sp       - stack pointer register\n"
70884c7bd74SJim Ingham     "flags    - the flags register\n"
709931e674aSJim Ingham     "arg{1-6} - integer argument passing registers.\n";
710931e674aSJim Ingham }
711931e674aSJim Ingham 
712931e674aSJim Ingham static const char *
713e139cf23SCaroline Tice BreakpointIDHelpTextCallback ()
714e139cf23SCaroline Tice {
71586edbf41SGreg Clayton     return "Breakpoint ID's consist major and minor numbers;  the major number "
71686edbf41SGreg Clayton     "corresponds to the single entity that was created with a 'breakpoint set' "
71786edbf41SGreg Clayton     "command; the minor numbers correspond to all the locations that were actually "
71886edbf41SGreg Clayton     "found/set based on the major breakpoint.  A full breakpoint ID might look like "
71986edbf41SGreg Clayton     "3.14, meaning the 14th location set for the 3rd breakpoint.  You can specify "
72086edbf41SGreg Clayton     "all the locations of a breakpoint by just indicating the major breakpoint "
72186edbf41SGreg Clayton     "number. A valid breakpoint id consists either of just the major id number, "
72286edbf41SGreg Clayton     "or the major number, a dot, and the location number (e.g. 3 or 3.2 could "
72386edbf41SGreg Clayton     "both be valid breakpoint ids).";
724e139cf23SCaroline Tice }
725e139cf23SCaroline Tice 
726e139cf23SCaroline Tice static const char *
727e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback ()
728e139cf23SCaroline Tice {
72986edbf41SGreg Clayton     return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. "
73086edbf41SGreg Clayton     "This can be done  through several mechanisms.  The easiest way is to just "
73186edbf41SGreg Clayton     "enter a space-separated list of breakpoint ids.  To specify all the "
73286edbf41SGreg Clayton     "breakpoint locations under a major breakpoint, you can use the major "
73386edbf41SGreg Clayton     "breakpoint number followed by '.*', eg. '5.*' means all the locations under "
73486edbf41SGreg Clayton     "breakpoint 5.  You can also indicate a range of breakpoints by using "
73586edbf41SGreg Clayton     "<start-bp-id> - <end-bp-id>.  The start-bp-id and end-bp-id for a range can "
73686edbf41SGreg Clayton     "be any valid breakpoint ids.  It is not legal, however, to specify a range "
73786edbf41SGreg Clayton     "using specific locations that cross major breakpoint numbers.  I.e. 3.2 - 3.7"
73886edbf41SGreg Clayton     " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal.";
73986edbf41SGreg Clayton }
74086edbf41SGreg Clayton 
74186edbf41SGreg Clayton static const char *
74286edbf41SGreg Clayton GDBFormatHelpTextCallback ()
74386edbf41SGreg Clayton {
744f91381e8SGreg Clayton     return "A GDB format consists of a repeat count, a format letter and a size letter. "
745f91381e8SGreg Clayton     "The repeat count is optional and defaults to 1. The format letter is optional "
746f91381e8SGreg Clayton     "and defaults to the previous format that was used. The size letter is optional "
747f91381e8SGreg Clayton     "and defaults to the previous size that was used.\n"
748f91381e8SGreg Clayton     "\n"
749f91381e8SGreg Clayton     "Format letters include:\n"
750f91381e8SGreg Clayton     "o - octal\n"
751f91381e8SGreg Clayton     "x - hexadecimal\n"
752f91381e8SGreg Clayton     "d - decimal\n"
753f91381e8SGreg Clayton     "u - unsigned decimal\n"
754f91381e8SGreg Clayton     "t - binary\n"
755f91381e8SGreg Clayton     "f - float\n"
756f91381e8SGreg Clayton     "a - address\n"
757f91381e8SGreg Clayton     "i - instruction\n"
758f91381e8SGreg Clayton     "c - char\n"
759f91381e8SGreg Clayton     "s - string\n"
760f91381e8SGreg Clayton     "T - OSType\n"
761f91381e8SGreg Clayton     "A - float as hex\n"
762f91381e8SGreg Clayton     "\n"
763f91381e8SGreg Clayton     "Size letters include:\n"
764f91381e8SGreg Clayton     "b - 1 byte  (byte)\n"
765f91381e8SGreg Clayton     "h - 2 bytes (halfword)\n"
766f91381e8SGreg Clayton     "w - 4 bytes (word)\n"
767f91381e8SGreg Clayton     "g - 8 bytes (giant)\n"
768f91381e8SGreg Clayton     "\n"
769f91381e8SGreg Clayton     "Example formats:\n"
770f91381e8SGreg Clayton     "32xb - show 32 1 byte hexadecimal integer values\n"
771f91381e8SGreg Clayton     "16xh - show 16 2 byte hexadecimal integer values\n"
772f91381e8SGreg Clayton     "64   - show 64 2 byte hexadecimal integer values (format and size from the last format)\n"
773f91381e8SGreg Clayton     "dw   - show 1 4 byte decimal integer value\n"
774f91381e8SGreg Clayton     ;
775e139cf23SCaroline Tice }
776e139cf23SCaroline Tice 
7770a3958e0SEnrico Granata static const char *
7780a3958e0SEnrico Granata FormatHelpTextCallback ()
7790a3958e0SEnrico Granata {
78082a7d983SEnrico Granata 
78182a7d983SEnrico Granata     static char* help_text_ptr = NULL;
78282a7d983SEnrico Granata 
78382a7d983SEnrico Granata     if (help_text_ptr)
78482a7d983SEnrico Granata         return help_text_ptr;
78582a7d983SEnrico Granata 
7860a3958e0SEnrico Granata     StreamString sstr;
7870a3958e0SEnrico Granata     sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n";
7880a3958e0SEnrico Granata     for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1))
7890a3958e0SEnrico Granata     {
79082a7d983SEnrico Granata         if (f != eFormatDefault)
79182a7d983SEnrico Granata             sstr.PutChar('\n');
79282a7d983SEnrico Granata 
7930a3958e0SEnrico Granata         char format_char = FormatManager::GetFormatAsFormatChar(f);
7940a3958e0SEnrico Granata         if (format_char)
7950a3958e0SEnrico Granata             sstr.Printf("'%c' or ", format_char);
7960a3958e0SEnrico Granata 
79782a7d983SEnrico Granata         sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f));
7980a3958e0SEnrico Granata     }
7990a3958e0SEnrico Granata 
8000a3958e0SEnrico Granata     sstr.Flush();
8010a3958e0SEnrico Granata 
8020a3958e0SEnrico Granata     std::string data = sstr.GetString();
8030a3958e0SEnrico Granata 
80482a7d983SEnrico Granata     help_text_ptr = new char[data.length()+1];
8050a3958e0SEnrico Granata 
80682a7d983SEnrico Granata     data.copy(help_text_ptr, data.length());
8070a3958e0SEnrico Granata 
80882a7d983SEnrico Granata     return help_text_ptr;
8090a3958e0SEnrico Granata }
8100a3958e0SEnrico Granata 
8110a3958e0SEnrico Granata static const char *
812d9477397SSean Callanan LanguageTypeHelpTextCallback ()
813d9477397SSean Callanan {
814d9477397SSean Callanan     static char* help_text_ptr = NULL;
815d9477397SSean Callanan 
816d9477397SSean Callanan     if (help_text_ptr)
817d9477397SSean Callanan         return help_text_ptr;
818d9477397SSean Callanan 
819d9477397SSean Callanan     StreamString sstr;
820d9477397SSean Callanan     sstr << "One of the following languages:\n";
821d9477397SSean Callanan 
82248947c7bSDaniel Malea     for (unsigned int l = eLanguageTypeUnknown; l < eNumLanguageTypes; ++l)
823d9477397SSean Callanan     {
82448947c7bSDaniel Malea         sstr << "  " << LanguageRuntime::GetNameForLanguageType(static_cast<LanguageType>(l)) << "\n";
825d9477397SSean Callanan     }
826d9477397SSean Callanan 
827d9477397SSean Callanan     sstr.Flush();
828d9477397SSean Callanan 
829d9477397SSean Callanan     std::string data = sstr.GetString();
830d9477397SSean Callanan 
831d9477397SSean Callanan     help_text_ptr = new char[data.length()+1];
832d9477397SSean Callanan 
833d9477397SSean Callanan     data.copy(help_text_ptr, data.length());
834d9477397SSean Callanan 
835d9477397SSean Callanan     return help_text_ptr;
836d9477397SSean Callanan }
837d9477397SSean Callanan 
838d9477397SSean Callanan static const char *
83982a7d983SEnrico Granata SummaryStringHelpTextCallback()
8400a3958e0SEnrico Granata {
84182a7d983SEnrico Granata     return
84282a7d983SEnrico Granata         "A summary string is a way to extract information from variables in order to present them using a summary.\n"
84382a7d983SEnrico Granata         "Summary strings contain static text, variables, scopes and control sequences:\n"
84482a7d983SEnrico Granata         "  - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n"
84582a7d983SEnrico Granata         "  - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n"
84682a7d983SEnrico 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"
84782a7d983SEnrico Granata         "  - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n"
84882a7d983SEnrico 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"
84982a7d983SEnrico 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"
85082a7d983SEnrico 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"
85182a7d983SEnrico 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"
8529128ee2fSEnrico 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."
8539128ee2fSEnrico 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"
85482a7d983SEnrico 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."
85582a7d983SEnrico 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"
85682a7d983SEnrico Granata         " path refers to:\n"
85782a7d983SEnrico 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"
85882a7d983SEnrico Granata         " and displayed as an individual variable\n"
85982a7d983SEnrico 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"
86082a7d983SEnrico 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"
8619128ee2fSEnrico 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"
8629128ee2fSEnrico 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"
8639128ee2fSEnrico Granata         " special symbols only allowed as part of a variable:\n"
8649128ee2fSEnrico Granata         "    %V: show the value of the object by default\n"
8659128ee2fSEnrico Granata         "    %S: show the summary of the object by default\n"
8669128ee2fSEnrico Granata         "    %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n"
8679128ee2fSEnrico Granata         "    %L: show the location of the object (memory address or a register name)\n"
8689128ee2fSEnrico Granata         "    %#: show the number of children of the object\n"
8699128ee2fSEnrico Granata         "    %T: show the type of the object\n"
8709128ee2fSEnrico 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"
8719128ee2fSEnrico 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"
8729128ee2fSEnrico Granata         " count the number of actual elements stored in an std::list:\n"
8739128ee2fSEnrico Granata         "type summary add -s \"${svar%#}\" -x \"std::list<\"";
8749128ee2fSEnrico Granata }
8759128ee2fSEnrico Granata 
8769128ee2fSEnrico Granata static const char *
8779128ee2fSEnrico Granata ExprPathHelpTextCallback()
8789128ee2fSEnrico Granata {
8799128ee2fSEnrico Granata     return
8809128ee2fSEnrico 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"
8819128ee2fSEnrico Granata     "For instance, given a class:\n"
8829128ee2fSEnrico Granata     "  class foo {\n"
8839128ee2fSEnrico Granata     "      int a;\n"
8849128ee2fSEnrico Granata     "      int b; .\n"
8859128ee2fSEnrico Granata     "      foo* next;\n"
8869128ee2fSEnrico Granata     "  };\n"
8879128ee2fSEnrico Granata     "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n"
8889128ee2fSEnrico 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"
8899128ee2fSEnrico 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"
8909128ee2fSEnrico Granata     "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n"
8919128ee2fSEnrico 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"
8929128ee2fSEnrico 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"
8939128ee2fSEnrico 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"
8949128ee2fSEnrico 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"
8959128ee2fSEnrico Granata     " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory).";
8960a3958e0SEnrico Granata }
8970a3958e0SEnrico Granata 
898184d7a72SJohnny Chen void
8999b62d1d5SEnrico Granata CommandObject::GenerateHelpText (CommandReturnObject &result)
9009b62d1d5SEnrico Granata {
9019b62d1d5SEnrico Granata     GenerateHelpText(result.GetOutputStream());
9029b62d1d5SEnrico Granata 
9039b62d1d5SEnrico Granata     result.SetStatus (eReturnStatusSuccessFinishNoResult);
9049b62d1d5SEnrico Granata }
9059b62d1d5SEnrico Granata 
9069b62d1d5SEnrico Granata void
9079b62d1d5SEnrico Granata CommandObject::GenerateHelpText (Stream &output_strm)
9089b62d1d5SEnrico Granata {
9099b62d1d5SEnrico Granata     CommandInterpreter& interpreter = GetCommandInterpreter();
9109b62d1d5SEnrico Granata     if (GetOptions() != NULL)
9119b62d1d5SEnrico Granata     {
9129b62d1d5SEnrico Granata         if (WantsRawCommandString())
9139b62d1d5SEnrico Granata         {
9149b62d1d5SEnrico Granata             std::string help_text (GetHelp());
9159b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
9169b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
9179b62d1d5SEnrico Granata         }
9189b62d1d5SEnrico Granata         else
9199b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
9209b62d1d5SEnrico Granata         output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
9219b62d1d5SEnrico Granata         GetOptions()->GenerateOptionUsage (output_strm, this);
9229b62d1d5SEnrico Granata         const char *long_help = GetHelpLong();
9239b62d1d5SEnrico Granata         if ((long_help != NULL)
9249b62d1d5SEnrico Granata             && (strlen (long_help) > 0))
9259b62d1d5SEnrico Granata             output_strm.Printf ("\n%s", long_help);
9269b62d1d5SEnrico Granata         if (WantsRawCommandString() && !WantsCompletion())
9279b62d1d5SEnrico Granata         {
9289b62d1d5SEnrico Granata             // Emit the message about using ' -- ' between the end of the command options and the raw input
9299b62d1d5SEnrico Granata             // conditionally, i.e., only if the command object does not want completion.
9309b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "",
9319b62d1d5SEnrico Granata                                                  "\nIMPORTANT NOTE:  Because this command takes 'raw' input, if you use any command options"
9329b62d1d5SEnrico Granata                                                  " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1);
9339b62d1d5SEnrico Granata         }
9349b62d1d5SEnrico Granata         else if (GetNumArgumentEntries() > 0
9359b62d1d5SEnrico Granata                  && GetOptions()
9369b62d1d5SEnrico Granata                  && GetOptions()->NumCommandOptions() > 0)
9379b62d1d5SEnrico Granata         {
9389b62d1d5SEnrico Granata             // Also emit a warning about using "--" in case you are using a command that takes options and arguments.
9399b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "",
9409b62d1d5SEnrico Granata                                                  "\nThis command takes options and free-form arguments.  If your arguments resemble"
9419b62d1d5SEnrico Granata                                                  " option specifiers (i.e., they start with a - or --), you must use ' -- ' between"
9429b62d1d5SEnrico Granata                                                  " the end of the command options and the beginning of the arguments.", 1);
9439b62d1d5SEnrico Granata         }
9449b62d1d5SEnrico Granata     }
9459b62d1d5SEnrico Granata     else if (IsMultiwordObject())
9469b62d1d5SEnrico Granata     {
9479b62d1d5SEnrico Granata         if (WantsRawCommandString())
9489b62d1d5SEnrico Granata         {
9499b62d1d5SEnrico Granata             std::string help_text (GetHelp());
9509b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
9519b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
9529b62d1d5SEnrico Granata         }
9539b62d1d5SEnrico Granata         else
9549b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
9559b62d1d5SEnrico Granata         GenerateHelpText (output_strm);
9569b62d1d5SEnrico Granata     }
9579b62d1d5SEnrico Granata     else
9589b62d1d5SEnrico Granata     {
9599b62d1d5SEnrico Granata         const char *long_help = GetHelpLong();
9609b62d1d5SEnrico Granata         if ((long_help != NULL)
9619b62d1d5SEnrico Granata             && (strlen (long_help) > 0))
9629b62d1d5SEnrico Granata             output_strm.Printf ("%s", long_help);
9639b62d1d5SEnrico Granata         else if (WantsRawCommandString())
9649b62d1d5SEnrico Granata         {
9659b62d1d5SEnrico Granata             std::string help_text (GetHelp());
9669b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
9679b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
9689b62d1d5SEnrico Granata         }
9699b62d1d5SEnrico Granata         else
9709b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
9719b62d1d5SEnrico Granata         output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
9729b62d1d5SEnrico Granata     }
9739b62d1d5SEnrico Granata }
9749b62d1d5SEnrico Granata 
9759b62d1d5SEnrico Granata void
976de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange)
977184d7a72SJohnny Chen {
978184d7a72SJohnny Chen     CommandArgumentData id_arg;
979184d7a72SJohnny Chen     CommandArgumentData id_range_arg;
980184d7a72SJohnny Chen 
981184d7a72SJohnny Chen     // Create the first variant for the first (and only) argument for this command.
982de753464SJohnny Chen     id_arg.arg_type = ID;
983184d7a72SJohnny Chen     id_arg.arg_repetition = eArgRepeatOptional;
984184d7a72SJohnny Chen 
985184d7a72SJohnny Chen     // Create the second variant for the first (and only) argument for this command.
986de753464SJohnny Chen     id_range_arg.arg_type = IDRange;
987184d7a72SJohnny Chen     id_range_arg.arg_repetition = eArgRepeatOptional;
988184d7a72SJohnny Chen 
989a3234732SJohnny Chen     // The first (and only) argument for this command could be either an id or an id_range.
990184d7a72SJohnny Chen     // Push both variants into the entry for the first argument for this command.
991184d7a72SJohnny Chen     arg.push_back(id_arg);
992184d7a72SJohnny Chen     arg.push_back(id_range_arg);
993184d7a72SJohnny Chen }
994184d7a72SJohnny Chen 
9959d0402b1SGreg Clayton const char *
9969d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
9979d0402b1SGreg Clayton {
9989d0402b1SGreg Clayton     if (arg_type >=0 && arg_type < eArgTypeLastArg)
9999d0402b1SGreg Clayton         return g_arguments_data[arg_type].arg_name;
10009d0402b1SGreg Clayton     return NULL;
10019d0402b1SGreg Clayton 
10029d0402b1SGreg Clayton }
10039d0402b1SGreg Clayton 
10049d0402b1SGreg Clayton const char *
10059d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
10069d0402b1SGreg Clayton {
10079d0402b1SGreg Clayton     if (arg_type >=0 && arg_type < eArgTypeLastArg)
10089d0402b1SGreg Clayton         return g_arguments_data[arg_type].help_text;
10099d0402b1SGreg Clayton     return NULL;
10109d0402b1SGreg Clayton }
10119d0402b1SGreg Clayton 
10125a988416SJim Ingham bool
10135a988416SJim Ingham CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result)
10145a988416SJim Ingham {
10155a988416SJim Ingham     CommandOverrideCallback command_callback = GetOverrideCallback();
10165a988416SJim Ingham     bool handled = false;
10175a988416SJim Ingham     Args cmd_args (args_string);
10185a988416SJim Ingham     if (command_callback)
10195a988416SJim Ingham     {
10205a988416SJim Ingham         Args full_args (GetCommandName ());
10215a988416SJim Ingham         full_args.AppendArguments(cmd_args);
10225a988416SJim Ingham         handled = command_callback (GetOverrideCallbackBaton(), full_args.GetConstArgumentVector());
10235a988416SJim Ingham     }
10245a988416SJim Ingham     if (!handled)
10255a988416SJim Ingham     {
10265a988416SJim Ingham         for (size_t i = 0; i < cmd_args.GetArgumentCount();  ++i)
10275a988416SJim Ingham         {
10285a988416SJim Ingham             const char *tmp_str = cmd_args.GetArgumentAtIndex (i);
10295a988416SJim Ingham             if (tmp_str[0] == '`')  // back-quote
10305a988416SJim Ingham                 cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
10315a988416SJim Ingham         }
10325a988416SJim Ingham 
1033f9fc609fSGreg Clayton         if (CheckRequirements(result))
1034f9fc609fSGreg Clayton         {
1035f9fc609fSGreg Clayton             if (ParseOptions (cmd_args, result))
1036f9fc609fSGreg Clayton             {
10375a988416SJim Ingham                 // Call the command-specific version of 'Execute', passing it the already processed arguments.
10385a988416SJim Ingham                 handled = DoExecute (cmd_args, result);
10395a988416SJim Ingham             }
1040f9fc609fSGreg Clayton         }
1041f9fc609fSGreg Clayton 
1042f9fc609fSGreg Clayton         Cleanup();
1043f9fc609fSGreg Clayton     }
10445a988416SJim Ingham     return handled;
10455a988416SJim Ingham }
10465a988416SJim Ingham 
10475a988416SJim Ingham bool
10485a988416SJim Ingham CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result)
10495a988416SJim Ingham {
10505a988416SJim Ingham     CommandOverrideCallback command_callback = GetOverrideCallback();
10515a988416SJim Ingham     bool handled = false;
10525a988416SJim Ingham     if (command_callback)
10535a988416SJim Ingham     {
10545a988416SJim Ingham         std::string full_command (GetCommandName ());
10555a988416SJim Ingham         full_command += ' ';
10565a988416SJim Ingham         full_command += args_string;
10575a988416SJim Ingham         const char *argv[2] = { NULL, NULL };
10585a988416SJim Ingham         argv[0] = full_command.c_str();
10595a988416SJim Ingham         handled = command_callback (GetOverrideCallbackBaton(), argv);
10605a988416SJim Ingham     }
10615a988416SJim Ingham     if (!handled)
10625a988416SJim Ingham     {
1063f9fc609fSGreg Clayton         if (CheckRequirements(result))
10645a988416SJim Ingham             handled = DoExecute (args_string, result);
1065f9fc609fSGreg Clayton 
1066f9fc609fSGreg Clayton         Cleanup();
10675a988416SJim Ingham     }
10685a988416SJim Ingham     return handled;
10695a988416SJim Ingham }
10705a988416SJim Ingham 
1071ca7835c6SJohnny Chen static
1072ca7835c6SJohnny Chen const char *arch_helper()
1073ca7835c6SJohnny Chen {
1074d70b14eaSGreg Clayton     static StreamString g_archs_help;
1075797a1b37SJohnny Chen     if (g_archs_help.Empty())
1076d70b14eaSGreg Clayton     {
1077ca7835c6SJohnny Chen         StringList archs;
1078ca7835c6SJohnny Chen         ArchSpec::AutoComplete(NULL, archs);
1079d70b14eaSGreg Clayton         g_archs_help.Printf("These are the supported architecture names:\n");
1080797a1b37SJohnny Chen         archs.Join("\n", g_archs_help);
1081d70b14eaSGreg Clayton     }
1082d70b14eaSGreg Clayton     return g_archs_help.GetData();
1083ca7835c6SJohnny Chen }
1084ca7835c6SJohnny Chen 
1085e139cf23SCaroline Tice CommandObject::ArgumentTableEntry
1086e139cf23SCaroline Tice CommandObject::g_arguments_data[] =
1087e139cf23SCaroline Tice {
10887f941d95SEnrico Granata     { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { NULL, false }, "A valid address in the target program's execution space." },
108959de94bdSEnrico Granata     { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { NULL, false }, "An expression that resolves to an address." },
10907f941d95SEnrico Granata     { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of an abbreviation (alias) for a debugger command." },
10917f941d95SEnrico 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.)" },
1092ca7835c6SJohnny Chen     { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." },
10937f941d95SEnrico Granata     { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { NULL, false }, "A Boolean value: 'true' or 'false'" },
10947f941d95SEnrico Granata     { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, NULL },
10957f941d95SEnrico Granata     { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, NULL },
10967f941d95SEnrico Granata     { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { NULL, false }, "Number of bytes to use." },
10977f941d95SEnrico Granata     { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { NULL, false }, "Then name of a class from the debug information in the program." },
10987f941d95SEnrico Granata     { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { NULL, false }, "A debugger command (may be multiple words), without any options or arguments." },
10997f941d95SEnrico Granata     { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { NULL, false }, "An unsigned integer." },
11003154255fSSean Callanan     { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { NULL, false }, "A directory name." },
11010f063ba6SJim Ingham     { eArgTypeDisassemblyFlavor, "disassembly-flavor", CommandCompletions::eNoCompletion, { NULL, false }, "A disassembly flavor recognized by your disassembly plugin.  Currently the only valid options are \"att\" and \"intel\" for Intel targets" },
11027f941d95SEnrico Granata     { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11037f941d95SEnrico Granata     { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11049128ee2fSEnrico Granata     { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, NULL },
11057f941d95SEnrico 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] ]" },
11067f941d95SEnrico Granata     { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { NULL, false }, "The name of a file (can include path)." },
11077f941d95SEnrico Granata     { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, NULL },
11087f941d95SEnrico Granata     { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { NULL, false }, "Index into a thread's list of frames." },
11097f941d95SEnrico Granata     { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11107f941d95SEnrico Granata     { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a function." },
1111cd8b7cd0SSean Callanan     { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a function or symbol." },
111286edbf41SGreg Clayton     { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, NULL },
11137f941d95SEnrico Granata     { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { NULL, false }, "An index into a list." },
1114d9477397SSean Callanan     { eArgTypeLanguage, "language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, NULL },
11157f941d95SEnrico Granata     { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { NULL, false }, "Line number in a source file." },
11167f941d95SEnrico 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." },
11177f941d95SEnrico 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)." },
11187f941d95SEnrico Granata     { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { NULL, false }, "A C++ method name." },
11197f941d95SEnrico Granata     { eArgTypeName, "name", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11207f941d95SEnrico Granata     { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11217f941d95SEnrico Granata     { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { NULL, false }, "The number of lines to use." },
11227f941d95SEnrico Granata     { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { NULL, false }, "The number of items per line to display." },
11237f941d95SEnrico Granata     { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11247f941d95SEnrico Granata     { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11257f941d95SEnrico Granata     { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { NULL, false }, "A command that is entered as a single line of text." },
11267f941d95SEnrico Granata     { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { NULL, false }, "The process ID number." },
11277f941d95SEnrico Granata     { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11287f941d95SEnrico Granata     { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of the process." },
11299128ee2fSEnrico Granata     { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a Python class." },
11309128ee2fSEnrico Granata     { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a Python function." },
11319128ee2fSEnrico Granata     { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { NULL, false }, "Source code written in Python." },
11327f941d95SEnrico Granata     { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of the thread queue." },
1133931e674aSJim Ingham     { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, NULL },
11347f941d95SEnrico Granata     { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { NULL, false }, "A regular expression." },
11357f941d95SEnrico Granata     { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { NULL, false }, "Arguments to be passed to the target program when it starts executing." },
11367f941d95SEnrico Granata     { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11370a305db7SEnrico Granata     { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { NULL, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." },
11387f941d95SEnrico Granata     { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { NULL, false }, "The scripting language to be used for script-based commands.  Currently only Python is valid." },
11397f941d95SEnrico Granata     { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { NULL, false }, "The word for which you wish to search for information about." },
11407f941d95SEnrico Granata     { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { NULL, false }, "An Objective-C selector name." },
11417f941d95SEnrico 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)." },
11427f941d95SEnrico 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)." },
11437f941d95SEnrico Granata     { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" },
11447f941d95SEnrico 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." },
11457f941d95SEnrico Granata     { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a shared library." },
11467f941d95SEnrico Granata     { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { NULL, false }, "The name of a source file.." },
11477f941d95SEnrico Granata     { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { NULL, false }, "Specify a sort order when dumping lists." },
11487f941d95SEnrico Granata     { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11497f941d95SEnrico Granata     { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, NULL },
11507f941d95SEnrico Granata     { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { NULL, false }, "Any symbol name (function name, variable, argument, etc.)" },
11517f941d95SEnrico Granata     { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { NULL, false }, "Thread ID number." },
11527f941d95SEnrico Granata     { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { NULL, false }, "Index into the process' list of threads." },
11537f941d95SEnrico Granata     { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { NULL, false }, "The thread's name." },
1154331eff39SJohnny Chen     { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { NULL, false }, "An unsigned integer." },
11557f941d95SEnrico Granata     { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { NULL, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." },
11567f941d95SEnrico Granata     { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a variable in your program." },
11577f941d95SEnrico Granata     { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { NULL, false }, "A value could be anything, depending on where and how it is used." },
11587f941d95SEnrico Granata     { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11597f941d95SEnrico Granata     { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { NULL, false }, "No help available for this." },
1160b1d7529eSJohnny 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." },
1161de753464SJohnny Chen     { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { NULL, false }, "Watchpoint IDs are positive integers." },
1162de753464SJohnny Chen     { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { NULL, false }, "For example, '1-3' or '1 to 3'." },
1163887062aeSJohnny Chen     { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { NULL, false }, "Specify the type for a watchpoint." }
1164e139cf23SCaroline Tice };
1165e139cf23SCaroline Tice 
1166e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry*
1167e139cf23SCaroline Tice CommandObject::GetArgumentTable ()
1168e139cf23SCaroline Tice {
11699d0402b1SGreg Clayton     // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration
11709d0402b1SGreg Clayton     assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg);
1171e139cf23SCaroline Tice     return CommandObject::g_arguments_data;
1172e139cf23SCaroline Tice }
1173e139cf23SCaroline Tice 
1174e139cf23SCaroline Tice 
1175