Coverage Report

Created: 2023-09-21 18:56

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/API/SBCommandInterpreter.h
Line
Count
Source (jump to first uncovered line)
1
//===-- SBCommandInterpreter.h ----------------------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#ifndef LLDB_API_SBCOMMANDINTERPRETER_H
10
#define LLDB_API_SBCOMMANDINTERPRETER_H
11
12
#include <memory>
13
14
#include "lldb/API/SBDebugger.h"
15
#include "lldb/API/SBDefines.h"
16
17
namespace lldb_private {
18
class CommandPluginInterfaceImplementation;
19
}
20
21
namespace lldb {
22
23
class SBCommandInterpreter {
24
public:
25
  enum {
26
    eBroadcastBitThreadShouldExit = (1 << 0),
27
    eBroadcastBitResetPrompt = (1 << 1),
28
    eBroadcastBitQuitCommandReceived = (1 << 2), // User entered quit
29
    eBroadcastBitAsynchronousOutputData = (1 << 3),
30
    eBroadcastBitAsynchronousErrorData = (1 << 4)
31
  };
32
33
  SBCommandInterpreter();
34
  SBCommandInterpreter(const lldb::SBCommandInterpreter &rhs);
35
36
  ~SBCommandInterpreter();
37
38
  const lldb::SBCommandInterpreter &
39
  operator=(const lldb::SBCommandInterpreter &rhs);
40
41
  static const char *
42
  GetArgumentTypeAsCString(const lldb::CommandArgumentType arg_type);
43
44
  static const char *
45
  GetArgumentDescriptionAsCString(const lldb::CommandArgumentType arg_type);
46
47
  static bool EventIsCommandInterpreterEvent(const lldb::SBEvent &event);
48
49
  explicit operator bool() const;
50
51
  bool IsValid() const;
52
53
  /// Return whether a built-in command with the passed in
54
  /// name or command path exists.
55
  ///
56
  /// \param[in] cmd
57
  ///   The command or command path to search for.
58
  ///
59
  /// \return
60
  ///   \b true if the command exists, \b false otherwise.
61
  bool CommandExists(const char *cmd);
62
63
  /// Return whether a user defined command with the passed in
64
  /// name or command path exists.
65
  ///
66
  /// \param[in] cmd
67
  ///   The command or command path to search for.
68
  ///
69
  /// \return
70
  ///   \b true if the command exists, \b false otherwise.
71
  bool UserCommandExists(const char *cmd);
72
73
  /// Return whether the passed in name or command path
74
  /// exists and is an alias to some other command.
75
  ///
76
  /// \param[in] cmd
77
  ///   The command or command path to search for.
78
  ///
79
  /// \return
80
  ///   \b true if the command exists, \b false otherwise.
81
  bool AliasExists(const char *cmd);
82
83
  lldb::SBBroadcaster GetBroadcaster();
84
85
  static const char *GetBroadcasterClass();
86
87
  bool HasCommands();
88
89
  bool HasAliases();
90
91
  bool HasAliasOptions();
92
93
  bool IsInteractive();
94
95
  lldb::SBProcess GetProcess();
96
97
  lldb::SBDebugger GetDebugger();
98
99
#ifndef SWIG
100
  lldb::SBCommand AddMultiwordCommand(const char *name, const char *help);
101
102
  /// Add a new command to the lldb::CommandInterpreter.
103
  ///
104
  /// The new command won't support autorepeat. If you need this functionality,
105
  /// use the override of this function that accepts the \a auto_repeat_command
106
  /// parameter.
107
  ///
108
  /// \param[in] name
109
  ///     The name of the command.
110
  ///
111
  /// \param[in] impl
112
  ///     The handler of this command.
113
  ///
114
  /// \param[in] help
115
  ///     The general description to show as part of the help message of this
116
  ///     command.
117
  ///
118
  /// \return
119
  ///     A lldb::SBCommand representing the newly created command.
120
  lldb::SBCommand AddCommand(const char *name,
121
                             lldb::SBCommandPluginInterface *impl,
122
                             const char *help);
123
124
  /// Add a new command to the lldb::CommandInterpreter.
125
  ///
126
  /// The new command won't support autorepeat. If you need this functionality,
127
  /// use the override of this function that accepts the \a auto_repeat_command
128
  /// parameter.
129
  ///
130
  /// \param[in] name
131
  ///     The name of the command.
132
  ///
133
  /// \param[in] impl
134
  ///     The handler of this command.
135
  ///
136
  /// \param[in] help
137
  ///     The general description to show as part of the help message of this
138
  ///     command.
139
  ///
140
  /// \param[in] syntax
141
  ///     The syntax to show as part of the help message of this command. This
142
  ///     could include a description of the different arguments and flags this
143
  ///     command accepts.
144
  ///
145
  /// \return
146
  ///     A lldb::SBCommand representing the newly created command.
147
  lldb::SBCommand AddCommand(const char *name,
148
                             lldb::SBCommandPluginInterface *impl,
149
                             const char *help, const char *syntax);
150
151
  /// Add a new command to the lldb::CommandInterpreter.
152
  ///
153
  /// \param[in] name
154
  ///     The name of the command.
155
  ///
156
  /// \param[in] impl
157
  ///     The handler of this command.
158
  ///
159
  /// \param[in] help
160
  ///     The general description to show as part of the help message of this
161
  ///     command.
162
  ///
163
  /// \param[in] syntax
164
  ///     The syntax to show as part of the help message of this command. This
165
  ///     could include a description of the different arguments and flags this
166
  ///     command accepts.
167
  ///
168
  /// \param[in] auto_repeat_command
169
  ///     Autorepeating is triggered when the user presses Enter successively
170
  ///     after executing a command. If \b nullptr is provided, the previous
171
  ///     exact command will be repeated. If \b "" is provided, autorepeating
172
  ///     is disabled. Otherwise, the provided string is used as a repeat
173
  ///     command.
174
  ///
175
  /// \return
176
  ///     A lldb::SBCommand representing the newly created command.
177
  lldb::SBCommand AddCommand(const char *name,
178
                             lldb::SBCommandPluginInterface *impl,
179
                             const char *help, const char *syntax,
180
                             const char *auto_repeat_command);
181
  void SourceInitFileInGlobalDirectory(lldb::SBCommandReturnObject &result);
182
#endif
183
184
185
  void SourceInitFileInHomeDirectory(lldb::SBCommandReturnObject &result);
186
  void SourceInitFileInHomeDirectory(lldb::SBCommandReturnObject &result,
187
                                     bool is_repl);
188
189
  void
190
  SourceInitFileInCurrentWorkingDirectory(lldb::SBCommandReturnObject &result);
191
192
  lldb::ReturnStatus HandleCommand(const char *command_line,
193
                                   lldb::SBCommandReturnObject &result,
194
                                   bool add_to_history = false);
195
196
  lldb::ReturnStatus HandleCommand(const char *command_line,
197
                                   SBExecutionContext &exe_ctx,
198
                                   SBCommandReturnObject &result,
199
                                   bool add_to_history = false);
200
201
  void HandleCommandsFromFile(lldb::SBFileSpec &file,
202
                              lldb::SBExecutionContext &override_context,
203
                              lldb::SBCommandInterpreterRunOptions &options,
204
                              lldb::SBCommandReturnObject result);
205
206
  // The pointer based interface is not useful in SWIG, since the cursor &
207
  // last_char arguments are string pointers INTO current_line and you can't do
208
  // that in a scripting language interface in general...
209
210
  // In either case, the way this works is that the you give it a line and
211
  // cursor position in the line.  The function will return the number of
212
  // completions.  The matches list will contain number_of_completions + 1
213
  // elements.  The first element is the common substring after the cursor
214
  // position for all the matches.  The rest of the elements are the matches.
215
  // The first element is useful if you are emulating the common shell behavior
216
  // where the tab completes to the string that is common among all the
217
  // matches, then you should first check if the first element is non-empty,
218
  // and if so just insert it and move the cursor to the end of the insertion.
219
  // The next tab will return an empty common substring, and a list of choices
220
  // (if any), at which point you should display the choices and let the user
221
  // type further to disambiguate.
222
223
#ifndef SWIG
224
  int HandleCompletion(const char *current_line, const char *cursor,
225
                       const char *last_char, int match_start_point,
226
                       int max_return_elements, lldb::SBStringList &matches);
227
#endif
228
229
  int HandleCompletion(const char *current_line, uint32_t cursor_pos,
230
                       int match_start_point, int max_return_elements,
231
                       lldb::SBStringList &matches);
232
233
  // Same as HandleCompletion, but also fills out `descriptions` with
234
  // descriptions for each match.
235
#ifndef SWIG
236
  int HandleCompletionWithDescriptions(
237
      const char *current_line, const char *cursor, const char *last_char,
238
      int match_start_point, int max_return_elements,
239
      lldb::SBStringList &matches, lldb::SBStringList &descriptions);
240
#endif
241
242
  int HandleCompletionWithDescriptions(const char *current_line,
243
                                       uint32_t cursor_pos,
244
                                       int match_start_point,
245
                                       int max_return_elements,
246
                                       lldb::SBStringList &matches,
247
                                       lldb::SBStringList &descriptions);
248
249
  /// Returns whether an interrupt flag was raised either by the SBDebugger - 
250
  /// when the function is not running on the RunCommandInterpreter thread, or
251
  /// by SBCommandInterpreter::InterruptCommand if it is.  If your code is doing
252
  /// interruptible work, check this API periodically, and interrupt if it 
253
  /// returns true.
254
  bool WasInterrupted() const;
255
  
256
  /// Interrupts the command currently executing in the RunCommandInterpreter
257
  /// thread.
258
  ///
259
  /// \return
260
  ///   \b true if there was a command in progress to recieve the interrupt.
261
  ///   \b false if there's no command currently in flight.
262
  bool InterruptCommand();
263
264
  // Catch commands before they execute by registering a callback that will get
265
  // called when the command gets executed. This allows GUI or command line
266
  // interfaces to intercept a command and stop it from happening
267
#ifndef SWIG
268
  bool SetCommandOverrideCallback(const char *command_name,
269
                                  lldb::CommandOverrideCallback callback,
270
                                  void *baton);
271
#endif
272
273
  /// Return true if the command interpreter is the active IO handler.
274
  ///
275
  /// This indicates that any input coming into the debugger handles will
276
  /// go to the command interpreter and will result in LLDB command line
277
  /// commands being executed.
278
  bool IsActive();
279
280
  /// Get the string that needs to be written to the debugger stdin file
281
  /// handle when a control character is typed.
282
  ///
283
  /// Some GUI programs will intercept "control + char" sequences and want
284
  /// to have them do what normally would happen when using a real
285
  /// terminal, so this function allows GUI programs to emulate this
286
  /// functionality.
287
  ///
288
  /// \param[in] ch
289
  ///     The character that was typed along with the control key
290
  ///
291
  /// \return
292
  ///     The string that should be written into the file handle that is
293
  ///     feeding the input stream for the debugger, or nullptr if there is
294
  ///     no string for this control key.
295
  const char *GetIOHandlerControlSequence(char ch);
296
297
  bool GetPromptOnQuit();
298
299
  void SetPromptOnQuit(bool b);
300
301
  /// Sets whether the command interpreter should allow custom exit codes
302
  /// for the 'quit' command.
303
  void AllowExitCodeOnQuit(bool allow);
304
305
  /// Returns true if the user has called the 'quit' command with a custom exit
306
  /// code.
307
  bool HasCustomQuitExitCode();
308
309
  /// Returns the exit code that the user has specified when running the
310
  /// 'quit' command. Returns 0 if the user hasn't called 'quit' at all or
311
  /// without a custom exit code.
312
  int GetQuitStatus();
313
314
  /// Resolve the command just as HandleCommand would, expanding abbreviations
315
  /// and aliases.  If successful, result->GetOutput has the full expansion.
316
  void ResolveCommand(const char *command_line, SBCommandReturnObject &result);
317
318
protected:
319
  friend class lldb_private::CommandPluginInterfaceImplementation;
320
321
  /// Access using SBDebugger::GetCommandInterpreter();
322
  SBCommandInterpreter(lldb_private::CommandInterpreter *interpreter_ptr);
323
  lldb_private::CommandInterpreter &ref();
324
325
  lldb_private::CommandInterpreter *get();
326
327
  void reset(lldb_private::CommandInterpreter *);
328
329
private:
330
  friend class SBDebugger;
331
332
  lldb_private::CommandInterpreter *m_opaque_ptr;
333
};
334
335
#ifndef SWIG
336
class SBCommandPluginInterface {
337
public:
338
3
  virtual ~SBCommandPluginInterface() = default;
339
340
  virtual bool DoExecute(lldb::SBDebugger /*debugger*/, char ** /*command*/,
341
0
                         lldb::SBCommandReturnObject & /*result*/) {
342
0
    return false;
343
0
  }
344
};
345
346
class SBCommand {
347
public:
348
  SBCommand();
349
350
  explicit operator bool() const;
351
352
  bool IsValid();
353
354
  const char *GetName();
355
356
  const char *GetHelp();
357
358
  const char *GetHelpLong();
359
360
  void SetHelp(const char *);
361
362
  void SetHelpLong(const char *);
363
364
  uint32_t GetFlags();
365
366
  void SetFlags(uint32_t flags);
367
368
  lldb::SBCommand AddMultiwordCommand(const char *name,
369
                                      const char *help = nullptr);
370
371
  /// Add a new subcommand to the lldb::SBCommand.
372
  ///
373
  /// The new command won't support autorepeat. If you need this functionality,
374
  /// use the override of this function that accepts the \a auto_repeat
375
  /// parameter.
376
  ///
377
  /// \param[in] name
378
  ///     The name of the command.
379
  ///
380
  /// \param[in] impl
381
  ///     The handler of this command.
382
  ///
383
  /// \param[in] help
384
  ///     The general description to show as part of the help message of this
385
  ///     command.
386
  ///
387
  /// \return
388
  ///     A lldb::SBCommand representing the newly created command.
389
  lldb::SBCommand AddCommand(const char *name,
390
                             lldb::SBCommandPluginInterface *impl,
391
                             const char *help = nullptr);
392
393
  /// Add a new subcommand to the lldb::SBCommand.
394
  ///
395
  /// The new command won't support autorepeat. If you need this functionality,
396
  /// use the override of this function that accepts the \a auto_repeat_command
397
  /// parameter.
398
  ///
399
  /// \param[in] name
400
  ///     The name of the command.
401
  ///
402
  /// \param[in] impl
403
  ///     The handler of this command.
404
  ///
405
  /// \param[in] help
406
  ///     The general description to show as part of the help message of this
407
  ///     command.
408
  ///
409
  /// \param[in] syntax
410
  ///     The syntax to show as part of the help message of this command. This
411
  ///     could include a description of the different arguments and flags this
412
  ///     command accepts.
413
  ///
414
  /// \return
415
  ///     A lldb::SBCommand representing the newly created command.
416
  lldb::SBCommand AddCommand(const char *name,
417
                             lldb::SBCommandPluginInterface *impl,
418
                             const char *help, const char *syntax);
419
420
  /// Add a new subcommand to the lldb::SBCommand.
421
  ///
422
  /// The new command won't support autorepeat. If you need this functionality,
423
  /// use the override of this function that accepts the \a auto_repeat_command
424
  /// parameter.
425
  ///
426
  /// \param[in] name
427
  ///     The name of the command.
428
  ///
429
  /// \param[in] impl
430
  ///     The handler of this command.
431
  ///
432
  /// \param[in] help
433
  ///     The general description to show as part of the help message of this
434
  ///     command.
435
  ///
436
  /// \param[in] syntax
437
  ///     The syntax to show as part of the help message of this command. This
438
  ///     could include a description of the different arguments and flags this
439
  ///     command accepts.
440
  ///
441
  /// \param[in] auto_repeat_command
442
  ///     Autorepeating is triggered when the user presses Enter successively
443
  ///     after executing a command. If \b nullptr is provided, the previous
444
  ///     exact command will be repeated. If \b "" is provided, autorepeating
445
  ///     is disabled. Otherwise, the provided string is used as a repeat
446
  ///     command.
447
  ///
448
  /// \return
449
  ///     A lldb::SBCommand representing the newly created command.
450
  lldb::SBCommand AddCommand(const char *name,
451
                             lldb::SBCommandPluginInterface *impl,
452
                             const char *help, const char *syntax,
453
                             const char *auto_repeat_command);
454
455
private:
456
  friend class SBDebugger;
457
  friend class SBCommandInterpreter;
458
459
  SBCommand(lldb::CommandObjectSP cmd_sp);
460
461
  lldb::CommandObjectSP m_opaque_sp;
462
};
463
#endif
464
465
} // namespace lldb
466
467
#endif // LLDB_API_SBCOMMANDINTERPRETER_H