1 //===-- CommandObject.h -----------------------------------------*- 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 #ifndef liblldb_CommandObject_h_
11 #define liblldb_CommandObject_h_
12 
13 #include <map>
14 #include <set>
15 #include <string>
16 #include <vector>
17 
18 #include "lldb/lldb-private.h"
19 #include "lldb/Interpreter/Args.h"
20 #include "lldb/Interpreter/CommandCompletions.h"
21 #include "lldb/Core/StringList.h"
22 #include "lldb/Core/Flags.h"
23 #include "lldb/Host/Mutex.h"
24 #include "lldb/Target/ExecutionContext.h"
25 
26 namespace lldb_private {
27 
28 class CommandObject
29 {
30 public:
31 
32     typedef const char *(ArgumentHelpCallbackFunction) ();
33 
34     struct ArgumentHelpCallback
35     {
36         ArgumentHelpCallbackFunction  *help_callback;
37         bool                           self_formatting;
38 
39         const char*
operatorArgumentHelpCallback40         operator () () const
41         {
42             return (*help_callback)();
43         }
44 
45         operator bool() const
46         {
47             return (help_callback != NULL);
48         }
49 
50     };
51 
52     struct ArgumentTableEntry  // Entries in the main argument information table
53     {
54         lldb::CommandArgumentType  arg_type;
55         const char *arg_name;
56         CommandCompletions::CommonCompletionTypes completion_type;
57         ArgumentHelpCallback  help_function;
58         const char *help_text;
59     };
60 
61     struct CommandArgumentData  // Used to build individual command argument lists
62     {
63         lldb::CommandArgumentType arg_type;
64         ArgumentRepetitionType arg_repetition;
65         uint32_t arg_opt_set_association; // This arg might be associated only with some particular option set(s).
CommandArgumentDataCommandArgumentData66         CommandArgumentData():
67             arg_type(lldb::eArgTypeNone),
68             arg_repetition(eArgRepeatPlain),
69             arg_opt_set_association(LLDB_OPT_SET_ALL) // By default, the arg associates to all option sets.
70         {}
71     };
72 
73     typedef std::vector<CommandArgumentData> CommandArgumentEntry; // Used to build individual command argument lists
74 
75     static ArgumentTableEntry g_arguments_data[lldb::eArgTypeLastArg];   // Main argument information table
76 
77     typedef std::map<std::string, lldb::CommandObjectSP> CommandMap;
78 
79     CommandObject (CommandInterpreter &interpreter,
80                    const char *name,
81                    const char *help = NULL,
82                    const char *syntax = NULL,
83                    uint32_t flags = 0);
84 
85     virtual
86     ~CommandObject ();
87 
88 
89     static const char *
90     GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type);
91 
92     static const char *
93     GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type);
94 
95     CommandInterpreter &
GetCommandInterpreter()96     GetCommandInterpreter ()
97     {
98         return m_interpreter;
99     }
100 
101     const char *
102     GetHelp ();
103 
104     virtual const char *
105     GetHelpLong ();
106 
107     const char *
108     GetSyntax ();
109 
110     const char *
111     GetCommandName ();
112 
113     void
114     SetHelp (const char * str);
115 
116     void
117     SetHelpLong (const char * str);
118 
119     void
120     SetHelpLong (std::string str);
121 
122     void
123     SetSyntax (const char *str);
124 
125     // override this to return true if you want to enable the user to delete
126     // the Command object from the Command dictionary (aliases have their own
127     // deletion scheme, so they do not need to care about this)
128     virtual bool
IsRemovable()129     IsRemovable () const { return false; }
130 
131     bool
IsAlias()132     IsAlias () { return m_is_alias; }
133 
134     void
SetIsAlias(bool value)135     SetIsAlias (bool value) { m_is_alias = value; }
136 
137     virtual bool
IsMultiwordObject()138     IsMultiwordObject () { return false; }
139 
140     virtual lldb::CommandObjectSP
141     GetSubcommandSP (const char *sub_cmd, StringList *matches = NULL)
142     {
143         return lldb::CommandObjectSP();
144     }
145 
146     virtual CommandObject *
147     GetSubcommandObject (const char *sub_cmd, StringList *matches = NULL)
148     {
149         return NULL;
150     }
151 
152     virtual void
AproposAllSubCommands(const char * prefix,const char * search_word,StringList & commands_found,StringList & commands_help)153     AproposAllSubCommands (const char *prefix,
154                            const char *search_word,
155                            StringList &commands_found,
156                            StringList &commands_help)
157     {
158     }
159 
160     void
161     GenerateHelpText (CommandReturnObject &result);
162 
163     virtual void
164     GenerateHelpText (Stream &result);
165 
166     // this is needed in order to allow the SBCommand class to
167     // transparently try and load subcommands - it will fail on
168     // anything but a multiword command, but it avoids us doing
169     // type checkings and casts
170     virtual bool
LoadSubCommand(const char * cmd_name,const lldb::CommandObjectSP & command_obj)171     LoadSubCommand (const char *cmd_name,
172                     const lldb::CommandObjectSP& command_obj)
173     {
174         return false;
175     }
176 
177     virtual bool
178     WantsRawCommandString() = 0;
179 
180     // By default, WantsCompletion = !WantsRawCommandString.
181     // Subclasses who want raw command string but desire, for example,
182     // argument completion should override this method to return true.
183     virtual bool
WantsCompletion()184     WantsCompletion() { return !WantsRawCommandString(); }
185 
186     virtual Options *
187     GetOptions ();
188 
189     static const ArgumentTableEntry*
190     GetArgumentTable ();
191 
192     static lldb::CommandArgumentType
193     LookupArgumentName (const char *arg_name);
194 
195     static ArgumentTableEntry *
196     FindArgumentDataByType (lldb::CommandArgumentType arg_type);
197 
198     int
199     GetNumArgumentEntries ();
200 
201     CommandArgumentEntry *
202     GetArgumentEntryAtIndex (int idx);
203 
204     static void
205     GetArgumentHelp (Stream &str, lldb::CommandArgumentType arg_type, CommandInterpreter &interpreter);
206 
207     static const char *
208     GetArgumentName (lldb::CommandArgumentType arg_type);
209 
210     // Generates a nicely formatted command args string for help command output.
211     // By default, all possible args are taken into account, for example,
212     // '<expr | variable-name>'.  This can be refined by passing a second arg
213     // specifying which option set(s) we are interested, which could then, for
214     // example, produce either '<expr>' or '<variable-name>'.
215     void
216     GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask = LLDB_OPT_SET_ALL);
217 
218     bool
219     IsPairType (ArgumentRepetitionType arg_repeat_type);
220 
221     enum
222     {
223         //----------------------------------------------------------------------
224         // eFlagRequiresTarget
225         //
226         // Ensures a valid target is contained in m_exe_ctx prior to executing
227         // the command. If a target doesn't exist or is invalid, the command
228         // will fail and CommandObject::GetInvalidTargetDescription() will be
229         // returned as the error. CommandObject subclasses can override the
230         // virtual function for GetInvalidTargetDescription() to provide custom
231         // strings when needed.
232         //----------------------------------------------------------------------
233         eFlagRequiresTarget         = (1u << 0),
234         //----------------------------------------------------------------------
235         // eFlagRequiresProcess
236         //
237         // Ensures a valid process is contained in m_exe_ctx prior to executing
238         // the command. If a process doesn't exist or is invalid, the command
239         // will fail and CommandObject::GetInvalidProcessDescription() will be
240         // returned as the error. CommandObject subclasses can override the
241         // virtual function for GetInvalidProcessDescription() to provide custom
242         // strings when needed.
243         //----------------------------------------------------------------------
244         eFlagRequiresProcess        = (1u << 1),
245         //----------------------------------------------------------------------
246         // eFlagRequiresThread
247         //
248         // Ensures a valid thread is contained in m_exe_ctx prior to executing
249         // the command. If a thread doesn't exist or is invalid, the command
250         // will fail and CommandObject::GetInvalidThreadDescription() will be
251         // returned as the error. CommandObject subclasses can override the
252         // virtual function for GetInvalidThreadDescription() to provide custom
253         // strings when needed.
254         //----------------------------------------------------------------------
255         eFlagRequiresThread         = (1u << 2),
256         //----------------------------------------------------------------------
257         // eFlagRequiresFrame
258         //
259         // Ensures a valid frame is contained in m_exe_ctx prior to executing
260         // the command. If a frame doesn't exist or is invalid, the command
261         // will fail and CommandObject::GetInvalidFrameDescription() will be
262         // returned as the error. CommandObject subclasses can override the
263         // virtual function for GetInvalidFrameDescription() to provide custom
264         // strings when needed.
265         //----------------------------------------------------------------------
266         eFlagRequiresFrame          = (1u << 3),
267         //----------------------------------------------------------------------
268         // eFlagRequiresRegContext
269         //
270         // Ensures a valid register context (from the selected frame if there
271         // is a frame in m_exe_ctx, or from the selected thread from m_exe_ctx)
272         // is availble from m_exe_ctx prior to executing the command. If a
273         // target doesn't exist or is invalid, the command will fail and
274         // CommandObject::GetInvalidRegContextDescription() will be returned as
275         // the error. CommandObject subclasses can override the virtual function
276         // for GetInvalidRegContextDescription() to provide custom strings when
277         // needed.
278         //----------------------------------------------------------------------
279         eFlagRequiresRegContext     = (1u << 4),
280         //----------------------------------------------------------------------
281         // eFlagTryTargetAPILock
282         //
283         // Attempts to acquire the target lock if a target is selected in the
284         // command interpreter. If the command object fails to acquire the API
285         // lock, the command will fail with an appropriate error message.
286         //----------------------------------------------------------------------
287         eFlagTryTargetAPILock       = (1u << 5),
288         //----------------------------------------------------------------------
289         // eFlagProcessMustBeLaunched
290         //
291         // Verifies that there is a launched process in m_exe_ctx, if there
292         // isn't, the command will fail with an appropriate error message.
293         //----------------------------------------------------------------------
294         eFlagProcessMustBeLaunched  = (1u << 6),
295         //----------------------------------------------------------------------
296         // eFlagProcessMustBePaused
297         //
298         // Verifies that there is a paused process in m_exe_ctx, if there
299         // isn't, the command will fail with an appropriate error message.
300         //----------------------------------------------------------------------
301         eFlagProcessMustBePaused    = (1u << 7)
302     };
303 
304     bool
305     ParseOptions (Args& args, CommandReturnObject &result);
306 
307     void
308     SetCommandName (const char *name);
309 
310     // This function really deals with CommandObjectLists, but we didn't make a
311     // CommandObjectList class, so I'm sticking it here.  But we really should have
312     // such a class.  Anyway, it looks up the commands in the map that match the partial
313     // string cmd_str, inserts the matches into matches, and returns the number added.
314 
315     static int
316     AddNamesMatchingPartialString (CommandMap &in_map, const char *cmd_str, StringList &matches);
317 
318     //------------------------------------------------------------------
319     /// The input array contains a parsed version of the line.  The insertion
320     /// point is given by cursor_index (the index in input of the word containing
321     /// the cursor) and cursor_char_position (the position of the cursor in that word.)
322     /// This default version handles calling option argument completions and then calls
323     /// HandleArgumentCompletion if the cursor is on an argument, not an option.
324     /// Don't override this method, override HandleArgumentCompletion instead unless
325     /// you have special reasons.
326     ///
327     /// @param[in] interpreter
328     ///    The command interpreter doing the completion.
329     ///
330     /// @param[in] input
331     ///    The command line parsed into words
332     ///
333     /// @param[in] cursor_index
334     ///     The index in \ainput of the word in which the cursor lies.
335     ///
336     /// @param[in] cursor_char_pos
337     ///     The character position of the cursor in its argument word.
338     ///
339     /// @param[in] match_start_point
340     /// @param[in] match_return_elements
341     ///     FIXME: Not yet implemented...  If there is a match that is expensive to compute, these are
342     ///     here to allow you to compute the completions in batches.  Start the completion from \amatch_start_point,
343     ///     and return \amatch_return_elements elements.
344     ///
345     /// @param[out] word_complete
346     ///     \btrue if this is a complete option value (a space will be inserted after the
347     ///     completion.)  \bfalse otherwise.
348     ///
349     /// @param[out] matches
350     ///     The array of matches returned.
351     ///
352     /// FIXME: This is the wrong return value, since we also need to make a distinction between
353     /// total number of matches, and the window the user wants returned.
354     ///
355     /// @return
356     ///     \btrue if we were in an option, \bfalse otherwise.
357     //------------------------------------------------------------------
358     virtual int
359     HandleCompletion (Args &input,
360                       int &cursor_index,
361                       int &cursor_char_position,
362                       int match_start_point,
363                       int max_return_elements,
364                       bool &word_complete,
365                       StringList &matches);
366 
367     //------------------------------------------------------------------
368     /// The input array contains a parsed version of the line.  The insertion
369     /// point is given by cursor_index (the index in input of the word containing
370     /// the cursor) and cursor_char_position (the position of the cursor in that word.)
371     /// We've constructed the map of options and their arguments as well if that is
372     /// helpful for the completion.
373     ///
374     /// @param[in] interpreter
375     ///    The command interpreter doing the completion.
376     ///
377     /// @param[in] input
378     ///    The command line parsed into words
379     ///
380     /// @param[in] cursor_index
381     ///     The index in \ainput of the word in which the cursor lies.
382     ///
383     /// @param[in] cursor_char_pos
384     ///     The character position of the cursor in its argument word.
385     ///
386     /// @param[in] opt_element_vector
387     ///     The results of the options parse of \a input.
388     ///
389     /// @param[in] match_start_point
390     /// @param[in] match_return_elements
391     ///     See CommandObject::HandleCompletions for a description of how these work.
392     ///
393     /// @param[out] word_complete
394     ///     \btrue if this is a complete option value (a space will be inserted after the
395     ///     completion.)  \bfalse otherwise.
396     ///
397     /// @param[out] matches
398     ///     The array of matches returned.
399     ///
400     /// FIXME: This is the wrong return value, since we also need to make a distinction between
401     /// total number of matches, and the window the user wants returned.
402     ///
403     /// @return
404     ///     The number of completions.
405     //------------------------------------------------------------------
406 
407     virtual int
HandleArgumentCompletion(Args & input,int & cursor_index,int & cursor_char_position,OptionElementVector & opt_element_vector,int match_start_point,int max_return_elements,bool & word_complete,StringList & matches)408     HandleArgumentCompletion (Args &input,
409                               int &cursor_index,
410                               int &cursor_char_position,
411                               OptionElementVector &opt_element_vector,
412                               int match_start_point,
413                               int max_return_elements,
414                               bool &word_complete,
415                               StringList &matches)
416     {
417         return 0;
418     }
419 
420     bool
421     HelpTextContainsWord (const char *search_word);
422 
423     //------------------------------------------------------------------
424     /// The flags accessor.
425     ///
426     /// @return
427     ///     A reference to the Flags member variable.
428     //------------------------------------------------------------------
429     Flags&
GetFlags()430     GetFlags()
431     {
432         return m_flags;
433     }
434 
435     //------------------------------------------------------------------
436     /// The flags const accessor.
437     ///
438     /// @return
439     ///     A const reference to the Flags member variable.
440     //------------------------------------------------------------------
441     const Flags&
GetFlags()442     GetFlags() const
443     {
444         return m_flags;
445     }
446 
447     //------------------------------------------------------------------
448     /// Get the command that appropriate for a "repeat" of the current command.
449     ///
450     /// @param[in] current_command_line
451     ///    The complete current command line.
452     ///
453     /// @return
454     ///     NULL if there is no special repeat command - it will use the current command line.
455     ///     Otherwise a pointer to the command to be repeated.
456     ///     If the returned string is the empty string, the command won't be repeated.
457     //------------------------------------------------------------------
GetRepeatCommand(Args & current_command_args,uint32_t index)458     virtual const char *GetRepeatCommand (Args &current_command_args, uint32_t index)
459     {
460         return NULL;
461     }
462 
463     CommandOverrideCallback
GetOverrideCallback()464     GetOverrideCallback () const
465     {
466         return m_command_override_callback;
467     }
468 
469     void *
GetOverrideCallbackBaton()470     GetOverrideCallbackBaton () const
471     {
472         return m_command_override_baton;
473     }
474 
475     void
SetOverrideCallback(CommandOverrideCallback callback,void * baton)476     SetOverrideCallback (CommandOverrideCallback callback, void *baton)
477     {
478         m_command_override_callback = callback;
479         m_command_override_baton = baton;
480     }
481 
482     virtual bool
483     Execute (const char *args_string, CommandReturnObject &result) = 0;
484 
485 protected:
486     virtual const char *
GetInvalidTargetDescription()487     GetInvalidTargetDescription()
488     {
489         return "invalid target, create a target using the 'target create' command";
490     }
491 
492     virtual const char *
GetInvalidProcessDescription()493     GetInvalidProcessDescription()
494     {
495         return "invalid process";
496     }
497 
498     virtual const char *
GetInvalidThreadDescription()499     GetInvalidThreadDescription()
500     {
501         return "invalid thread";
502     }
503 
504     virtual const char *
GetInvalidFrameDescription()505     GetInvalidFrameDescription()
506     {
507         return "invalid frame";
508     }
509 
510     virtual const char *
GetInvalidRegContextDescription()511     GetInvalidRegContextDescription ()
512     {
513         return "invalid frame, no registers";
514     }
515 
516     //------------------------------------------------------------------
517     /// Check the command to make sure anything required by this
518     /// command is available.
519     ///
520     /// @param[out] result
521     ///     A command result object, if it is not okay to run the command
522     ///     this will be filled in with a suitable error.
523     ///
524     /// @return
525     ///     \b true if it is okay to run this command, \b false otherwise.
526     //------------------------------------------------------------------
527     bool
528     CheckRequirements (CommandReturnObject &result);
529 
530     void
531     Cleanup ();
532 
533     CommandInterpreter &m_interpreter;
534     ExecutionContext m_exe_ctx;
535     Mutex::Locker m_api_locker;
536     std::string m_cmd_name;
537     std::string m_cmd_help_short;
538     std::string m_cmd_help_long;
539     std::string m_cmd_syntax;
540     bool m_is_alias;
541     Flags m_flags;
542     std::vector<CommandArgumentEntry> m_arguments;
543     CommandOverrideCallback m_command_override_callback;
544     void * m_command_override_baton;
545 
546     // Helper function to populate IDs or ID ranges as the command argument data
547     // to the specified command argument entry.
548     static void
549     AddIDsArgumentData(CommandArgumentEntry &arg, lldb::CommandArgumentType ID, lldb::CommandArgumentType IDRange);
550 
551 };
552 
553 class CommandObjectParsed : public CommandObject
554 {
555 public:
556 
557     CommandObjectParsed (CommandInterpreter &interpreter,
558                          const char *name,
559                          const char *help = NULL,
560                          const char *syntax = NULL,
561                          uint32_t flags = 0) :
CommandObject(interpreter,name,help,syntax,flags)562         CommandObject (interpreter, name, help, syntax, flags) {}
563 
564     virtual
~CommandObjectParsed()565     ~CommandObjectParsed () {};
566 
567     virtual bool
568     Execute (const char *args_string, CommandReturnObject &result);
569 
570 protected:
571     virtual bool
572     DoExecute (Args& command,
573              CommandReturnObject &result) = 0;
574 
575     virtual bool
WantsRawCommandString()576     WantsRawCommandString() { return false; };
577 };
578 
579 class CommandObjectRaw : public CommandObject
580 {
581 public:
582 
583     CommandObjectRaw (CommandInterpreter &interpreter,
584                          const char *name,
585                          const char *help = NULL,
586                          const char *syntax = NULL,
587                          uint32_t flags = 0) :
CommandObject(interpreter,name,help,syntax,flags)588         CommandObject (interpreter, name, help, syntax, flags) {}
589 
590     virtual
~CommandObjectRaw()591     ~CommandObjectRaw () {};
592 
593     virtual bool
594     Execute (const char *args_string, CommandReturnObject &result);
595 
596 protected:
597     virtual bool
598     DoExecute (const char *command, CommandReturnObject &result) = 0;
599 
600     virtual bool
WantsRawCommandString()601     WantsRawCommandString() { return true; };
602 };
603 
604 
605 } // namespace lldb_private
606 
607 
608 #endif  // liblldb_CommandObject_h_
609