180814287SRaphael Isemann //===-- SBCommandInterpreter.cpp ------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner
930fdc8d8SChris Lattner #include "lldb/lldb-types.h"
102c1f46dcSZachary Turner
1130fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
1221dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandObjectMultiword.h"
1330fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
1430fdc8d8SChris Lattner #include "lldb/Target/Target.h"
151755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
16181b823bSPavel Labath #include "lldb/Utility/Listener.h"
1730fdc8d8SChris Lattner
18ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h"
19ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h"
204b354039SJonas Devlieghere #include "lldb/API/SBCommandInterpreterRunOptions.h"
21b9c1b51eSKate Stone #include "lldb/API/SBCommandReturnObject.h"
22af10e1ceSIlia K #include "lldb/API/SBEvent.h"
23ffc9f1deSJim Ingham #include "lldb/API/SBExecutionContext.h"
24ca93cc1dSEli Friedman #include "lldb/API/SBListener.h"
25b9c1b51eSKate Stone #include "lldb/API/SBProcess.h"
26ceb6b139SCaroline Tice #include "lldb/API/SBStream.h"
27ca93cc1dSEli Friedman #include "lldb/API/SBStringList.h"
28b9c1b51eSKate Stone #include "lldb/API/SBTarget.h"
2930fdc8d8SChris Lattner
30796ac80bSJonas Devlieghere #include <memory>
31796ac80bSJonas Devlieghere
3230fdc8d8SChris Lattner using namespace lldb;
3330fdc8d8SChris Lattner using namespace lldb_private;
3430fdc8d8SChris Lattner
35b9c1b51eSKate Stone class CommandPluginInterfaceImplementation : public CommandObjectParsed {
3621dfcd9dSEnrico Granata public:
CommandPluginInterfaceImplementation(CommandInterpreter & interpreter,const char * name,lldb::SBCommandPluginInterface * backend,const char * help=nullptr,const char * syntax=nullptr,uint32_t flags=0,const char * auto_repeat_command="")3721dfcd9dSEnrico Granata CommandPluginInterfaceImplementation(CommandInterpreter &interpreter,
3821dfcd9dSEnrico Granata const char *name,
3921dfcd9dSEnrico Granata lldb::SBCommandPluginInterface *backend,
40dbb0abbfSEugene Zelenko const char *help = nullptr,
41dbb0abbfSEugene Zelenko const char *syntax = nullptr,
42be3f8a8eSWalter Erquinigo uint32_t flags = 0,
43be3f8a8eSWalter Erquinigo const char *auto_repeat_command = "")
44b9c1b51eSKate Stone : CommandObjectParsed(interpreter, name, help, syntax, flags),
45be3f8a8eSWalter Erquinigo m_backend(backend) {
46be3f8a8eSWalter Erquinigo m_auto_repeat_command =
47be3f8a8eSWalter Erquinigo auto_repeat_command == nullptr
48be3f8a8eSWalter Erquinigo ? llvm::None
49be3f8a8eSWalter Erquinigo : llvm::Optional<std::string>(auto_repeat_command);
50*c1b07d61SJim Ingham // We don't know whether any given command coming from this interface takes
51*c1b07d61SJim Ingham // arguments or not so here we're just disabling the basic args check.
52*c1b07d61SJim Ingham CommandArgumentData none_arg{eArgTypeNone, eArgRepeatStar};
53*c1b07d61SJim Ingham m_arguments.push_back({none_arg});
54be3f8a8eSWalter Erquinigo }
5521dfcd9dSEnrico Granata
IsRemovable() const56b9c1b51eSKate Stone bool IsRemovable() const override { return true; }
5721dfcd9dSEnrico Granata
58be3f8a8eSWalter Erquinigo /// More documentation is available in lldb::CommandObject::GetRepeatCommand,
59635f03feSJim Ingham /// but in short, if llvm::None is returned, the previous command will be
60be3f8a8eSWalter Erquinigo /// repeated, and if an empty string is returned, no commands will be
61be3f8a8eSWalter Erquinigo /// executed.
GetRepeatCommand(Args & current_command_args,uint32_t index)62635f03feSJim Ingham llvm::Optional<std::string> GetRepeatCommand(Args ¤t_command_args,
63be3f8a8eSWalter Erquinigo uint32_t index) override {
64be3f8a8eSWalter Erquinigo if (!m_auto_repeat_command)
65635f03feSJim Ingham return llvm::None;
66be3f8a8eSWalter Erquinigo else
67635f03feSJim Ingham return m_auto_repeat_command;
68be3f8a8eSWalter Erquinigo }
69be3f8a8eSWalter Erquinigo
7021dfcd9dSEnrico Granata protected:
DoExecute(Args & command,CommandReturnObject & result)71b9c1b51eSKate Stone bool DoExecute(Args &command, CommandReturnObject &result) override {
724112b473SJan Kratochvil SBCommandReturnObject sb_return(result);
7321dfcd9dSEnrico Granata SBCommandInterpreter sb_interpreter(&m_interpreter);
7421dfcd9dSEnrico Granata SBDebugger debugger_sb(m_interpreter.GetDebugger().shared_from_this());
75b9c1b51eSKate Stone bool ret = m_backend->DoExecute(
76fc1d95ebSRaphael Isemann debugger_sb, command.GetArgumentVector(), sb_return);
7721dfcd9dSEnrico Granata return ret;
7821dfcd9dSEnrico Granata }
79f605c198SAbhishek Aggarwal std::shared_ptr<lldb::SBCommandPluginInterface> m_backend;
80be3f8a8eSWalter Erquinigo llvm::Optional<std::string> m_auto_repeat_command;
8121dfcd9dSEnrico Granata };
8230fdc8d8SChris Lattner
SBCommandInterpreter(CommandInterpreter * interpreter)83b9c1b51eSKate Stone SBCommandInterpreter::SBCommandInterpreter(CommandInterpreter *interpreter)
84b9c1b51eSKate Stone : m_opaque_ptr(interpreter) {
851755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, interpreter);
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner
SBCommandInterpreter(const SBCommandInterpreter & rhs)88b9c1b51eSKate Stone SBCommandInterpreter::SBCommandInterpreter(const SBCommandInterpreter &rhs)
89baf5664fSJonas Devlieghere : m_opaque_ptr(rhs.m_opaque_ptr) {
901755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
91baf5664fSJonas Devlieghere }
92efabb123SGreg Clayton
93dbb0abbfSEugene Zelenko SBCommandInterpreter::~SBCommandInterpreter() = default;
94dbb0abbfSEugene Zelenko
95b9c1b51eSKate Stone const SBCommandInterpreter &SBCommandInterpreter::
operator =(const SBCommandInterpreter & rhs)96b9c1b51eSKate Stone operator=(const SBCommandInterpreter &rhs) {
971755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
98baf5664fSJonas Devlieghere
99efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr;
100d232abc3SJonas Devlieghere return *this;
101efabb123SGreg Clayton }
102efabb123SGreg Clayton
IsValid() const103baf5664fSJonas Devlieghere bool SBCommandInterpreter::IsValid() const {
1041755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1057f5237bcSPavel Labath return this->operator bool();
1067f5237bcSPavel Labath }
operator bool() const1077f5237bcSPavel Labath SBCommandInterpreter::operator bool() const {
1081755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
109baf5664fSJonas Devlieghere
110baf5664fSJonas Devlieghere return m_opaque_ptr != nullptr;
111baf5664fSJonas Devlieghere }
112b9c1b51eSKate Stone
CommandExists(const char * cmd)113b9c1b51eSKate Stone bool SBCommandInterpreter::CommandExists(const char *cmd) {
1141755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, cmd);
115baf5664fSJonas Devlieghere
116b9c1b51eSKate Stone return (((cmd != nullptr) && IsValid()) ? m_opaque_ptr->CommandExists(cmd)
117b9c1b51eSKate Stone : false);
1186611103cSGreg Clayton }
1196611103cSGreg Clayton
AliasExists(const char * cmd)120b9c1b51eSKate Stone bool SBCommandInterpreter::AliasExists(const char *cmd) {
1211755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, cmd);
122baf5664fSJonas Devlieghere
123b9c1b51eSKate Stone return (((cmd != nullptr) && IsValid()) ? m_opaque_ptr->AliasExists(cmd)
124b9c1b51eSKate Stone : false);
12530fdc8d8SChris Lattner }
12630fdc8d8SChris Lattner
IsActive()127b9c1b51eSKate Stone bool SBCommandInterpreter::IsActive() {
1281755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
129baf5664fSJonas Devlieghere
130dbb0abbfSEugene Zelenko return (IsValid() ? m_opaque_ptr->IsActive() : false);
13144d93782SGreg Clayton }
13244d93782SGreg Clayton
WasInterrupted() const13317ffd39eSLeonard Mosescu bool SBCommandInterpreter::WasInterrupted() const {
1341755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
135baf5664fSJonas Devlieghere
13617ffd39eSLeonard Mosescu return (IsValid() ? m_opaque_ptr->WasInterrupted() : false);
13717ffd39eSLeonard Mosescu }
13817ffd39eSLeonard Mosescu
GetIOHandlerControlSequence(char ch)139b9c1b51eSKate Stone const char *SBCommandInterpreter::GetIOHandlerControlSequence(char ch) {
1401755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, ch);
141baf5664fSJonas Devlieghere
142b9c1b51eSKate Stone return (IsValid()
143b9c1b51eSKate Stone ? m_opaque_ptr->GetDebugger()
144b9c1b51eSKate Stone .GetTopIOHandlerControlSequence(ch)
145b9c1b51eSKate Stone .GetCString()
146b9c1b51eSKate Stone : nullptr);
14744d93782SGreg Clayton }
14844d93782SGreg Clayton
14930fdc8d8SChris Lattner lldb::ReturnStatus
HandleCommand(const char * command_line,SBCommandReturnObject & result,bool add_to_history)150b9c1b51eSKate Stone SBCommandInterpreter::HandleCommand(const char *command_line,
151b9c1b51eSKate Stone SBCommandReturnObject &result,
152b9c1b51eSKate Stone bool add_to_history) {
1531755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, command_line, result, add_to_history);
154baf5664fSJonas Devlieghere
155ffc9f1deSJim Ingham SBExecutionContext sb_exe_ctx;
156ffc9f1deSJim Ingham return HandleCommand(command_line, sb_exe_ctx, result, add_to_history);
157ffc9f1deSJim Ingham }
158ffc9f1deSJim Ingham
HandleCommand(const char * command_line,SBExecutionContext & override_context,SBCommandReturnObject & result,bool add_to_history)159b9c1b51eSKate Stone lldb::ReturnStatus SBCommandInterpreter::HandleCommand(
160b9c1b51eSKate Stone const char *command_line, SBExecutionContext &override_context,
161b9c1b51eSKate Stone SBCommandReturnObject &result, bool add_to_history) {
1621755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, command_line, override_context, result,
1631755f5b1SJonas Devlieghere add_to_history);
164baf5664fSJonas Devlieghere
16530fdc8d8SChris Lattner result.Clear();
166b9c1b51eSKate Stone if (command_line && IsValid()) {
16745a44f3cSGreg Clayton result.ref().SetInteractive(false);
16836de94cfSTatyana Krasnukha auto do_add_to_history = add_to_history ? eLazyBoolYes : eLazyBoolNo;
16936de94cfSTatyana Krasnukha if (override_context.get())
17036de94cfSTatyana Krasnukha m_opaque_ptr->HandleCommand(command_line, do_add_to_history,
17136de94cfSTatyana Krasnukha override_context.get()->Lock(true),
17236de94cfSTatyana Krasnukha result.ref());
17336de94cfSTatyana Krasnukha else
17436de94cfSTatyana Krasnukha m_opaque_ptr->HandleCommand(command_line, do_add_to_history,
17536de94cfSTatyana Krasnukha result.ref());
176b9c1b51eSKate Stone } else {
177b9c1b51eSKate Stone result->AppendError(
178b9c1b51eSKate Stone "SBCommandInterpreter or the command line is not valid");
1796611103cSGreg Clayton }
180ceb6b139SCaroline Tice
18130fdc8d8SChris Lattner return result.GetStatus();
18230fdc8d8SChris Lattner }
18330fdc8d8SChris Lattner
HandleCommandsFromFile(lldb::SBFileSpec & file,lldb::SBExecutionContext & override_context,lldb::SBCommandInterpreterRunOptions & options,lldb::SBCommandReturnObject result)184b9c1b51eSKate Stone void SBCommandInterpreter::HandleCommandsFromFile(
185b9c1b51eSKate Stone lldb::SBFileSpec &file, lldb::SBExecutionContext &override_context,
186ffc9f1deSJim Ingham lldb::SBCommandInterpreterRunOptions &options,
187b9c1b51eSKate Stone lldb::SBCommandReturnObject result) {
1881755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, file, override_context, options, result);
189baf5664fSJonas Devlieghere
190b9c1b51eSKate Stone if (!IsValid()) {
191ffc9f1deSJim Ingham result->AppendError("SBCommandInterpreter is not valid.");
192ffc9f1deSJim Ingham return;
193ffc9f1deSJim Ingham }
194ffc9f1deSJim Ingham
195b9c1b51eSKate Stone if (!file.IsValid()) {
196ffc9f1deSJim Ingham SBStream s;
197ffc9f1deSJim Ingham file.GetDescription(s);
198ffc9f1deSJim Ingham result->AppendErrorWithFormat("File is not valid: %s.", s.GetData());
199ffc9f1deSJim Ingham }
200ffc9f1deSJim Ingham
201ffc9f1deSJim Ingham FileSpec tmp_spec = file.ref();
20236de94cfSTatyana Krasnukha if (override_context.get())
20336de94cfSTatyana Krasnukha m_opaque_ptr->HandleCommandsFromFile(tmp_spec,
20436de94cfSTatyana Krasnukha override_context.get()->Lock(true),
20536de94cfSTatyana Krasnukha options.ref(),
206122a4ebdSPavel Labath result.ref());
20736de94cfSTatyana Krasnukha
20836de94cfSTatyana Krasnukha else
20936de94cfSTatyana Krasnukha m_opaque_ptr->HandleCommandsFromFile(tmp_spec, options.ref(), result.ref());
210ffc9f1deSJim Ingham }
211ffc9f1deSJim Ingham
HandleCompletion(const char * current_line,const char * cursor,const char * last_char,int match_start_point,int max_return_elements,SBStringList & matches)212b9c1b51eSKate Stone int SBCommandInterpreter::HandleCompletion(
213b9c1b51eSKate Stone const char *current_line, const char *cursor, const char *last_char,
214b9c1b51eSKate Stone int match_start_point, int max_return_elements, SBStringList &matches) {
2151755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, current_line, cursor, last_char, match_start_point,
216baf5664fSJonas Devlieghere max_return_elements, matches);
217baf5664fSJonas Devlieghere
2187f88829cSRaphael Isemann SBStringList dummy_descriptions;
2197f88829cSRaphael Isemann return HandleCompletionWithDescriptions(
2207f88829cSRaphael Isemann current_line, cursor, last_char, match_start_point, max_return_elements,
2217f88829cSRaphael Isemann matches, dummy_descriptions);
2227f88829cSRaphael Isemann }
2237f88829cSRaphael Isemann
HandleCompletionWithDescriptions(const char * current_line,const char * cursor,const char * last_char,int match_start_point,int max_return_elements,SBStringList & matches,SBStringList & descriptions)2247f88829cSRaphael Isemann int SBCommandInterpreter::HandleCompletionWithDescriptions(
2257f88829cSRaphael Isemann const char *current_line, const char *cursor, const char *last_char,
2267f88829cSRaphael Isemann int match_start_point, int max_return_elements, SBStringList &matches,
2277f88829cSRaphael Isemann SBStringList &descriptions) {
2281755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, current_line, cursor, last_char, match_start_point,
229baf5664fSJonas Devlieghere max_return_elements, matches, descriptions);
230baf5664fSJonas Devlieghere
23105097246SAdrian Prantl // Sanity check the arguments that are passed in: cursor & last_char have to
23205097246SAdrian Prantl // be within the current_line.
233dbb0abbfSEugene Zelenko if (current_line == nullptr || cursor == nullptr || last_char == nullptr)
234ac012605SJim Ingham return 0;
235ac012605SJim Ingham
236ac012605SJim Ingham if (cursor < current_line || last_char < current_line)
237ac012605SJim Ingham return 0;
238ac012605SJim Ingham
239ac012605SJim Ingham size_t current_line_size = strlen(current_line);
2403985c8c6SSaleem Abdulrasool if (cursor - current_line > static_cast<ptrdiff_t>(current_line_size) ||
2413985c8c6SSaleem Abdulrasool last_char - current_line > static_cast<ptrdiff_t>(current_line_size))
242ac012605SJim Ingham return 0;
243ac012605SJim Ingham
244ae34ed2cSRaphael Isemann if (!IsValid())
245ae34ed2cSRaphael Isemann return 0;
246389512dcSJim Ingham
2477f88829cSRaphael Isemann lldb_private::StringList lldb_matches, lldb_descriptions;
2482fc20f65SRaphael Isemann CompletionResult result;
2492fc20f65SRaphael Isemann CompletionRequest request(current_line, cursor - current_line, result);
250ae34ed2cSRaphael Isemann m_opaque_ptr->HandleCompletion(request);
2512fc20f65SRaphael Isemann result.GetMatches(lldb_matches);
2522fc20f65SRaphael Isemann result.GetDescriptions(lldb_descriptions);
25330fdc8d8SChris Lattner
254ae34ed2cSRaphael Isemann // Make the result array indexed from 1 again by adding the 'common prefix'
255ae34ed2cSRaphael Isemann // of all completions as element 0. This is done to emulate the old API.
256ae34ed2cSRaphael Isemann if (request.GetParsedLine().GetArgumentCount() == 0) {
257ae34ed2cSRaphael Isemann // If we got an empty string, insert nothing.
258ae34ed2cSRaphael Isemann lldb_matches.InsertStringAtIndex(0, "");
259ae34ed2cSRaphael Isemann lldb_descriptions.InsertStringAtIndex(0, "");
260ae34ed2cSRaphael Isemann } else {
261ae34ed2cSRaphael Isemann // Now figure out if there is a common substring, and if so put that in
262ae34ed2cSRaphael Isemann // element 0, otherwise put an empty string in element 0.
263ae34ed2cSRaphael Isemann std::string command_partial_str = request.GetCursorArgumentPrefix().str();
264ae34ed2cSRaphael Isemann
265ae34ed2cSRaphael Isemann std::string common_prefix = lldb_matches.LongestCommonPrefix();
266ae34ed2cSRaphael Isemann const size_t partial_name_len = command_partial_str.size();
267ae34ed2cSRaphael Isemann common_prefix.erase(0, partial_name_len);
268ae34ed2cSRaphael Isemann
269ae34ed2cSRaphael Isemann // If we matched a unique single command, add a space... Only do this if
270ae34ed2cSRaphael Isemann // the completer told us this was a complete word, however...
271ae34ed2cSRaphael Isemann if (lldb_matches.GetSize() == 1) {
272a024f5e3SRaphael Isemann char quote_char = request.GetParsedArg().GetQuoteChar();
273ae34ed2cSRaphael Isemann common_prefix =
274ae34ed2cSRaphael Isemann Args::EscapeLLDBCommandArgument(common_prefix, quote_char);
275ae34ed2cSRaphael Isemann if (request.GetParsedArg().IsQuoted())
276ae34ed2cSRaphael Isemann common_prefix.push_back(quote_char);
277ae34ed2cSRaphael Isemann common_prefix.push_back(' ');
278ae34ed2cSRaphael Isemann }
279ae34ed2cSRaphael Isemann lldb_matches.InsertStringAtIndex(0, common_prefix.c_str());
280ae34ed2cSRaphael Isemann lldb_descriptions.InsertStringAtIndex(0, "");
281ae34ed2cSRaphael Isemann }
282ae34ed2cSRaphael Isemann
2837f88829cSRaphael Isemann SBStringList temp_matches_list(&lldb_matches);
2847f88829cSRaphael Isemann matches.AppendList(temp_matches_list);
2857f88829cSRaphael Isemann SBStringList temp_descriptions_list(&lldb_descriptions);
2867f88829cSRaphael Isemann descriptions.AppendList(temp_descriptions_list);
287ae34ed2cSRaphael Isemann return result.GetNumberOfResults();
28830fdc8d8SChris Lattner }
28930fdc8d8SChris Lattner
HandleCompletionWithDescriptions(const char * current_line,uint32_t cursor_pos,int match_start_point,int max_return_elements,SBStringList & matches,SBStringList & descriptions)2907f88829cSRaphael Isemann int SBCommandInterpreter::HandleCompletionWithDescriptions(
2917f88829cSRaphael Isemann const char *current_line, uint32_t cursor_pos, int match_start_point,
2927f88829cSRaphael Isemann int max_return_elements, SBStringList &matches,
2937f88829cSRaphael Isemann SBStringList &descriptions) {
2941755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, current_line, cursor_pos, match_start_point,
295baf5664fSJonas Devlieghere max_return_elements, matches, descriptions);
296baf5664fSJonas Devlieghere
2977f88829cSRaphael Isemann const char *cursor = current_line + cursor_pos;
2987f88829cSRaphael Isemann const char *last_char = current_line + strlen(current_line);
2997f88829cSRaphael Isemann return HandleCompletionWithDescriptions(
3007f88829cSRaphael Isemann current_line, cursor, last_char, match_start_point, max_return_elements,
3017f88829cSRaphael Isemann matches, descriptions);
3027f88829cSRaphael Isemann }
3037f88829cSRaphael Isemann
HandleCompletion(const char * current_line,uint32_t cursor_pos,int match_start_point,int max_return_elements,lldb::SBStringList & matches)304b9c1b51eSKate Stone int SBCommandInterpreter::HandleCompletion(const char *current_line,
305969795f1SJim Ingham uint32_t cursor_pos,
306969795f1SJim Ingham int match_start_point,
307969795f1SJim Ingham int max_return_elements,
308b9c1b51eSKate Stone lldb::SBStringList &matches) {
3091755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, current_line, cursor_pos, match_start_point,
310baf5664fSJonas Devlieghere max_return_elements, matches);
311baf5664fSJonas Devlieghere
312969795f1SJim Ingham const char *cursor = current_line + cursor_pos;
313969795f1SJim Ingham const char *last_char = current_line + strlen(current_line);
314b9c1b51eSKate Stone return HandleCompletion(current_line, cursor, last_char, match_start_point,
315b9c1b51eSKate Stone max_return_elements, matches);
316969795f1SJim Ingham }
317969795f1SJim Ingham
HasCommands()318b9c1b51eSKate Stone bool SBCommandInterpreter::HasCommands() {
3191755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
320baf5664fSJonas Devlieghere
321dbb0abbfSEugene Zelenko return (IsValid() ? m_opaque_ptr->HasCommands() : false);
32230fdc8d8SChris Lattner }
32330fdc8d8SChris Lattner
HasAliases()324b9c1b51eSKate Stone bool SBCommandInterpreter::HasAliases() {
3251755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
326baf5664fSJonas Devlieghere
327dbb0abbfSEugene Zelenko return (IsValid() ? m_opaque_ptr->HasAliases() : false);
32830fdc8d8SChris Lattner }
32930fdc8d8SChris Lattner
HasAliasOptions()330b9c1b51eSKate Stone bool SBCommandInterpreter::HasAliasOptions() {
3311755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
332baf5664fSJonas Devlieghere
333dbb0abbfSEugene Zelenko return (IsValid() ? m_opaque_ptr->HasAliasOptions() : false);
33430fdc8d8SChris Lattner }
33530fdc8d8SChris Lattner
IsInteractive()3367f3fc2eeSMed Ismail Bennani bool SBCommandInterpreter::IsInteractive() {
3377f3fc2eeSMed Ismail Bennani LLDB_INSTRUMENT_VA(this);
3387f3fc2eeSMed Ismail Bennani
3397f3fc2eeSMed Ismail Bennani return (IsValid() ? m_opaque_ptr->IsInteractive() : false);
3407f3fc2eeSMed Ismail Bennani }
3417f3fc2eeSMed Ismail Bennani
GetProcess()342b9c1b51eSKate Stone SBProcess SBCommandInterpreter::GetProcess() {
3431755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
344baf5664fSJonas Devlieghere
345b9556accSGreg Clayton SBProcess sb_process;
346b9556accSGreg Clayton ProcessSP process_sp;
347b9c1b51eSKate Stone if (IsValid()) {
348af67cecdSGreg Clayton TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
349b9c1b51eSKate Stone if (target_sp) {
350bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
351b9556accSGreg Clayton process_sp = target_sp->GetProcessSP();
352b9556accSGreg Clayton sb_process.SetSP(process_sp);
353af67cecdSGreg Clayton }
35430fdc8d8SChris Lattner }
3554838131bSGreg Clayton
356d232abc3SJonas Devlieghere return sb_process;
35730fdc8d8SChris Lattner }
35830fdc8d8SChris Lattner
GetDebugger()359b9c1b51eSKate Stone SBDebugger SBCommandInterpreter::GetDebugger() {
3601755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
361baf5664fSJonas Devlieghere
36221dfcd9dSEnrico Granata SBDebugger sb_debugger;
363dbb0abbfSEugene Zelenko if (IsValid())
36421dfcd9dSEnrico Granata sb_debugger.reset(m_opaque_ptr->GetDebugger().shared_from_this());
36521dfcd9dSEnrico Granata
366d232abc3SJonas Devlieghere return sb_debugger;
36721dfcd9dSEnrico Granata }
36821dfcd9dSEnrico Granata
GetPromptOnQuit()369b9c1b51eSKate Stone bool SBCommandInterpreter::GetPromptOnQuit() {
3701755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
371baf5664fSJonas Devlieghere
372dbb0abbfSEugene Zelenko return (IsValid() ? m_opaque_ptr->GetPromptOnQuit() : false);
373acf28beaSIlia K }
374acf28beaSIlia K
SetPromptOnQuit(bool b)375b9c1b51eSKate Stone void SBCommandInterpreter::SetPromptOnQuit(bool b) {
3761755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, b);
377baf5664fSJonas Devlieghere
378dbb0abbfSEugene Zelenko if (IsValid())
379acf28beaSIlia K m_opaque_ptr->SetPromptOnQuit(b);
380acf28beaSIlia K }
381acf28beaSIlia K
AllowExitCodeOnQuit(bool allow)382c094d23fSRaphael Isemann void SBCommandInterpreter::AllowExitCodeOnQuit(bool allow) {
3831755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, allow);
384baf5664fSJonas Devlieghere
385c094d23fSRaphael Isemann if (m_opaque_ptr)
386c094d23fSRaphael Isemann m_opaque_ptr->AllowExitCodeOnQuit(allow);
387c094d23fSRaphael Isemann }
388c094d23fSRaphael Isemann
HasCustomQuitExitCode()389c094d23fSRaphael Isemann bool SBCommandInterpreter::HasCustomQuitExitCode() {
3901755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
391baf5664fSJonas Devlieghere
392c094d23fSRaphael Isemann bool exited = false;
393c094d23fSRaphael Isemann if (m_opaque_ptr)
394c094d23fSRaphael Isemann m_opaque_ptr->GetQuitExitCode(exited);
395c094d23fSRaphael Isemann return exited;
396c094d23fSRaphael Isemann }
397c094d23fSRaphael Isemann
GetQuitStatus()398c094d23fSRaphael Isemann int SBCommandInterpreter::GetQuitStatus() {
3991755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
400baf5664fSJonas Devlieghere
401c094d23fSRaphael Isemann bool exited = false;
402c094d23fSRaphael Isemann return (m_opaque_ptr ? m_opaque_ptr->GetQuitExitCode(exited) : 0);
403c094d23fSRaphael Isemann }
404c094d23fSRaphael Isemann
ResolveCommand(const char * command_line,SBCommandReturnObject & result)405b9c1b51eSKate Stone void SBCommandInterpreter::ResolveCommand(const char *command_line,
406b9c1b51eSKate Stone SBCommandReturnObject &result) {
4071755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, command_line, result);
408baf5664fSJonas Devlieghere
4092304b6ffSAdrian McCarthy result.Clear();
410b9c1b51eSKate Stone if (command_line && IsValid()) {
4112304b6ffSAdrian McCarthy m_opaque_ptr->ResolveCommand(command_line, result.ref());
412b9c1b51eSKate Stone } else {
413b9c1b51eSKate Stone result->AppendError(
414b9c1b51eSKate Stone "SBCommandInterpreter or the command line is not valid");
4152304b6ffSAdrian McCarthy }
4162304b6ffSAdrian McCarthy }
4172304b6ffSAdrian McCarthy
get()418b9c1b51eSKate Stone CommandInterpreter *SBCommandInterpreter::get() { return m_opaque_ptr; }
41930fdc8d8SChris Lattner
ref()420b9c1b51eSKate Stone CommandInterpreter &SBCommandInterpreter::ref() {
4216611103cSGreg Clayton assert(m_opaque_ptr);
4226611103cSGreg Clayton return *m_opaque_ptr;
4236611103cSGreg Clayton }
4246611103cSGreg Clayton
reset(lldb_private::CommandInterpreter * interpreter)425b9c1b51eSKate Stone void SBCommandInterpreter::reset(
426b9c1b51eSKate Stone lldb_private::CommandInterpreter *interpreter) {
4276611103cSGreg Clayton m_opaque_ptr = interpreter;
42830fdc8d8SChris Lattner }
42930fdc8d8SChris Lattner
SourceInitFileInGlobalDirectory(SBCommandReturnObject & result)4306c99a346SPavel Labath void SBCommandInterpreter::SourceInitFileInGlobalDirectory(
4316c99a346SPavel Labath SBCommandReturnObject &result) {
4326c99a346SPavel Labath LLDB_INSTRUMENT_VA(this, result);
4336c99a346SPavel Labath
4346c99a346SPavel Labath result.Clear();
4356c99a346SPavel Labath if (IsValid()) {
4366c99a346SPavel Labath TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
4376c99a346SPavel Labath std::unique_lock<std::recursive_mutex> lock;
4386c99a346SPavel Labath if (target_sp)
4396c99a346SPavel Labath lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
4406c99a346SPavel Labath m_opaque_ptr->SourceInitFileGlobal(result.ref());
4416c99a346SPavel Labath } else {
4426c99a346SPavel Labath result->AppendError("SBCommandInterpreter is not valid");
4436c99a346SPavel Labath }
4446c99a346SPavel Labath }
4456c99a346SPavel Labath
SourceInitFileInHomeDirectory(SBCommandReturnObject & result)446b9c1b51eSKate Stone void SBCommandInterpreter::SourceInitFileInHomeDirectory(
447b9c1b51eSKate Stone SBCommandReturnObject &result) {
4481755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, result);
449baf5664fSJonas Devlieghere
45096000f5cSPavel Labath SourceInitFileInHomeDirectory(result, /*is_repl=*/false);
45130fdc8d8SChris Lattner }
45230fdc8d8SChris Lattner
SourceInitFileInHomeDirectory(SBCommandReturnObject & result,bool is_repl)453868b45b5SMed Ismail Bennani void SBCommandInterpreter::SourceInitFileInHomeDirectory(
454868b45b5SMed Ismail Bennani SBCommandReturnObject &result, bool is_repl) {
4551755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, result, is_repl);
456868b45b5SMed Ismail Bennani
457868b45b5SMed Ismail Bennani result.Clear();
458868b45b5SMed Ismail Bennani if (IsValid()) {
459868b45b5SMed Ismail Bennani TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
460868b45b5SMed Ismail Bennani std::unique_lock<std::recursive_mutex> lock;
461868b45b5SMed Ismail Bennani if (target_sp)
462868b45b5SMed Ismail Bennani lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
463868b45b5SMed Ismail Bennani m_opaque_ptr->SourceInitFileHome(result.ref(), is_repl);
464868b45b5SMed Ismail Bennani } else {
465868b45b5SMed Ismail Bennani result->AppendError("SBCommandInterpreter is not valid");
466868b45b5SMed Ismail Bennani }
467868b45b5SMed Ismail Bennani }
468868b45b5SMed Ismail Bennani
SourceInitFileInCurrentWorkingDirectory(SBCommandReturnObject & result)469b9c1b51eSKate Stone void SBCommandInterpreter::SourceInitFileInCurrentWorkingDirectory(
470b9c1b51eSKate Stone SBCommandReturnObject &result) {
4711755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, result);
472baf5664fSJonas Devlieghere
47330fdc8d8SChris Lattner result.Clear();
474b9c1b51eSKate Stone if (IsValid()) {
475af67cecdSGreg Clayton TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
476bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
477af67cecdSGreg Clayton if (target_sp)
478bb19a13cSSaleem Abdulrasool lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
4792fc6b024SJonas Devlieghere m_opaque_ptr->SourceInitFileCwd(result.ref());
480b9c1b51eSKate Stone } else {
4816611103cSGreg Clayton result->AppendError("SBCommandInterpreter is not valid");
4826611103cSGreg Clayton }
48330fdc8d8SChris Lattner }
48430fdc8d8SChris Lattner
GetBroadcaster()485b9c1b51eSKate Stone SBBroadcaster SBCommandInterpreter::GetBroadcaster() {
4861755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
487ceb6b139SCaroline Tice
4886611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_ptr, false);
489ceb6b139SCaroline Tice
490d232abc3SJonas Devlieghere return broadcaster;
49130fdc8d8SChris Lattner }
49230fdc8d8SChris Lattner
GetBroadcasterClass()493b9c1b51eSKate Stone const char *SBCommandInterpreter::GetBroadcasterClass() {
4941755f5b1SJonas Devlieghere LLDB_INSTRUMENT();
495baf5664fSJonas Devlieghere
4968a00a562SIlia K return CommandInterpreter::GetStaticBroadcasterClass().AsCString();
4974bddaeb5SJim Ingham }
4984bddaeb5SJim Ingham
GetArgumentTypeAsCString(const lldb::CommandArgumentType arg_type)499b9c1b51eSKate Stone const char *SBCommandInterpreter::GetArgumentTypeAsCString(
500b9c1b51eSKate Stone const lldb::CommandArgumentType arg_type) {
5011755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(arg_type);
502baf5664fSJonas Devlieghere
5039d0402b1SGreg Clayton return CommandObject::GetArgumentTypeAsCString(arg_type);
5049d0402b1SGreg Clayton }
5059d0402b1SGreg Clayton
GetArgumentDescriptionAsCString(const lldb::CommandArgumentType arg_type)506b9c1b51eSKate Stone const char *SBCommandInterpreter::GetArgumentDescriptionAsCString(
507b9c1b51eSKate Stone const lldb::CommandArgumentType arg_type) {
5081755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(arg_type);
509baf5664fSJonas Devlieghere
5109d0402b1SGreg Clayton return CommandObject::GetArgumentDescriptionAsCString(arg_type);
5119d0402b1SGreg Clayton }
5129d0402b1SGreg Clayton
EventIsCommandInterpreterEvent(const lldb::SBEvent & event)513b9c1b51eSKate Stone bool SBCommandInterpreter::EventIsCommandInterpreterEvent(
514b9c1b51eSKate Stone const lldb::SBEvent &event) {
5151755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event);
516baf5664fSJonas Devlieghere
517b9c1b51eSKate Stone return event.GetBroadcasterClass() ==
518b9c1b51eSKate Stone SBCommandInterpreter::GetBroadcasterClass();
519af10e1ceSIlia K }
520af10e1ceSIlia K
SetCommandOverrideCallback(const char * command_name,lldb::CommandOverrideCallback callback,void * baton)521b9c1b51eSKate Stone bool SBCommandInterpreter::SetCommandOverrideCallback(
522b9c1b51eSKate Stone const char *command_name, lldb::CommandOverrideCallback callback,
523b9c1b51eSKate Stone void *baton) {
5241755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, command_name, callback, baton);
5250d7b0c96SJonas Devlieghere
526b9c1b51eSKate Stone if (command_name && command_name[0] && IsValid()) {
527a01bccdbSZachary Turner llvm::StringRef command_name_str = command_name;
528b9c1b51eSKate Stone CommandObject *cmd_obj =
529b9c1b51eSKate Stone m_opaque_ptr->GetCommandObjectForCommand(command_name_str);
530b9c1b51eSKate Stone if (cmd_obj) {
531af6f2755SGreg Clayton assert(command_name_str.empty());
532a9f7b79dSGreg Clayton cmd_obj->SetOverrideCallback(callback, baton);
533a9f7b79dSGreg Clayton return true;
534a9f7b79dSGreg Clayton }
535a9f7b79dSGreg Clayton }
536a9f7b79dSGreg Clayton return false;
537a9f7b79dSGreg Clayton }
5389d0402b1SGreg Clayton
AddMultiwordCommand(const char * name,const char * help)539b9c1b51eSKate Stone lldb::SBCommand SBCommandInterpreter::AddMultiwordCommand(const char *name,
540b9c1b51eSKate Stone const char *help) {
5411755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, help);
542baf5664fSJonas Devlieghere
543c5011aedSJim Ingham lldb::CommandObjectSP new_command_sp(
544c5011aedSJim Ingham new CommandObjectMultiword(*m_opaque_ptr, name, help));
545c5011aedSJim Ingham new_command_sp->GetAsMultiwordCommand()->SetRemovable(true);
546c5011aedSJim Ingham Status add_error = m_opaque_ptr->AddUserCommand(name, new_command_sp, true);
547c5011aedSJim Ingham if (add_error.Success())
548d232abc3SJonas Devlieghere return lldb::SBCommand(new_command_sp);
549d232abc3SJonas Devlieghere return lldb::SBCommand();
550b9c1b51eSKate Stone }
551b9c1b51eSKate Stone
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help)552b9c1b51eSKate Stone lldb::SBCommand SBCommandInterpreter::AddCommand(
553b9c1b51eSKate Stone const char *name, lldb::SBCommandPluginInterface *impl, const char *help) {
5541755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, impl, help);
555baf5664fSJonas Devlieghere
556d232abc3SJonas Devlieghere return AddCommand(name, impl, help, /*syntax=*/nullptr,
557d232abc3SJonas Devlieghere /*auto_repeat_command=*/"");
55821dfcd9dSEnrico Granata }
55921dfcd9dSEnrico Granata
56021dfcd9dSEnrico Granata lldb::SBCommand
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help,const char * syntax)561b9c1b51eSKate Stone SBCommandInterpreter::AddCommand(const char *name,
562b9c1b51eSKate Stone lldb::SBCommandPluginInterface *impl,
563b9c1b51eSKate Stone const char *help, const char *syntax) {
5641755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, impl, help, syntax);
565d232abc3SJonas Devlieghere return AddCommand(name, impl, help, syntax, /*auto_repeat_command=*/"");
566be3f8a8eSWalter Erquinigo }
567be3f8a8eSWalter Erquinigo
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help,const char * syntax,const char * auto_repeat_command)568be3f8a8eSWalter Erquinigo lldb::SBCommand SBCommandInterpreter::AddCommand(
569be3f8a8eSWalter Erquinigo const char *name, lldb::SBCommandPluginInterface *impl, const char *help,
570be3f8a8eSWalter Erquinigo const char *syntax, const char *auto_repeat_command) {
5711755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, impl, help, syntax, auto_repeat_command);
572baf5664fSJonas Devlieghere
57321dfcd9dSEnrico Granata lldb::CommandObjectSP new_command_sp;
574796ac80bSJonas Devlieghere new_command_sp = std::make_shared<CommandPluginInterfaceImplementation>(
575be3f8a8eSWalter Erquinigo *m_opaque_ptr, name, impl, help, syntax, /*flags=*/0,
576be3f8a8eSWalter Erquinigo auto_repeat_command);
57721dfcd9dSEnrico Granata
578c5011aedSJim Ingham Status add_error = m_opaque_ptr->AddUserCommand(name, new_command_sp, true);
579c5011aedSJim Ingham if (add_error.Success())
580d232abc3SJonas Devlieghere return lldb::SBCommand(new_command_sp);
581d232abc3SJonas Devlieghere return lldb::SBCommand();
582f605c198SAbhishek Aggarwal }
583f605c198SAbhishek Aggarwal
SBCommand()5841755f5b1SJonas Devlieghere SBCommand::SBCommand() { LLDB_INSTRUMENT_VA(this); }
58521dfcd9dSEnrico Granata
SBCommand(lldb::CommandObjectSP cmd_sp)586b9c1b51eSKate Stone SBCommand::SBCommand(lldb::CommandObjectSP cmd_sp) : m_opaque_sp(cmd_sp) {}
58721dfcd9dSEnrico Granata
IsValid()588baf5664fSJonas Devlieghere bool SBCommand::IsValid() {
5891755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
5907f5237bcSPavel Labath return this->operator bool();
5917f5237bcSPavel Labath }
operator bool() const5927f5237bcSPavel Labath SBCommand::operator bool() const {
5931755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
594baf5664fSJonas Devlieghere
595baf5664fSJonas Devlieghere return m_opaque_sp.get() != nullptr;
596baf5664fSJonas Devlieghere }
59721dfcd9dSEnrico Granata
GetName()598b9c1b51eSKate Stone const char *SBCommand::GetName() {
5991755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
600baf5664fSJonas Devlieghere
601a449698cSZachary Turner return (IsValid() ? ConstString(m_opaque_sp->GetCommandName()).AsCString() : nullptr);
60221dfcd9dSEnrico Granata }
60321dfcd9dSEnrico Granata
GetHelp()604b9c1b51eSKate Stone const char *SBCommand::GetHelp() {
6051755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
606baf5664fSJonas Devlieghere
607442f6530SZachary Turner return (IsValid() ? ConstString(m_opaque_sp->GetHelp()).AsCString()
608442f6530SZachary Turner : nullptr);
60921dfcd9dSEnrico Granata }
61021dfcd9dSEnrico Granata
GetHelpLong()611b9c1b51eSKate Stone const char *SBCommand::GetHelpLong() {
6121755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
613baf5664fSJonas Devlieghere
614442f6530SZachary Turner return (IsValid() ? ConstString(m_opaque_sp->GetHelpLong()).AsCString()
615442f6530SZachary Turner : nullptr);
616cc342da5SEnrico Granata }
617cc342da5SEnrico Granata
SetHelp(const char * help)618b9c1b51eSKate Stone void SBCommand::SetHelp(const char *help) {
6191755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, help);
620baf5664fSJonas Devlieghere
621cc342da5SEnrico Granata if (IsValid())
622cc342da5SEnrico Granata m_opaque_sp->SetHelp(help);
623cc342da5SEnrico Granata }
624cc342da5SEnrico Granata
SetHelpLong(const char * help)625b9c1b51eSKate Stone void SBCommand::SetHelpLong(const char *help) {
6261755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, help);
627baf5664fSJonas Devlieghere
628cc342da5SEnrico Granata if (IsValid())
629cc342da5SEnrico Granata m_opaque_sp->SetHelpLong(help);
630cc342da5SEnrico Granata }
631cc342da5SEnrico Granata
AddMultiwordCommand(const char * name,const char * help)632b9c1b51eSKate Stone lldb::SBCommand SBCommand::AddMultiwordCommand(const char *name,
633b9c1b51eSKate Stone const char *help) {
6341755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, help);
635baf5664fSJonas Devlieghere
63621dfcd9dSEnrico Granata if (!IsValid())
637d232abc3SJonas Devlieghere return lldb::SBCommand();
638dbb0abbfSEugene Zelenko if (!m_opaque_sp->IsMultiwordObject())
639d232abc3SJonas Devlieghere return lldb::SBCommand();
640b9c1b51eSKate Stone CommandObjectMultiword *new_command = new CommandObjectMultiword(
641b9c1b51eSKate Stone m_opaque_sp->GetCommandInterpreter(), name, help);
64221dfcd9dSEnrico Granata new_command->SetRemovable(true);
64321dfcd9dSEnrico Granata lldb::CommandObjectSP new_command_sp(new_command);
64421dfcd9dSEnrico Granata if (new_command_sp && m_opaque_sp->LoadSubCommand(name, new_command_sp))
645d232abc3SJonas Devlieghere return lldb::SBCommand(new_command_sp);
646d232abc3SJonas Devlieghere return lldb::SBCommand();
64721dfcd9dSEnrico Granata }
64821dfcd9dSEnrico Granata
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help)649b9c1b51eSKate Stone lldb::SBCommand SBCommand::AddCommand(const char *name,
650b9c1b51eSKate Stone lldb::SBCommandPluginInterface *impl,
651b9c1b51eSKate Stone const char *help) {
6521755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, impl, help);
653d232abc3SJonas Devlieghere return AddCommand(name, impl, help, /*syntax=*/nullptr,
654d232abc3SJonas Devlieghere /*auto_repeat_command=*/"");
65521dfcd9dSEnrico Granata }
656e87764f2SEnrico Granata
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help,const char * syntax)657b9c1b51eSKate Stone lldb::SBCommand SBCommand::AddCommand(const char *name,
658b9c1b51eSKate Stone lldb::SBCommandPluginInterface *impl,
659b9c1b51eSKate Stone const char *help, const char *syntax) {
6601755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, impl, help, syntax);
661d232abc3SJonas Devlieghere return AddCommand(name, impl, help, syntax, /*auto_repeat_command=*/"");
662be3f8a8eSWalter Erquinigo }
663be3f8a8eSWalter Erquinigo
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help,const char * syntax,const char * auto_repeat_command)664be3f8a8eSWalter Erquinigo lldb::SBCommand SBCommand::AddCommand(const char *name,
665be3f8a8eSWalter Erquinigo lldb::SBCommandPluginInterface *impl,
666be3f8a8eSWalter Erquinigo const char *help, const char *syntax,
667be3f8a8eSWalter Erquinigo const char *auto_repeat_command) {
6681755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, impl, help, syntax, auto_repeat_command);
669baf5664fSJonas Devlieghere
670f605c198SAbhishek Aggarwal if (!IsValid())
671d232abc3SJonas Devlieghere return lldb::SBCommand();
672f605c198SAbhishek Aggarwal if (!m_opaque_sp->IsMultiwordObject())
673d232abc3SJonas Devlieghere return lldb::SBCommand();
674f605c198SAbhishek Aggarwal lldb::CommandObjectSP new_command_sp;
675796ac80bSJonas Devlieghere new_command_sp = std::make_shared<CommandPluginInterfaceImplementation>(
676be3f8a8eSWalter Erquinigo m_opaque_sp->GetCommandInterpreter(), name, impl, help, syntax,
677be3f8a8eSWalter Erquinigo /*flags=*/0, auto_repeat_command);
678f605c198SAbhishek Aggarwal if (new_command_sp && m_opaque_sp->LoadSubCommand(name, new_command_sp))
679d232abc3SJonas Devlieghere return lldb::SBCommand(new_command_sp);
680d232abc3SJonas Devlieghere return lldb::SBCommand();
681f605c198SAbhishek Aggarwal }
682f605c198SAbhishek Aggarwal
GetFlags()683b9c1b51eSKate Stone uint32_t SBCommand::GetFlags() {
6841755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
685baf5664fSJonas Devlieghere
686dbb0abbfSEugene Zelenko return (IsValid() ? m_opaque_sp->GetFlags().Get() : 0);
687e87764f2SEnrico Granata }
688e87764f2SEnrico Granata
SetFlags(uint32_t flags)689b9c1b51eSKate Stone void SBCommand::SetFlags(uint32_t flags) {
6901755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, flags);
691baf5664fSJonas Devlieghere
692e87764f2SEnrico Granata if (IsValid())
693e87764f2SEnrico Granata m_opaque_sp->GetFlags().Set(flags);
694e87764f2SEnrico Granata }
695