================
@@ -5392,6 +5393,109 @@ 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->SetScriptedFrameProviderDescriptor(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->ClearScriptedFrameProviderDescriptor();
----------------
jimingham wrote:
Would you ever want to remove the ScriptedFrameProviderDescriptor from the
target w/o resetting all the threads? I can't think of a reason why you would
want to do that, in which case it would be better to do the clearing in the
Target method.
https://github.com/llvm/llvm-project/pull/161870
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits