22 "Import a dylib that implements an LLDB plugin.",
34 result.
AppendError(
"'plugin load' requires one argument");
40 FileSpec dylib_fspec(command[0].ref());
55static int ActOnMatchingPlugins(
56 const llvm::StringRef pattern,
58 const std::vector<RegisteredPluginInfo> &plugin_info)>
65 std::vector<RegisteredPluginInfo> matching_plugins;
70 matching_plugins.push_back(plugin_info);
73 if (!matching_plugins.empty()) {
74 num_matching += matching_plugins.size();
75 action(plugin_namespace, matching_plugins);
85int SetEnableOnMatchingPlugins(
const llvm::StringRef &pattern,
87 return ActOnMatchingPlugins(
89 const std::vector<RegisteredPluginInfo> &plugins) {
91 for (
const auto &
plugin : plugins) {
94 plugin_namespace.
name.data(),
100 " %s %-30s %s\n", enabled ?
"[+]" :
"[-]",
plugin.name.data(),
101 plugin.description.data());
106static std::string ConvertJSONToPrettyString(
const llvm::json::Value &json) {
108 llvm::raw_string_ostream os(str);
109 os << llvm::formatv(
"{0:2}", json).str();
114#define LLDB_OPTIONS_plugin_list
115#include "CommandOptions.inc"
118class PluginListCommandOptions :
public Options {
120 PluginListCommandOptions() =
default;
122 ~PluginListCommandOptions()
override =
default;
124 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
127 const int short_option = m_getopt_table[option_idx].val;
129 switch (short_option) {
131 m_json_format =
true;
134 llvm_unreachable(
"Unimplemented option");
141 m_json_format =
false;
144 llvm::ArrayRef<OptionDefinition> GetDefinitions()
override {
145 return llvm::ArrayRef(g_plugin_list_options);
149 bool m_json_format =
false;
157 "Report info about registered LLDB plugins.",
161Display information about registered plugins.
162The plugin information is formatted as shown below:
165 [+] <plugin-name> Plugin #1 description
166 [-] <plugin-name> Plugin #2 description
168An enabled plugin is marked with [+] and a disabled plugin is marked with [-].
170Plugins can be listed by namespace and name with:
172 plugin list <plugin-namespace>[.<plugin-name>]
174Plugins can be listed by namespace alone or with a fully qualified name. When listed
175with just a namespace all plugins in that namespace are listed. When no arguments
176are given all plugins are listed.
183List all plugins in the system-runtime namespace
185 (lldb) plugin list system-runtime
187List only the plugin 'foo' matching a fully qualified name exactly
189 (lldb) plugin list system-runtime.foo
212 std::vector<llvm::StringRef> patterns;
213 patterns.reserve(argc == 0 ? 1 : argc);
215 patterns.push_back(
"");
217 for (
size_t i = 0; i < argc; ++i)
218 patterns.push_back(command[i].ref());
229 llvm::json::Object obj;
230 bool found_empty =
false;
231 for (
const llvm::StringRef pattern : patterns) {
233 if (pat_obj.empty()) {
236 "Found no matching plugins for pattern '%s'", pattern.data());
239 for (
auto &entry : pat_obj) {
240 obj[entry.first] = std::move(entry.second);
244 result.
AppendMessage(ConvertJSONToPrettyString(std::move(obj)));
249 CommandReturnObject &result) {
250 for (
const llvm::StringRef pattern : patterns) {
251 int num_matching = ActOnMatchingPlugins(
252 pattern, [&](
const PluginNamespace &plugin_namespace,
253 const std::vector<RegisteredPluginInfo> &plugins) {
255 for (
auto &plugin : plugins) {
257 " %s %-30s %s\n", plugin.enabled ?
"[+]" :
"[-]",
258 plugin.name.data(), plugin.description.data());
261 if (num_matching == 0) {
263 "Found no matching plugins for pattern '%s'", pattern.data());
274 const char *name = enable ?
"enable" :
"disable";
283 for (
size_t i = 0; i < argc; ++i) {
284 llvm::StringRef pattern = command[i].ref();
285 int num_matching = SetEnableOnMatchingPlugins(pattern, result, enable);
287 if (num_matching == 0) {
289 "Found no matching plugins to %s for pattern '%s'", name,
300 "Enable registered LLDB plugins.", nullptr) {
324 "Disable registered LLDB plugins.", nullptr) {
346 "Commands for managing LLDB plugins.",
347 "plugin <subcommand> [<subcommand-options>]") {
static void DoPluginEnableDisable(Args &command, CommandReturnObject &result, bool enable)
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
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectPluginDisable(CommandInterpreter &interpreter)
CommandObjectPluginEnable(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectPluginEnable() override=default
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
~CommandObjectPluginList() override=default
void OutputTextFormat(const std::vector< llvm::StringRef > &patterns, CommandReturnObject &result)
void OutputJsonFormat(const std::vector< llvm::StringRef > &patterns, CommandReturnObject &result)
PluginListCommandOptions m_options
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectPluginList(CommandInterpreter &interpreter)
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)
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 void AppendError(llvm::StringRef in_string)
void SetStatus(lldb::ReturnStatus status)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
void AppendMessageWithFormat(const char *format,...) __attribute__((format(printf
"lldb/Utility/ArgCompletionRequest.h"
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
void Resolve(llvm::SmallVectorImpl< char > &path)
Resolve path to make it canonical.
static FileSystem & Instance()
A command line option parsing protocol class.
static bool MatchPluginName(llvm::StringRef pattern, const PluginNamespace &plugin_ns, const RegisteredPluginInfo &plugin)
static llvm::json::Object GetJSON(llvm::StringRef pattern="")
static llvm::ArrayRef< PluginNamespace > GetPluginNamespaces()
A class that represents a running process on the host machine.
std::vector< OptionArgElement > OptionElementVector
@ eManagedPluginCompletion
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
@ eReturnStatusSuccessFinishResult
SetPluginEnabled set_enabled