24 "Import a dylib that implements an LLDB plugin.",
36 result.
AppendError(
"'plugin load' requires one argument");
42 FileSpec dylib_fspec(command[0].ref());
57static int ActOnMatchingPlugins(
58 const llvm::StringRef pattern,
60 const std::vector<RegisteredPluginInfo> &plugin_info)>
67 std::vector<RegisteredPluginInfo> matching_plugins;
72 matching_plugins.push_back(plugin_info);
75 if (!matching_plugins.empty()) {
76 num_matching += matching_plugins.size();
77 action(plugin_namespace, matching_plugins);
87int SetEnableOnMatchingPlugins(
const llvm::StringRef &pattern,
91 return ActOnMatchingPlugins(
93 const std::vector<RegisteredPluginInfo> &plugins) {
94 auto PrintEnablement = [enabled,
97 enabled ?
"[+]" :
"[-]",
plugin.name,
102 for (
const auto &
plugin : plugins) {
108 "failed to {} plugin {}.{}: {} domain is not supported",
109 enabled ?
"enable" :
"disable", plugin_namespace.
name,
118 enabled ?
"enable" :
"disable",
131 "failed to {0} plugin {1}.{2}: the {1} namespace "
132 "does not support the {3} domain",
133 enabled ?
"enable" :
"disable", plugin_namespace.
name,
139 plugin.name, enabled, requesting_debugger, domain);
143 enabled ?
"enable" :
"disable",
145 llvm::toString(std::move(
error)));
153static std::string ConvertJSONToPrettyString(
const llvm::json::Value &json) {
155 llvm::raw_string_ostream os(str);
156 os << llvm::formatv(
"{0:2}", json).str();
161#define LLDB_OPTIONS_plugin_list
162#include "CommandOptions.inc"
165class PluginListCommandOptions :
public Options {
170 PluginListCommandOptions() =
default;
172 ~PluginListCommandOptions()
override =
default;
174 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
177 const int short_option = m_getopt_table[option_idx].val;
179 switch (short_option) {
181 m_json_format =
true;
185 option_arg, GetDefinitions()[option_idx].enum_values, kDefaultDomain,
189 llvm_unreachable(
"Unimplemented option");
196 m_json_format =
false;
197 m_domain = kDefaultDomain;
200 llvm::ArrayRef<OptionDefinition> GetDefinitions()
override {
201 return llvm::ArrayRef(g_plugin_list_options);
205 bool m_json_format =
false;
214 "Report info about registered LLDB plugins.",
218Display information about registered plugins.
219The plugin information is formatted as shown below:
222 [+] <plugin-name> Plugin #1 description
223 [-] <plugin-name> Plugin #2 description
225An enabled plugin is marked with [+] and a disabled plugin is marked with [-].
227Plugins can be listed by namespace and name with:
229 plugin list <plugin-namespace>[.<plugin-name>]
231Plugins can be listed by namespace alone or with a fully qualified name. When listed
232with just a namespace all plugins in that namespace are listed. When no arguments
233are given all plugins are listed.
240List all plugins in the system-runtime namespace
242 (lldb) plugin list system-runtime
244List only the plugin 'foo' matching a fully qualified name exactly
246 (lldb) plugin list system-runtime.foo
269 std::vector<llvm::StringRef> patterns;
270 patterns.reserve(argc == 0 ? 1 : argc);
272 patterns.push_back(
"");
274 for (
size_t i = 0; i < argc; ++i)
275 patterns.push_back(command[i].ref());
290 "{} domain is not supported",
295 llvm::json::Object obj;
296 bool found_empty =
false;
297 for (
const llvm::StringRef pattern : patterns) {
299 if (pat_obj.empty()) {
302 "Found no matching plugins for pattern '%s'", pattern.data());
305 for (
auto &entry : pat_obj) {
306 obj[entry.first] = std::move(entry.second);
310 result.
AppendMessage(ConvertJSONToPrettyString(std::move(obj)));
320 "{} domain is not supported",
325 for (
const llvm::StringRef pattern : patterns) {
326 int num_matching = ActOnMatchingPlugins(
328 const std::vector<RegisteredPluginInfo> &plugins) {
330 for (
auto &
plugin : plugins) {
332 plugin.enabled ?
"[+]" :
"[-]",
336 if (num_matching == 0) {
338 "Found no matching plugins for pattern '%s'", pattern.data());
348 bool enable,
Debugger &requesting_debugger,
350 const char *name = enable ?
"enable" :
"disable";
359 for (
size_t i = 0; i < argc; ++i) {
360 llvm::StringRef pattern = command[i].ref();
361 int num_matching = SetEnableOnMatchingPlugins(pattern, result, enable,
362 requesting_debugger, domain);
364 if (num_matching == 0) {
366 "Found no matching plugins to %s for pattern '%s'", name,
373#define LLDB_OPTIONS_plugin_enable
374#include "CommandOptions.inc"
376#define LLDB_OPTIONS_plugin_disable
377#include "CommandOptions.inc"
393 switch (short_option) {
400 llvm_unreachable(
"Unimplemented option");
423 "Enable registered LLDB plugins.", nullptr),
453 "Disable registered LLDB plugins.", nullptr),
481 "Commands for managing LLDB plugins.",
482 "plugin <subcommand> [<subcommand-options>]") {
static void DoPluginEnableDisable(Args &command, CommandReturnObject &result, bool enable, Debugger &requesting_debugger, PluginDomainKind domain)
static llvm::raw_ostream & error(Stream &strm)
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
~CommandObjectPluginDisable() override=default
Options * GetOptions() override
PluginDomainOptions m_options
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectPluginDisable(CommandInterpreter &interpreter)
Options * GetOptions() override
CommandObjectPluginEnable(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectPluginEnable() override=default
PluginDomainOptions m_options
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
~CommandObjectPluginList() override=default
PluginListCommandOptions m_options
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectPluginList(CommandInterpreter &interpreter)
void OutputJsonFormat(const std::vector< llvm::StringRef > &patterns, CommandReturnObject &result, Debugger &requesting_debugger, PluginDomainKind domain)
void OutputTextFormat(const std::vector< llvm::StringRef > &patterns, CommandReturnObject &result, Debugger &requesting_debugger, PluginDomainKind domain)
Options * GetOptions() override
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectPluginLoad() override=default
CommandObjectPluginLoad(CommandInterpreter &interpreter)
PluginDomainKind m_domain
llvm::ArrayRef< OptionDefinition > m_definitions
static constexpr const PluginDomainKind kDefaultDomain
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
PluginDomainOptions(llvm::ArrayRef< OptionDefinition > definitions)
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
void OptionParsingStarting(ExecutionContext *execution_context) override
A command line argument class.
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
static bool InvokeCommonCompletionCallbacks(CommandInterpreter &interpreter, uint32_t completion_mask, lldb_private::CompletionRequest &request, SearchFilter *searcher)
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
CommandObjectMultiword(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
friend class CommandInterpreter
CommandObjectParsed(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
~CommandObjectPlugin() override
CommandObjectPlugin(CommandInterpreter &interpreter)
virtual void SetHelpLong(llvm::StringRef str)
void AddSimpleArgumentList(lldb::CommandArgumentType arg_type, ArgumentRepetitionType repetition_type=eArgRepeatPlain)
CommandInterpreter & GetCommandInterpreter()
void AppendMessage(llvm::StringRef in_string)
void AppendError(llvm::StringRef in_string)
void SetStatus(lldb::ReturnStatus status)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
void void AppendMessageWithFormatv(const char *format, Args &&...args)
void AppendErrorWithFormatv(const char *format, Args &&...args)
"lldb/Utility/ArgCompletionRequest.h"
A class to manage flag bits.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
static FileSystem & Instance()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
A command line option parsing protocol class.
std::vector< Option > m_getopt_table
static bool MatchPluginName(llvm::StringRef pattern, const PluginNamespace &plugin_ns, const RegisteredPluginInfo &plugin)
static llvm::StringRef PluginDomainKindToStr(lldb::PluginDomainKind kind)
static llvm::json::Object GetJSON(llvm::StringRef pattern="")
static llvm::ArrayRef< PluginNamespace > GetPluginNamespaces()
std::optional< SetPluginEnabledGlobalDomain > GetSetEnabledGlobalFn() const
std::optional< SetPluginEnabledAllDomains > GetSetEnabledAllDomainsFn() const
bool SupportsOnlyDomain(lldb::PluginDomainKind domain) const
bool SupportsDomain(lldb::PluginDomainKind domain) const
A class that represents a running process on the host machine.
std::vector< OptionArgElement > OptionElementVector
@ eManagedPluginCompletion
@ ePluginDomainKindGlobal
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
@ eReturnStatusSuccessFinishResult
static int64_t ToOptionEnum(llvm::StringRef s, const OptionEnumValues &enum_values, int32_t fail_value, Status &error)