================
@@ -5392,6 +5393,190 @@ class CommandObjectTargetDump : public
CommandObjectMultiword {
~CommandObjectTargetDump() override = default;
};
+#pragma mark CommandObjectTargetFrameProvider
+
+#define LLDB_OPTIONS_target_frame_provider_register
+#include "CommandOptions.inc"
+
+class CommandObjectTargetFrameProviderRegister : public CommandObjectParsed {
+public:
+ CommandObjectTargetFrameProviderRegister(CommandInterpreter &interpreter)
+ : CommandObjectParsed(
+ interpreter, "target frame-provider register",
+ "Register frame provider for all threads in this target.", nullptr,
+ eCommandRequiresTarget),
+
+ m_class_options("target frame-provider", true, 'C', 'k', 'v', 0) {
+ m_all_options.Append(&m_class_options, LLDB_OPT_SET_1 | LLDB_OPT_SET_2,
+ LLDB_OPT_SET_ALL);
+ m_all_options.Finalize();
+
+ AddSimpleArgumentList(eArgTypeRunArgs, eArgRepeatOptional);
+ }
+
+ ~CommandObjectTargetFrameProviderRegister() override = default;
+
+ Options *GetOptions() override { return &m_all_options; }
+
+ std::optional<std::string> GetRepeatCommand(Args ¤t_command_args,
+ uint32_t index) override {
+ return std::string("");
+ }
+
+protected:
+ void DoExecute(Args &launch_args, CommandReturnObject &result) override {
+ ScriptedMetadataSP metadata_sp = std::make_shared<ScriptedMetadata>(
+ m_class_options.GetName(), m_class_options.GetStructuredData());
+
+ Target *target = m_exe_ctx.GetTargetPtr();
+ if (!target) {
+ result.AppendError("invalid target");
+ return;
+ }
+
+ // Create a descriptor from the metadata (applies to all threads by
default)
+ SyntheticFrameProviderDescriptor descriptor(metadata_sp);
+
+ Status error = target->AddScriptedFrameProviderDescriptor(descriptor);
+ if (error.Success())
+ result.AppendMessageWithFormat(
+ "Successfully registered scripted frame provider '%s' for target\n",
+ m_class_options.GetName().c_str());
+ result.SetError(std::move(error));
+ }
+
+ OptionGroupPythonClassWithDict m_class_options;
+ OptionGroupOptions m_all_options;
+};
+
+class CommandObjectTargetFrameProviderClear : public CommandObjectParsed {
+public:
+ CommandObjectTargetFrameProviderClear(CommandInterpreter &interpreter)
+ : CommandObjectParsed(interpreter, "target frame-provider clear",
+ "Delete registered frame provider from target.",
+ nullptr, eCommandRequiresTarget) {}
+
+ ~CommandObjectTargetFrameProviderClear() override = default;
+
+protected:
+ void DoExecute(Args &command, CommandReturnObject &result) override {
+ Target *target = m_exe_ctx.GetTargetPtr();
+ if (!target) {
+ result.AppendError("invalid target");
+ return;
+ }
+
+ target->ClearScriptedFrameProviderDescriptors();
+
+ result.SetStatus(eReturnStatusSuccessFinishResult);
+ }
+};
+
+class CommandObjectTargetFrameProviderList : public CommandObjectParsed {
+public:
+ CommandObjectTargetFrameProviderList(CommandInterpreter &interpreter)
+ : CommandObjectParsed(
+ interpreter, "target frame-provider list",
+ "List all registered frame providers for the target.", nullptr,
+ eCommandRequiresTarget) {}
+
+ ~CommandObjectTargetFrameProviderList() override = default;
+
+protected:
+ void DoExecute(Args &command, CommandReturnObject &result) override {
+ Target *target = m_exe_ctx.GetTargetPtr();
+ if (!target) {
+ result.AppendError("invalid target");
+ return;
+ }
+
+ const auto &descriptors = target->GetScriptedFrameProviderDescriptors();
+ if (descriptors.empty()) {
+ result.AppendMessage("No frame providers registered for this target.");
+ result.SetStatus(eReturnStatusSuccessFinishResult);
+ return;
+ }
+
+ result.AppendMessageWithFormat("%u frame provider(s) registered:\n\n",
+ descriptors.size());
+
+ for (const auto &entry : descriptors) {
+ const SyntheticFrameProviderDescriptor &descriptor = entry.second;
+ descriptor.Dump(&result.GetOutputStream());
+ result.GetOutputStream().PutChar('\n');
+ }
+
+ result.SetStatus(eReturnStatusSuccessFinishResult);
+ }
+};
+
+class CommandObjectTargetFrameProviderRemove : public CommandObjectParsed {
+public:
+ CommandObjectTargetFrameProviderRemove(CommandInterpreter &interpreter)
+ : CommandObjectParsed(
+ interpreter, "target frame-provider remove",
+ "Remove a registered frame provider from the target by name.",
+ "target frame-provider remove <provider-name>",
+ eCommandRequiresTarget) {
+ AddSimpleArgumentList(eArgTypeClassName, eArgRepeatPlain);
+ }
+
+ ~CommandObjectTargetFrameProviderRemove() override = default;
+
+protected:
+ void DoExecute(Args &command, CommandReturnObject &result) override {
+ Target *target = m_exe_ctx.GetTargetPtr();
+ if (!target) {
+ result.AppendError("invalid target");
+ return;
+ }
+
+ if (command.GetArgumentCount() != 1) {
+ result.AppendError(
+ "target frame-provider remove requires a provider name argument");
+ return;
+ }
+
+ llvm::StringRef provider_name = command[0].ref();
+
+ if (target->RemoveScriptedFrameProviderDescriptor(provider_name)) {
+ result.AppendMessageWithFormat(
+ "Successfully removed frame provider '%s'\n",
+ provider_name.str().c_str());
+ result.SetStatus(eReturnStatusSuccessFinishResult);
+ } else {
+ result.AppendErrorWithFormat(
+ "No frame provider named '%s' found in target\n",
----------------
JDevlieghere wrote:
```suggestion
"no frame provider named '%s' found in target\n",
```
https://github.com/llvm/llvm-project/pull/161870
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits