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