1 //===-- CommandObject.cpp ---------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Interpreter/CommandObject.h"
11 
12 #include <string>
13 #include <sstream>
14 #include <map>
15 
16 #include <stdlib.h>
17 #include <ctype.h>
18 
19 #include "lldb/Core/Address.h"
20 #include "lldb/Core/ArchSpec.h"
21 #include "lldb/Interpreter/Options.h"
22 
23 // These are for the Sourcename completers.
24 // FIXME: Make a separate file for the completers.
25 #include "lldb/Host/FileSpec.h"
26 #include "lldb/Core/FileSpecList.h"
27 #include "lldb/DataFormatters/FormatManager.h"
28 #include "lldb/Target/Process.h"
29 #include "lldb/Target/Target.h"
30 
31 #include "lldb/Target/Language.h"
32 
33 #include "lldb/Interpreter/CommandInterpreter.h"
34 #include "lldb/Interpreter/CommandReturnObject.h"
35 
36 using namespace lldb;
37 using namespace lldb_private;
38 
39 //-------------------------------------------------------------------------
40 // CommandObject
41 //-------------------------------------------------------------------------
42 
43 CommandObject::CommandObject
44 (
45     CommandInterpreter &interpreter,
46     const char *name,
47     const char *help,
48     const char *syntax,
49     uint32_t flags
50 ) :
51     m_interpreter (interpreter),
52     m_cmd_name (name ? name : ""),
53     m_cmd_help_short (),
54     m_cmd_help_long (),
55     m_cmd_syntax (),
56     m_flags (flags),
57     m_arguments(),
58     m_deprecated_command_override_callback (nullptr),
59     m_command_override_callback (nullptr),
60     m_command_override_baton (nullptr)
61 {
62     if (help && help[0])
63         m_cmd_help_short = help;
64     if (syntax && syntax[0])
65         m_cmd_syntax = syntax;
66 }
67 
68 CommandObject::~CommandObject ()
69 {
70 }
71 
72 const char *
73 CommandObject::GetHelp ()
74 {
75     return m_cmd_help_short.c_str();
76 }
77 
78 const char *
79 CommandObject::GetHelpLong ()
80 {
81     return m_cmd_help_long.c_str();
82 }
83 
84 const char *
85 CommandObject::GetSyntax ()
86 {
87     if (m_cmd_syntax.length() == 0)
88     {
89         StreamString syntax_str;
90         syntax_str.Printf ("%s", GetCommandName());
91         if (GetOptions() != nullptr)
92             syntax_str.Printf (" <cmd-options>");
93         if (m_arguments.size() > 0)
94         {
95             syntax_str.Printf (" ");
96             if (WantsRawCommandString() && GetOptions() && GetOptions()->NumCommandOptions())
97                 syntax_str.Printf("-- ");
98             GetFormattedCommandArguments (syntax_str);
99         }
100         m_cmd_syntax = syntax_str.GetData ();
101     }
102 
103     return m_cmd_syntax.c_str();
104 }
105 
106 const char *
107 CommandObject::GetCommandName ()
108 {
109     return m_cmd_name.c_str();
110 }
111 
112 void
113 CommandObject::SetCommandName (const char *name)
114 {
115     m_cmd_name = name;
116 }
117 
118 void
119 CommandObject::SetHelp (const char *cstr)
120 {
121     m_cmd_help_short = cstr;
122 }
123 
124 void
125 CommandObject::SetHelp (std::string str)
126 {
127     m_cmd_help_short = str;
128 }
129 
130 void
131 CommandObject::SetHelpLong (const char *cstr)
132 {
133     m_cmd_help_long = cstr;
134 }
135 
136 void
137 CommandObject::SetHelpLong (std::string str)
138 {
139     m_cmd_help_long = str;
140 }
141 
142 void
143 CommandObject::SetSyntax (const char *cstr)
144 {
145     m_cmd_syntax = cstr;
146 }
147 
148 Options *
149 CommandObject::GetOptions ()
150 {
151     // By default commands don't have options unless this virtual function
152     // is overridden by base classes.
153     return nullptr;
154 }
155 
156 bool
157 CommandObject::ParseOptions
158 (
159     Args& args,
160     CommandReturnObject &result
161 )
162 {
163     // See if the subclass has options?
164     Options *options = GetOptions();
165     if (options != nullptr)
166     {
167         Error error;
168         options->NotifyOptionParsingStarting();
169 
170         // ParseOptions calls getopt_long_only, which always skips the zero'th item in the array and starts at position 1,
171         // so we need to push a dummy value into position zero.
172         args.Unshift("dummy_string");
173         error = args.ParseOptions (*options);
174 
175         // The "dummy_string" will have already been removed by ParseOptions,
176         // so no need to remove it.
177 
178         if (error.Success())
179             error = options->NotifyOptionParsingFinished();
180 
181         if (error.Success())
182         {
183             if (options->VerifyOptions (result))
184                 return true;
185         }
186         else
187         {
188             const char *error_cstr = error.AsCString();
189             if (error_cstr)
190             {
191                 // We got an error string, lets use that
192                 result.AppendError(error_cstr);
193             }
194             else
195             {
196                 // No error string, output the usage information into result
197                 options->GenerateOptionUsage (result.GetErrorStream(), this);
198             }
199         }
200         result.SetStatus (eReturnStatusFailed);
201         return false;
202     }
203     return true;
204 }
205 
206 
207 
208 bool
209 CommandObject::CheckRequirements (CommandReturnObject &result)
210 {
211 #ifdef LLDB_CONFIGURATION_DEBUG
212     // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx
213     // has shared pointers to the target, process, thread and frame and we don't
214     // want any CommandObject instances to keep any of these objects around
215     // longer than for a single command. Every command should call
216     // CommandObject::Cleanup() after it has completed
217     assert (m_exe_ctx.GetTargetPtr() == NULL);
218     assert (m_exe_ctx.GetProcessPtr() == NULL);
219     assert (m_exe_ctx.GetThreadPtr() == NULL);
220     assert (m_exe_ctx.GetFramePtr() == NULL);
221 #endif
222 
223     // Lock down the interpreter's execution context prior to running the
224     // command so we guarantee the selected target, process, thread and frame
225     // can't go away during the execution
226     m_exe_ctx = m_interpreter.GetExecutionContext();
227 
228     const uint32_t flags = GetFlags().Get();
229     if (flags & (eCommandRequiresTarget   |
230                  eCommandRequiresProcess  |
231                  eCommandRequiresThread   |
232                  eCommandRequiresFrame    |
233                  eCommandTryTargetAPILock ))
234     {
235 
236         if ((flags & eCommandRequiresTarget) && !m_exe_ctx.HasTargetScope())
237         {
238             result.AppendError (GetInvalidTargetDescription());
239             return false;
240         }
241 
242         if ((flags & eCommandRequiresProcess) && !m_exe_ctx.HasProcessScope())
243         {
244             if (!m_exe_ctx.HasTargetScope())
245                 result.AppendError (GetInvalidTargetDescription());
246             else
247                 result.AppendError (GetInvalidProcessDescription());
248             return false;
249         }
250 
251         if ((flags & eCommandRequiresThread) && !m_exe_ctx.HasThreadScope())
252         {
253             if (!m_exe_ctx.HasTargetScope())
254                 result.AppendError (GetInvalidTargetDescription());
255             else if (!m_exe_ctx.HasProcessScope())
256                 result.AppendError (GetInvalidProcessDescription());
257             else
258                 result.AppendError (GetInvalidThreadDescription());
259             return false;
260         }
261 
262         if ((flags & eCommandRequiresFrame) && !m_exe_ctx.HasFrameScope())
263         {
264             if (!m_exe_ctx.HasTargetScope())
265                 result.AppendError (GetInvalidTargetDescription());
266             else if (!m_exe_ctx.HasProcessScope())
267                 result.AppendError (GetInvalidProcessDescription());
268             else if (!m_exe_ctx.HasThreadScope())
269                 result.AppendError (GetInvalidThreadDescription());
270             else
271                 result.AppendError (GetInvalidFrameDescription());
272             return false;
273         }
274 
275         if ((flags & eCommandRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == nullptr))
276         {
277             result.AppendError (GetInvalidRegContextDescription());
278             return false;
279         }
280 
281         if (flags & eCommandTryTargetAPILock)
282         {
283             Target *target = m_exe_ctx.GetTargetPtr();
284             if (target)
285                 m_api_locker.Lock (target->GetAPIMutex());
286         }
287     }
288 
289     if (GetFlags().AnySet (eCommandProcessMustBeLaunched | eCommandProcessMustBePaused))
290     {
291         Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
292         if (process == nullptr)
293         {
294             // A process that is not running is considered paused.
295             if (GetFlags().Test(eCommandProcessMustBeLaunched))
296             {
297                 result.AppendError ("Process must exist.");
298                 result.SetStatus (eReturnStatusFailed);
299                 return false;
300             }
301         }
302         else
303         {
304             StateType state = process->GetState();
305             switch (state)
306             {
307             case eStateInvalid:
308             case eStateSuspended:
309             case eStateCrashed:
310             case eStateStopped:
311                 break;
312 
313             case eStateConnected:
314             case eStateAttaching:
315             case eStateLaunching:
316             case eStateDetached:
317             case eStateExited:
318             case eStateUnloaded:
319                 if (GetFlags().Test(eCommandProcessMustBeLaunched))
320                 {
321                     result.AppendError ("Process must be launched.");
322                     result.SetStatus (eReturnStatusFailed);
323                     return false;
324                 }
325                 break;
326 
327             case eStateRunning:
328             case eStateStepping:
329                 if (GetFlags().Test(eCommandProcessMustBePaused))
330                 {
331                     result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
332                     result.SetStatus (eReturnStatusFailed);
333                     return false;
334                 }
335             }
336         }
337     }
338     return true;
339 }
340 
341 void
342 CommandObject::Cleanup ()
343 {
344     m_exe_ctx.Clear();
345     m_api_locker.Unlock();
346 }
347 
348 int
349 CommandObject::HandleCompletion
350 (
351     Args &input,
352     int &cursor_index,
353     int &cursor_char_position,
354     int match_start_point,
355     int max_return_elements,
356     bool &word_complete,
357     StringList &matches
358 )
359 {
360     // Default implementation of WantsCompletion() is !WantsRawCommandString().
361     // Subclasses who want raw command string but desire, for example,
362     // argument completion should override WantsCompletion() to return true,
363     // instead.
364     if (WantsRawCommandString() && !WantsCompletion())
365     {
366         // FIXME: Abstract telling the completion to insert the completion character.
367         matches.Clear();
368         return -1;
369     }
370     else
371     {
372         // Can we do anything generic with the options?
373         Options *cur_options = GetOptions();
374         CommandReturnObject result;
375         OptionElementVector opt_element_vector;
376 
377         if (cur_options != nullptr)
378         {
379             // Re-insert the dummy command name string which will have been
380             // stripped off:
381             input.Unshift ("dummy-string");
382             cursor_index++;
383 
384 
385             // I stick an element on the end of the input, because if the last element is
386             // option that requires an argument, getopt_long_only will freak out.
387 
388             input.AppendArgument ("<FAKE-VALUE>");
389 
390             input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index);
391 
392             input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1);
393 
394             bool handled_by_options;
395             handled_by_options = cur_options->HandleOptionCompletion (input,
396                                                                       opt_element_vector,
397                                                                       cursor_index,
398                                                                       cursor_char_position,
399                                                                       match_start_point,
400                                                                       max_return_elements,
401                                                                       word_complete,
402                                                                       matches);
403             if (handled_by_options)
404                 return matches.GetSize();
405         }
406 
407         // If we got here, the last word is not an option or an option argument.
408         return HandleArgumentCompletion (input,
409                                          cursor_index,
410                                          cursor_char_position,
411                                          opt_element_vector,
412                                          match_start_point,
413                                          max_return_elements,
414                                          word_complete,
415                                          matches);
416     }
417 }
418 
419 bool
420 CommandObject::HelpTextContainsWord (const char *search_word)
421 {
422     std::string options_usage_help;
423 
424     bool found_word = false;
425 
426     const char *short_help = GetHelp();
427     const char *long_help = GetHelpLong();
428     const char *syntax_help = GetSyntax();
429 
430     if (short_help && strcasestr (short_help, search_word))
431         found_word = true;
432     else if (long_help && strcasestr (long_help, search_word))
433         found_word = true;
434     else if (syntax_help && strcasestr (syntax_help, search_word))
435         found_word = true;
436 
437     if (!found_word
438         && GetOptions() != nullptr)
439     {
440         StreamString usage_help;
441         GetOptions()->GenerateOptionUsage (usage_help, this);
442         if (usage_help.GetSize() > 0)
443         {
444             const char *usage_text = usage_help.GetData();
445             if (strcasestr (usage_text, search_word))
446               found_word = true;
447         }
448     }
449 
450     return found_word;
451 }
452 
453 int
454 CommandObject::GetNumArgumentEntries  ()
455 {
456     return m_arguments.size();
457 }
458 
459 CommandObject::CommandArgumentEntry *
460 CommandObject::GetArgumentEntryAtIndex (int idx)
461 {
462     if (static_cast<size_t>(idx) < m_arguments.size())
463         return &(m_arguments[idx]);
464 
465     return nullptr;
466 }
467 
468 const CommandObject::ArgumentTableEntry *
469 CommandObject::FindArgumentDataByType (CommandArgumentType arg_type)
470 {
471     const ArgumentTableEntry *table = CommandObject::GetArgumentTable();
472 
473     for (int i = 0; i < eArgTypeLastArg; ++i)
474         if (table[i].arg_type == arg_type)
475             return &(table[i]);
476 
477     return nullptr;
478 }
479 
480 void
481 CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter)
482 {
483     const ArgumentTableEntry* table = CommandObject::GetArgumentTable();
484     const ArgumentTableEntry *entry = &(table[arg_type]);
485 
486     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
487 
488     if (entry->arg_type != arg_type)
489         entry = CommandObject::FindArgumentDataByType (arg_type);
490 
491     if (!entry)
492         return;
493 
494     StreamString name_str;
495     name_str.Printf ("<%s>", entry->arg_name);
496 
497     if (entry->help_function)
498     {
499         const char* help_text = entry->help_function();
500         if (!entry->help_function.self_formatting)
501         {
502             interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text,
503                                                  name_str.GetSize());
504         }
505         else
506         {
507             interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text,
508                                        name_str.GetSize());
509         }
510     }
511     else
512         interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize());
513 }
514 
515 const char *
516 CommandObject::GetArgumentName (CommandArgumentType arg_type)
517 {
518     const ArgumentTableEntry *entry = &(CommandObject::GetArgumentTable()[arg_type]);
519 
520     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
521 
522     if (entry->arg_type != arg_type)
523         entry = CommandObject::FindArgumentDataByType (arg_type);
524 
525     if (entry)
526         return entry->arg_name;
527 
528     StreamString str;
529     str << "Arg name for type (" << arg_type << ") not in arg table!";
530     return str.GetData();
531 }
532 
533 bool
534 CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type)
535 {
536     if ((arg_repeat_type == eArgRepeatPairPlain)
537         ||  (arg_repeat_type == eArgRepeatPairOptional)
538         ||  (arg_repeat_type == eArgRepeatPairPlus)
539         ||  (arg_repeat_type == eArgRepeatPairStar)
540         ||  (arg_repeat_type == eArgRepeatPairRange)
541         ||  (arg_repeat_type == eArgRepeatPairRangeOptional))
542         return true;
543 
544     return false;
545 }
546 
547 static CommandObject::CommandArgumentEntry
548 OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry)
549 {
550     CommandObject::CommandArgumentEntry ret_val;
551     for (unsigned i = 0; i < cmd_arg_entry.size(); ++i)
552         if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association)
553             ret_val.push_back(cmd_arg_entry[i]);
554     return ret_val;
555 }
556 
557 // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take
558 // all the argument data into account.  On rare cases where some argument sticks
559 // with certain option sets, this function returns the option set filtered args.
560 void
561 CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask)
562 {
563     int num_args = m_arguments.size();
564     for (int i = 0; i < num_args; ++i)
565     {
566         if (i > 0)
567             str.Printf (" ");
568         CommandArgumentEntry arg_entry =
569             opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i]
570                                              : OptSetFiltered(opt_set_mask, m_arguments[i]);
571         int num_alternatives = arg_entry.size();
572 
573         if ((num_alternatives == 2)
574             && IsPairType (arg_entry[0].arg_repetition))
575         {
576             const char *first_name = GetArgumentName (arg_entry[0].arg_type);
577             const char *second_name = GetArgumentName (arg_entry[1].arg_type);
578             switch (arg_entry[0].arg_repetition)
579             {
580                 case eArgRepeatPairPlain:
581                     str.Printf ("<%s> <%s>", first_name, second_name);
582                     break;
583                 case eArgRepeatPairOptional:
584                     str.Printf ("[<%s> <%s>]", first_name, second_name);
585                     break;
586                 case eArgRepeatPairPlus:
587                     str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name);
588                     break;
589                 case eArgRepeatPairStar:
590                     str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name);
591                     break;
592                 case eArgRepeatPairRange:
593                     str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name);
594                     break;
595                 case eArgRepeatPairRangeOptional:
596                     str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name);
597                     break;
598                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
599                 // missing case statement(s).
600                 case eArgRepeatPlain:
601                 case eArgRepeatOptional:
602                 case eArgRepeatPlus:
603                 case eArgRepeatStar:
604                 case eArgRepeatRange:
605                     // These should not be reached, as they should fail the IsPairType test above.
606                     break;
607             }
608         }
609         else
610         {
611             StreamString names;
612             for (int j = 0; j < num_alternatives; ++j)
613             {
614                 if (j > 0)
615                     names.Printf (" | ");
616                 names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type));
617             }
618             switch (arg_entry[0].arg_repetition)
619             {
620                 case eArgRepeatPlain:
621                     str.Printf ("<%s>", names.GetData());
622                     break;
623                 case eArgRepeatPlus:
624                     str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData());
625                     break;
626                 case eArgRepeatStar:
627                     str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData());
628                     break;
629                 case eArgRepeatOptional:
630                     str.Printf ("[<%s>]", names.GetData());
631                     break;
632                 case eArgRepeatRange:
633                     str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData());
634                     break;
635                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
636                 // missing case statement(s).
637                 case eArgRepeatPairPlain:
638                 case eArgRepeatPairOptional:
639                 case eArgRepeatPairPlus:
640                 case eArgRepeatPairStar:
641                 case eArgRepeatPairRange:
642                 case eArgRepeatPairRangeOptional:
643                     // These should not be hit, as they should pass the IsPairType test above, and control should
644                     // have gone into the other branch of the if statement.
645                     break;
646             }
647         }
648     }
649 }
650 
651 CommandArgumentType
652 CommandObject::LookupArgumentName (const char *arg_name)
653 {
654     CommandArgumentType return_type = eArgTypeLastArg;
655 
656     std::string arg_name_str (arg_name);
657     size_t len = arg_name_str.length();
658     if (arg_name[0] == '<'
659         && arg_name[len-1] == '>')
660         arg_name_str = arg_name_str.substr (1, len-2);
661 
662     const ArgumentTableEntry *table = GetArgumentTable();
663     for (int i = 0; i < eArgTypeLastArg; ++i)
664         if (arg_name_str.compare (table[i].arg_name) == 0)
665             return_type = g_arguments_data[i].arg_type;
666 
667     return return_type;
668 }
669 
670 static const char *
671 RegisterNameHelpTextCallback ()
672 {
673     return "Register names can be specified using the architecture specific names.  "
674     "They can also be specified using generic names.  Not all generic entities have "
675     "registers backing them on all architectures.  When they don't the generic name "
676     "will return an error.\n"
677     "The generic names defined in lldb are:\n"
678     "\n"
679     "pc       - program counter register\n"
680     "ra       - return address register\n"
681     "fp       - frame pointer register\n"
682     "sp       - stack pointer register\n"
683     "flags    - the flags register\n"
684     "arg{1-6} - integer argument passing registers.\n";
685 }
686 
687 static const char *
688 BreakpointIDHelpTextCallback ()
689 {
690     return "Breakpoint ID's consist major and minor numbers;  the major number "
691     "corresponds to the single entity that was created with a 'breakpoint set' "
692     "command; the minor numbers correspond to all the locations that were actually "
693     "found/set based on the major breakpoint.  A full breakpoint ID might look like "
694     "3.14, meaning the 14th location set for the 3rd breakpoint.  You can specify "
695     "all the locations of a breakpoint by just indicating the major breakpoint "
696     "number. A valid breakpoint id consists either of just the major id number, "
697     "or the major number, a dot, and the location number (e.g. 3 or 3.2 could "
698     "both be valid breakpoint ids).";
699 }
700 
701 static const char *
702 BreakpointIDRangeHelpTextCallback ()
703 {
704     return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. "
705     "This can be done  through several mechanisms.  The easiest way is to just "
706     "enter a space-separated list of breakpoint ids.  To specify all the "
707     "breakpoint locations under a major breakpoint, you can use the major "
708     "breakpoint number followed by '.*', eg. '5.*' means all the locations under "
709     "breakpoint 5.  You can also indicate a range of breakpoints by using "
710     "<start-bp-id> - <end-bp-id>.  The start-bp-id and end-bp-id for a range can "
711     "be any valid breakpoint ids.  It is not legal, however, to specify a range "
712     "using specific locations that cross major breakpoint numbers.  I.e. 3.2 - 3.7"
713     " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal.";
714 }
715 
716 static const char *
717 BreakpointNameHelpTextCallback ()
718 {
719     return "A name that can be added to a breakpoint when it is created, or later "
720     "on with the \"breakpoint name add\" command.  "
721     "Breakpoint names can be used to specify breakpoints in all the places breakpoint ID's "
722     "and breakpoint ID ranges can be used.  As such they provide a convenient way to group breakpoints, "
723     "and to operate on breakpoints you create without having to track the breakpoint number.  "
724     "Note, the attributes you set when using a breakpoint name in a breakpoint command don't "
725     "adhere to the name, but instead are set individually on all the breakpoints currently tagged with that name.  Future breakpoints "
726     "tagged with that name will not pick up the attributes previously given using that name.  "
727     "In order to distinguish breakpoint names from breakpoint ID's and ranges, "
728     "names must start with a letter from a-z or A-Z and cannot contain spaces, \".\" or \"-\".  "
729     "Also, breakpoint names can only be applied to breakpoints, not to breakpoint locations.";
730 }
731 
732 static const char *
733 GDBFormatHelpTextCallback ()
734 {
735     return "A GDB format consists of a repeat count, a format letter and a size letter. "
736     "The repeat count is optional and defaults to 1. The format letter is optional "
737     "and defaults to the previous format that was used. The size letter is optional "
738     "and defaults to the previous size that was used.\n"
739     "\n"
740     "Format letters include:\n"
741     "o - octal\n"
742     "x - hexadecimal\n"
743     "d - decimal\n"
744     "u - unsigned decimal\n"
745     "t - binary\n"
746     "f - float\n"
747     "a - address\n"
748     "i - instruction\n"
749     "c - char\n"
750     "s - string\n"
751     "T - OSType\n"
752     "A - float as hex\n"
753     "\n"
754     "Size letters include:\n"
755     "b - 1 byte  (byte)\n"
756     "h - 2 bytes (halfword)\n"
757     "w - 4 bytes (word)\n"
758     "g - 8 bytes (giant)\n"
759     "\n"
760     "Example formats:\n"
761     "32xb - show 32 1 byte hexadecimal integer values\n"
762     "16xh - show 16 2 byte hexadecimal integer values\n"
763     "64   - show 64 2 byte hexadecimal integer values (format and size from the last format)\n"
764     "dw   - show 1 4 byte decimal integer value\n"
765     ;
766 }
767 
768 static const char *
769 FormatHelpTextCallback ()
770 {
771 
772     static char* help_text_ptr = nullptr;
773 
774     if (help_text_ptr)
775         return help_text_ptr;
776 
777     StreamString sstr;
778     sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n";
779     for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1))
780     {
781         if (f != eFormatDefault)
782             sstr.PutChar('\n');
783 
784         char format_char = FormatManager::GetFormatAsFormatChar(f);
785         if (format_char)
786             sstr.Printf("'%c' or ", format_char);
787 
788         sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f));
789     }
790 
791     sstr.Flush();
792 
793     std::string data = sstr.GetString();
794 
795     help_text_ptr = new char[data.length()+1];
796 
797     data.copy(help_text_ptr, data.length());
798 
799     return help_text_ptr;
800 }
801 
802 static const char *
803 LanguageTypeHelpTextCallback ()
804 {
805     static char* help_text_ptr = nullptr;
806 
807     if (help_text_ptr)
808         return help_text_ptr;
809 
810     StreamString sstr;
811     sstr << "One of the following languages:\n";
812 
813     Language::PrintAllLanguages(sstr, "  ", "\n");
814 
815     sstr.Flush();
816 
817     std::string data = sstr.GetString();
818 
819     help_text_ptr = new char[data.length()+1];
820 
821     data.copy(help_text_ptr, data.length());
822 
823     return help_text_ptr;
824 }
825 
826 static const char *
827 SummaryStringHelpTextCallback()
828 {
829     return
830         "A summary string is a way to extract information from variables in order to present them using a summary.\n"
831         "Summary strings contain static text, variables, scopes and control sequences:\n"
832         "  - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n"
833         "  - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n"
834         "  - 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"
835         "  - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n"
836         "A summary string works by copying static text verbatim, turning control sequences into their character counterpart, expanding variables and trying to expand scopes.\n"
837         "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"
838         "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"
839         " (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"
840         " ${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."
841         " 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"
842         "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."
843         "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"
844         " path refers to:\n"
845         "  - 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"
846         " and displayed as an individual variable\n"
847         "  - 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"
848         " 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"
849         "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"
850         "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"
851         " special symbols only allowed as part of a variable:\n"
852         "    %V: show the value of the object by default\n"
853         "    %S: show the summary of the object by default\n"
854         "    %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n"
855         "    %L: show the location of the object (memory address or a register name)\n"
856         "    %#: show the number of children of the object\n"
857         "    %T: show the type of the object\n"
858         "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"
859         " 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"
860         " count the number of actual elements stored in an std::list:\n"
861         "type summary add -s \"${svar%#}\" -x \"std::list<\"";
862 }
863 
864 static const char *
865 ExprPathHelpTextCallback()
866 {
867     return
868     "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"
869     "For instance, given a class:\n"
870     "  class foo {\n"
871     "      int a;\n"
872     "      int b; .\n"
873     "      foo* next;\n"
874     "  };\n"
875     "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n"
876     "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"
877     "Expression paths in LLDB include dot (.) and arrow (->) operators, and most commands using expression paths have ways to also accept the star (*) operator.\n"
878     "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n"
879     "LLDB also has support for indexing ([ ]) in expression paths, and extends the traditional meaning of the square brackets operator to allow bitfield extraction:\n"
880     "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"
881     " 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"
882     " 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"
883     " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory).";
884 }
885 
886 void
887 CommandObject::FormatLongHelpText (Stream &output_strm, const char *long_help)
888 {
889     CommandInterpreter& interpreter = GetCommandInterpreter();
890     std::stringstream lineStream (long_help);
891     std::string line;
892     while (std::getline (lineStream, line)) {
893         if (line.empty()) {
894             output_strm << "\n";
895             continue;
896         }
897         size_t result = line.find_first_not_of (" \t");
898         if (result == std::string::npos) {
899             result = 0;
900         }
901         std::string whitespace_prefix = line.substr (0, result);
902         std::string remainder = line.substr (result);
903         interpreter.OutputFormattedHelpText(output_strm, whitespace_prefix.c_str(), remainder.c_str());
904     }
905 }
906 
907 void
908 CommandObject::GenerateHelpText (CommandReturnObject &result)
909 {
910     GenerateHelpText(result.GetOutputStream());
911 
912     result.SetStatus (eReturnStatusSuccessFinishNoResult);
913 }
914 
915 void
916 CommandObject::GenerateHelpText (Stream &output_strm)
917 {
918     CommandInterpreter& interpreter = GetCommandInterpreter();
919     if (GetOptions() != nullptr)
920     {
921         if (WantsRawCommandString())
922         {
923             std::string help_text (GetHelp());
924             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
925             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
926         }
927         else
928             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
929         output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
930         GetOptions()->GenerateOptionUsage (output_strm, this);
931         const char *long_help = GetHelpLong();
932         if ((long_help != nullptr)
933             && (strlen (long_help) > 0))
934             FormatLongHelpText (output_strm, long_help);
935         if (WantsRawCommandString() && !WantsCompletion())
936         {
937             // Emit the message about using ' -- ' between the end of the command options and the raw input
938             // conditionally, i.e., only if the command object does not want completion.
939             interpreter.OutputFormattedHelpText (output_strm, "", "",
940                                                  "\nIMPORTANT NOTE:  Because this command takes 'raw' input, if you use any command options"
941                                                  " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1);
942         }
943         else if (GetNumArgumentEntries() > 0
944                  && GetOptions()
945                  && GetOptions()->NumCommandOptions() > 0)
946         {
947             // Also emit a warning about using "--" in case you are using a command that takes options and arguments.
948             interpreter.OutputFormattedHelpText (output_strm, "", "",
949                                                  "\nThis command takes options and free-form arguments.  If your arguments resemble"
950                                                  " option specifiers (i.e., they start with a - or --), you must use ' -- ' between"
951                                                  " the end of the command options and the beginning of the arguments.", 1);
952         }
953     }
954     else if (IsMultiwordObject())
955     {
956         if (WantsRawCommandString())
957         {
958             std::string help_text (GetHelp());
959             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
960             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
961         }
962         else
963             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
964         GenerateHelpText (output_strm);
965     }
966     else
967     {
968         const char *long_help = GetHelpLong();
969         if ((long_help != nullptr)
970             && (strlen (long_help) > 0))
971             FormatLongHelpText (output_strm, long_help);
972         else if (WantsRawCommandString())
973         {
974             std::string help_text (GetHelp());
975             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
976             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
977         }
978         else
979             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
980         output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
981     }
982 }
983 
984 void
985 CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange)
986 {
987     CommandArgumentData id_arg;
988     CommandArgumentData id_range_arg;
989 
990     // Create the first variant for the first (and only) argument for this command.
991     id_arg.arg_type = ID;
992     id_arg.arg_repetition = eArgRepeatOptional;
993 
994     // Create the second variant for the first (and only) argument for this command.
995     id_range_arg.arg_type = IDRange;
996     id_range_arg.arg_repetition = eArgRepeatOptional;
997 
998     // The first (and only) argument for this command could be either an id or an id_range.
999     // Push both variants into the entry for the first argument for this command.
1000     arg.push_back(id_arg);
1001     arg.push_back(id_range_arg);
1002 }
1003 
1004 const char *
1005 CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
1006 {
1007     assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentTypeAsCString");
1008     return g_arguments_data[arg_type].arg_name;
1009 }
1010 
1011 const char *
1012 CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
1013 {
1014     assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentDescriptionAsCString");
1015     return g_arguments_data[arg_type].help_text;
1016 }
1017 
1018 Target *
1019 CommandObject::GetDummyTarget()
1020 {
1021     return m_interpreter.GetDebugger().GetDummyTarget();
1022 }
1023 
1024 Target *
1025 CommandObject::GetSelectedOrDummyTarget(bool prefer_dummy)
1026 {
1027     return m_interpreter.GetDebugger().GetSelectedOrDummyTarget(prefer_dummy);
1028 }
1029 
1030 bool
1031 CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result)
1032 {
1033     bool handled = false;
1034     Args cmd_args (args_string);
1035     if (HasOverrideCallback())
1036     {
1037         Args full_args (GetCommandName ());
1038         full_args.AppendArguments(cmd_args);
1039         handled = InvokeOverrideCallback (full_args.GetConstArgumentVector(), result);
1040     }
1041     if (!handled)
1042     {
1043         for (size_t i = 0; i < cmd_args.GetArgumentCount();  ++i)
1044         {
1045             const char *tmp_str = cmd_args.GetArgumentAtIndex (i);
1046             if (tmp_str[0] == '`')  // back-quote
1047                 cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
1048         }
1049 
1050         if (CheckRequirements(result))
1051         {
1052             if (ParseOptions (cmd_args, result))
1053             {
1054                 // Call the command-specific version of 'Execute', passing it the already processed arguments.
1055                 handled = DoExecute (cmd_args, result);
1056             }
1057         }
1058 
1059         Cleanup();
1060     }
1061     return handled;
1062 }
1063 
1064 bool
1065 CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result)
1066 {
1067     bool handled = false;
1068     if (HasOverrideCallback())
1069     {
1070         std::string full_command (GetCommandName ());
1071         full_command += ' ';
1072         full_command += args_string;
1073         const char *argv[2] = { nullptr, nullptr };
1074         argv[0] = full_command.c_str();
1075         handled = InvokeOverrideCallback (argv, result);
1076     }
1077     if (!handled)
1078     {
1079         if (CheckRequirements(result))
1080             handled = DoExecute (args_string, result);
1081 
1082         Cleanup();
1083     }
1084     return handled;
1085 }
1086 
1087 static
1088 const char *arch_helper()
1089 {
1090     static StreamString g_archs_help;
1091     if (g_archs_help.Empty())
1092     {
1093         StringList archs;
1094         ArchSpec::AutoComplete(nullptr, archs);
1095         g_archs_help.Printf("These are the supported architecture names:\n");
1096         archs.Join("\n", g_archs_help);
1097     }
1098     return g_archs_help.GetData();
1099 }
1100 
1101 CommandObject::ArgumentTableEntry
1102 CommandObject::g_arguments_data[] =
1103 {
1104     { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid address in the target program's execution space." },
1105     { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "An expression that resolves to an address." },
1106     { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of an abbreviation (alias) for a debugger command." },
1107     { eArgTypeAliasOptions, "options-for-aliased-command", CommandCompletions::eNoCompletion, { nullptr, false }, "Command options to be used as part of an alias (abbreviation) definition.  (See 'help commands alias' for more information.)" },
1108     { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." },
1109     { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { nullptr, false }, "A Boolean value: 'true' or 'false'" },
1110     { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, nullptr },
1111     { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, nullptr },
1112     { eArgTypeBreakpointName, "breakpoint-name", CommandCompletions::eNoCompletion, { BreakpointNameHelpTextCallback, false }, nullptr },
1113     { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { nullptr, false }, "Number of bytes to use." },
1114     { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { nullptr, false }, "Then name of a class from the debug information in the program." },
1115     { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A debugger command (may be multiple words), without any options or arguments." },
1116     { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." },
1117     { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { nullptr, false }, "A directory name." },
1118     { eArgTypeDisassemblyFlavor, "disassembly-flavor", CommandCompletions::eNoCompletion, { nullptr, false }, "A disassembly flavor recognized by your disassembly plugin.  Currently the only valid options are \"att\" and \"intel\" for Intel targets" },
1119     { eArgTypeDescriptionVerbosity, "description-verbosity", CommandCompletions::eNoCompletion, { nullptr, false }, "How verbose the output of 'po' should be." },
1120     { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1121     { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1122     { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, nullptr },
1123     { eArgTypeExprFormat, "expression-format", CommandCompletions::eNoCompletion, { nullptr, false }, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]" },
1124     { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "The name of a file (can include path)." },
1125     { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, nullptr },
1126     { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into a thread's list of frames." },
1127     { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1128     { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function." },
1129     { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function or symbol." },
1130     { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, nullptr },
1131     { eArgTypeHelpText, "help-text", CommandCompletions::eNoCompletion, { nullptr, false }, "Text to be used as help for some other entity in LLDB" },
1132     { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a list." },
1133     { eArgTypeLanguage, "source-language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, nullptr },
1134     { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { nullptr, false }, "Line number in a source file." },
1135     { eArgTypeLogCategory, "log-category", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a category within a log channel, e.g. all (try \"log list\" to see a list of all channels and their categories." },
1136     { eArgTypeLogChannel, "log-channel", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a log channel, e.g. process.gdb-remote (try \"log list\" to see a list of all channels and their categories)." },
1137     { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { nullptr, false }, "A C++ method name." },
1138     { eArgTypeName, "name", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1139     { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1140     { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of lines to use." },
1141     { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of items per line to display." },
1142     { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1143     { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1144     { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { nullptr, false }, "A command that is entered as a single line of text." },
1145     { eArgTypePath, "path", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "Path." },
1146     { eArgTypePermissionsNumber, "perms-numeric", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as an octal number (e.g. 755)." },
1147     { eArgTypePermissionsString, "perms=string", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as a string value (e.g. rw-r-xr--)." },
1148     { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { nullptr, false }, "The process ID number." },
1149     { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1150     { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the process." },
1151     { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python class." },
1152     { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python function." },
1153     { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { nullptr, false }, "Source code written in Python." },
1154     { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the thread queue." },
1155     { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, nullptr },
1156     { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "A regular expression." },
1157     { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { nullptr, false }, "Arguments to be passed to the target program when it starts executing." },
1158     { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1159     { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { nullptr, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." },
1160     { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { nullptr, false }, "The scripting language to be used for script-based commands.  Currently only Python is valid." },
1161     { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { nullptr, false }, "The word for which you wish to search for information about." },
1162     { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { nullptr, false }, "An Objective-C selector name." },
1163     { eArgTypeSettingIndex, "setting-index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a settings variable that is an array (try 'settings list' to see all the possible settings variables and their types)." },
1164     { eArgTypeSettingKey, "setting-key", CommandCompletions::eNoCompletion, { nullptr, false }, "A key into a settings variables that is a dictionary (try 'settings list' to see all the possible settings variables and their types)." },
1165     { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" },
1166     { eArgTypeSettingVariableName, "setting-variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable.  Type 'settings list' to see a complete list of such variables." },
1167     { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a shared library." },
1168     { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { nullptr, false }, "The name of a source file.." },
1169     { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify a sort order when dumping lists." },
1170     { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1171     { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, nullptr },
1172     { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { nullptr, false }, "Any symbol name (function name, variable, argument, etc.)" },
1173     { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Thread ID number." },
1174     { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into the process' list of threads." },
1175     { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The thread's name." },
1176     { eArgTypeTypeName, "type-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A type name." },
1177     { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." },
1178     { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." },
1179     { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a variable in your program." },
1180     { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { nullptr, false }, "A value could be anything, depending on where and how it is used." },
1181     { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1182     { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { nullptr, false }, "No help available for this." },
1183     { eArgTypePlatform, "platform-name", CommandCompletions::ePlatformPluginCompletion, { nullptr, false }, "The name of an installed platform plug-in . Type 'platform list' to see a complete list of installed platforms." },
1184     { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Watchpoint IDs are positive integers." },
1185     { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { nullptr, false }, "For example, '1-3' or '1 to 3'." },
1186     { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify the type for a watchpoint." }
1187 };
1188 
1189 const CommandObject::ArgumentTableEntry*
1190 CommandObject::GetArgumentTable ()
1191 {
1192     // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration
1193     assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg);
1194     return CommandObject::g_arguments_data;
1195 }
1196 
1197 
1198