[lldb/Commands] Add scripting template list command with auto discovery
This patch introduces a new `template` multiword sub-command to the `scripting` top-level command. As the name suggests, this sub-command operates on scripting templates, and currently has the ability to automatically discover the various scripting extensions that lldb supports. This was previously reviewed in #97273. Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#define LLDB_CORE_PLUGINMANAGER_H
|
||||
|
||||
#include "lldb/Core/Architecture.h"
|
||||
#include "lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h"
|
||||
#include "lldb/Symbol/TypeSystem.h"
|
||||
#include "lldb/Utility/CompletionRequest.h"
|
||||
#include "lldb/Utility/FileSpec.h"
|
||||
@@ -487,6 +488,25 @@ public:
|
||||
|
||||
static LanguageSet GetAllTypeSystemSupportedLanguagesForExpressions();
|
||||
|
||||
// Scripted Interface
|
||||
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
|
||||
ScriptedInterfaceCreateInstance create_callback,
|
||||
lldb::ScriptLanguage language,
|
||||
ScriptedInterfaceUsages usages);
|
||||
|
||||
static bool UnregisterPlugin(ScriptedInterfaceCreateInstance create_callback);
|
||||
|
||||
static uint32_t GetNumScriptedInterfaces();
|
||||
|
||||
static llvm::StringRef GetScriptedInterfaceNameAtIndex(uint32_t idx);
|
||||
|
||||
static llvm::StringRef GetScriptedInterfaceDescriptionAtIndex(uint32_t idx);
|
||||
|
||||
static lldb::ScriptLanguage GetScriptedInterfaceLanguageAtIndex(uint32_t idx);
|
||||
|
||||
static ScriptedInterfaceUsages
|
||||
GetScriptedInterfaceUsagesAtIndex(uint32_t idx);
|
||||
|
||||
// REPL
|
||||
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
|
||||
REPLCreateInstance create_callback,
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#ifndef LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H
|
||||
#define LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H
|
||||
|
||||
#include "ScriptedInterfaceUsages.h"
|
||||
|
||||
#include "lldb/Core/StructuredDataImpl.h"
|
||||
#include "lldb/Utility/LLDBLog.h"
|
||||
#include "lldb/Utility/Log.h"
|
||||
@@ -68,6 +70,11 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool CreateInstance(lldb::ScriptLanguage language,
|
||||
ScriptedInterfaceUsages usages) {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
StructuredData::GenericSP m_object_instance_sp;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
//===-- ScriptedInterfaceUsages.h ---------------------------- -*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLDB_INTERPRETER_SCRIPTEDINTERFACEUSAGES_H
|
||||
#define LLDB_INTERPRETER_SCRIPTEDINTERFACEUSAGES_H
|
||||
|
||||
#include "lldb/lldb-types.h"
|
||||
|
||||
#include "lldb/Utility/Stream.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
|
||||
namespace lldb_private {
|
||||
class ScriptedInterfaceUsages {
|
||||
public:
|
||||
ScriptedInterfaceUsages() = default;
|
||||
ScriptedInterfaceUsages(const std::vector<llvm::StringRef> ci_usages,
|
||||
const std::vector<llvm::StringRef> sbapi_usages)
|
||||
: m_command_interpreter_usages(ci_usages), m_sbapi_usages(sbapi_usages) {}
|
||||
|
||||
const std::vector<llvm::StringRef> &GetCommandInterpreterUsages() const {
|
||||
return m_command_interpreter_usages;
|
||||
}
|
||||
|
||||
const std::vector<llvm::StringRef> &GetSBAPIUsages() const {
|
||||
return m_sbapi_usages;
|
||||
}
|
||||
|
||||
enum class UsageKind { CommandInterpreter, API };
|
||||
|
||||
void Dump(Stream &s, UsageKind kind) const;
|
||||
|
||||
private:
|
||||
std::vector<llvm::StringRef> m_command_interpreter_usages;
|
||||
std::vector<llvm::StringRef> m_sbapi_usages;
|
||||
};
|
||||
} // namespace lldb_private
|
||||
|
||||
#endif // LLDB_INTERPRETER_SCRIPTEDINTERFACEUSAGES_H
|
||||
@@ -25,6 +25,7 @@ class Value;
|
||||
} // namespace llvm
|
||||
|
||||
namespace lldb_private {
|
||||
class ScriptedInterfaceUsages;
|
||||
typedef lldb::ABISP (*ABICreateInstance)(lldb::ProcessSP process_sp,
|
||||
const ArchSpec &arch);
|
||||
typedef std::unique_ptr<Architecture> (*ArchitectureCreateInstance)(
|
||||
@@ -124,6 +125,8 @@ typedef lldb::REPLSP (*REPLCreateInstance)(Status &error,
|
||||
lldb::LanguageType language,
|
||||
Debugger *debugger, Target *target,
|
||||
const char *repl_options);
|
||||
typedef bool (*ScriptedInterfaceCreateInstance)(lldb::ScriptLanguage language,
|
||||
ScriptedInterfaceUsages usages);
|
||||
typedef int (*ComparisonFunction)(const void *, const void *);
|
||||
typedef void (*DebuggerInitializeCallback)(Debugger &debugger);
|
||||
/// Trace
|
||||
|
||||
@@ -8,12 +8,14 @@
|
||||
|
||||
#include "CommandObjectScripting.h"
|
||||
#include "lldb/Core/Debugger.h"
|
||||
#include "lldb/Core/PluginManager.h"
|
||||
#include "lldb/DataFormatters/DataVisualization.h"
|
||||
#include "lldb/Host/Config.h"
|
||||
#include "lldb/Host/OptionParser.h"
|
||||
#include "lldb/Interpreter/CommandInterpreter.h"
|
||||
#include "lldb/Interpreter/CommandOptionArgumentTable.h"
|
||||
#include "lldb/Interpreter/CommandReturnObject.h"
|
||||
#include "lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h"
|
||||
#include "lldb/Interpreter/OptionArgParser.h"
|
||||
#include "lldb/Interpreter/ScriptInterpreter.h"
|
||||
#include "lldb/Utility/Args.h"
|
||||
@@ -127,9 +129,126 @@ private:
|
||||
CommandOptions m_options;
|
||||
};
|
||||
|
||||
#pragma mark CommandObjectMultiwordScripting
|
||||
#define LLDB_OPTIONS_scripting_template_list
|
||||
#include "CommandOptions.inc"
|
||||
|
||||
// CommandObjectMultiwordScripting
|
||||
class CommandObjectScriptingTemplateList : public CommandObjectParsed {
|
||||
public:
|
||||
CommandObjectScriptingTemplateList(CommandInterpreter &interpreter)
|
||||
: CommandObjectParsed(
|
||||
interpreter, "scripting template list",
|
||||
"List all the available scripting extension templates. ",
|
||||
"scripting template list [--language <scripting-language> --]") {}
|
||||
|
||||
~CommandObjectScriptingTemplateList() override = default;
|
||||
|
||||
Options *GetOptions() override { return &m_options; }
|
||||
|
||||
class CommandOptions : public Options {
|
||||
public:
|
||||
CommandOptions() = default;
|
||||
~CommandOptions() override = default;
|
||||
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
|
||||
ExecutionContext *execution_context) override {
|
||||
Status error;
|
||||
const int short_option = m_getopt_table[option_idx].val;
|
||||
|
||||
switch (short_option) {
|
||||
case 'l':
|
||||
m_language = (lldb::ScriptLanguage)OptionArgParser::ToOptionEnum(
|
||||
option_arg, GetDefinitions()[option_idx].enum_values,
|
||||
eScriptLanguageNone, error);
|
||||
if (!error.Success())
|
||||
error.SetErrorStringWithFormatv(
|
||||
"unrecognized value for language '{0}'", option_arg);
|
||||
break;
|
||||
default:
|
||||
llvm_unreachable("Unimplemented option");
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
void OptionParsingStarting(ExecutionContext *execution_context) override {
|
||||
m_language = lldb::eScriptLanguageDefault;
|
||||
}
|
||||
|
||||
llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
|
||||
return llvm::ArrayRef(g_scripting_template_list_options);
|
||||
}
|
||||
|
||||
lldb::ScriptLanguage m_language = lldb::eScriptLanguageDefault;
|
||||
};
|
||||
|
||||
protected:
|
||||
void DoExecute(Args &command, CommandReturnObject &result) override {
|
||||
Stream &s = result.GetOutputStream();
|
||||
s.Printf("Available scripted extension templates:");
|
||||
|
||||
auto print_field = [&s](llvm::StringRef key, llvm::StringRef value) {
|
||||
if (!value.empty()) {
|
||||
s.IndentMore();
|
||||
s.Indent();
|
||||
s << key << ": " << value << '\n';
|
||||
s.IndentLess();
|
||||
}
|
||||
};
|
||||
|
||||
size_t num_listed_interface = 0;
|
||||
size_t num_templates = PluginManager::GetNumScriptedInterfaces();
|
||||
for (size_t i = 0; i < num_templates; i++) {
|
||||
llvm::StringRef plugin_name =
|
||||
PluginManager::GetScriptedInterfaceNameAtIndex(i);
|
||||
if (plugin_name.empty())
|
||||
break;
|
||||
|
||||
lldb::ScriptLanguage lang =
|
||||
PluginManager::GetScriptedInterfaceLanguageAtIndex(i);
|
||||
if (lang != m_options.m_language)
|
||||
continue;
|
||||
|
||||
if (!num_listed_interface)
|
||||
s.EOL();
|
||||
|
||||
num_listed_interface++;
|
||||
|
||||
llvm::StringRef desc =
|
||||
PluginManager::GetScriptedInterfaceDescriptionAtIndex(i);
|
||||
ScriptedInterfaceUsages usages =
|
||||
PluginManager::GetScriptedInterfaceUsagesAtIndex(i);
|
||||
|
||||
print_field("Name", plugin_name);
|
||||
print_field("Language", ScriptInterpreter::LanguageToString(lang));
|
||||
print_field("Description", desc);
|
||||
usages.Dump(s, ScriptedInterfaceUsages::UsageKind::API);
|
||||
usages.Dump(s, ScriptedInterfaceUsages::UsageKind::CommandInterpreter);
|
||||
|
||||
if (i != num_templates - 1)
|
||||
s.EOL();
|
||||
}
|
||||
|
||||
if (!num_listed_interface)
|
||||
s << " None\n";
|
||||
}
|
||||
|
||||
private:
|
||||
CommandOptions m_options;
|
||||
};
|
||||
|
||||
class CommandObjectMultiwordScriptingTemplate : public CommandObjectMultiword {
|
||||
public:
|
||||
CommandObjectMultiwordScriptingTemplate(CommandInterpreter &interpreter)
|
||||
: CommandObjectMultiword(
|
||||
interpreter, "scripting template",
|
||||
"Commands for operating on the scripting templates.",
|
||||
"scripting template [<subcommand-options>]") {
|
||||
LoadSubCommand(
|
||||
"list",
|
||||
CommandObjectSP(new CommandObjectScriptingTemplateList(interpreter)));
|
||||
}
|
||||
|
||||
~CommandObjectMultiwordScriptingTemplate() override = default;
|
||||
};
|
||||
|
||||
CommandObjectMultiwordScripting::CommandObjectMultiwordScripting(
|
||||
CommandInterpreter &interpreter)
|
||||
@@ -139,6 +258,9 @@ CommandObjectMultiwordScripting::CommandObjectMultiwordScripting(
|
||||
"scripting <subcommand> [<subcommand-options>]") {
|
||||
LoadSubCommand("run",
|
||||
CommandObjectSP(new CommandObjectScriptingRun(interpreter)));
|
||||
LoadSubCommand("template",
|
||||
CommandObjectSP(
|
||||
new CommandObjectMultiwordScriptingTemplate(interpreter)));
|
||||
}
|
||||
|
||||
CommandObjectMultiwordScripting::~CommandObjectMultiwordScripting() = default;
|
||||
|
||||
@@ -841,6 +841,12 @@ let Command = "scripting run" in {
|
||||
" language. If none is specific the default scripting language is used.">;
|
||||
}
|
||||
|
||||
let Command = "scripting template list" in {
|
||||
def scripting_template_list_language : Option<"language", "l">,
|
||||
EnumArg<"ScriptLang">, Desc<"Specify the scripting "
|
||||
" language. If none is specified the default scripting language is used.">;
|
||||
}
|
||||
|
||||
let Command = "source info" in {
|
||||
def source_info_count : Option<"count", "c">, Arg<"Count">,
|
||||
Desc<"The number of line entries to display.">;
|
||||
|
||||
@@ -1505,6 +1505,70 @@ LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions() {
|
||||
return all;
|
||||
}
|
||||
|
||||
#pragma mark ScriptedInterfaces
|
||||
|
||||
struct ScriptedInterfaceInstance
|
||||
: public PluginInstance<ScriptedInterfaceCreateInstance> {
|
||||
ScriptedInterfaceInstance(llvm::StringRef name, llvm::StringRef description,
|
||||
ScriptedInterfaceCreateInstance create_callback,
|
||||
lldb::ScriptLanguage language,
|
||||
ScriptedInterfaceUsages usages)
|
||||
: PluginInstance<ScriptedInterfaceCreateInstance>(name, description,
|
||||
create_callback),
|
||||
language(language), usages(usages) {}
|
||||
|
||||
lldb::ScriptLanguage language;
|
||||
ScriptedInterfaceUsages usages;
|
||||
};
|
||||
|
||||
typedef PluginInstances<ScriptedInterfaceInstance> ScriptedInterfaceInstances;
|
||||
|
||||
static ScriptedInterfaceInstances &GetScriptedInterfaceInstances() {
|
||||
static ScriptedInterfaceInstances g_instances;
|
||||
return g_instances;
|
||||
}
|
||||
|
||||
bool PluginManager::RegisterPlugin(
|
||||
llvm::StringRef name, llvm::StringRef description,
|
||||
ScriptedInterfaceCreateInstance create_callback,
|
||||
lldb::ScriptLanguage language, ScriptedInterfaceUsages usages) {
|
||||
return GetScriptedInterfaceInstances().RegisterPlugin(
|
||||
name, description, create_callback, language, usages);
|
||||
}
|
||||
|
||||
bool PluginManager::UnregisterPlugin(
|
||||
ScriptedInterfaceCreateInstance create_callback) {
|
||||
return GetScriptedInterfaceInstances().UnregisterPlugin(create_callback);
|
||||
}
|
||||
|
||||
uint32_t PluginManager::GetNumScriptedInterfaces() {
|
||||
return GetScriptedInterfaceInstances().GetInstances().size();
|
||||
}
|
||||
|
||||
llvm::StringRef PluginManager::GetScriptedInterfaceNameAtIndex(uint32_t index) {
|
||||
return GetScriptedInterfaceInstances().GetNameAtIndex(index);
|
||||
}
|
||||
|
||||
llvm::StringRef
|
||||
PluginManager::GetScriptedInterfaceDescriptionAtIndex(uint32_t index) {
|
||||
return GetScriptedInterfaceInstances().GetDescriptionAtIndex(index);
|
||||
}
|
||||
|
||||
lldb::ScriptLanguage
|
||||
PluginManager::GetScriptedInterfaceLanguageAtIndex(uint32_t idx) {
|
||||
const auto &instances = GetScriptedInterfaceInstances().GetInstances();
|
||||
return idx < instances.size() ? instances[idx].language
|
||||
: ScriptLanguage::eScriptLanguageNone;
|
||||
}
|
||||
|
||||
ScriptedInterfaceUsages
|
||||
PluginManager::GetScriptedInterfaceUsagesAtIndex(uint32_t idx) {
|
||||
const auto &instances = GetScriptedInterfaceInstances().GetInstances();
|
||||
if (idx >= instances.size())
|
||||
return {};
|
||||
return instances[idx].usages;
|
||||
}
|
||||
|
||||
#pragma mark REPL
|
||||
|
||||
struct REPLInstance : public PluginInstance<REPLCreateInstance> {
|
||||
@@ -1565,6 +1629,7 @@ void PluginManager::DebuggerInitialize(Debugger &debugger) {
|
||||
GetOperatingSystemInstances().PerformDebuggerCallback(debugger);
|
||||
GetStructuredDataPluginInstances().PerformDebuggerCallback(debugger);
|
||||
GetTracePluginInstances().PerformDebuggerCallback(debugger);
|
||||
GetScriptedInterfaceInstances().PerformDebuggerCallback(debugger);
|
||||
}
|
||||
|
||||
// This is the preferred new way to register plugin specific settings. e.g.
|
||||
|
||||
@@ -6,6 +6,8 @@ lldb_tablegen(InterpreterPropertiesEnum.inc -gen-lldb-property-enum-defs
|
||||
SOURCE InterpreterProperties.td
|
||||
TARGET LLDBInterpreterPropertiesEnumGen)
|
||||
|
||||
add_subdirectory(Interfaces)
|
||||
|
||||
add_lldb_library(lldbInterpreter NO_PLUGIN_DEPENDENCIES
|
||||
CommandAlias.cpp
|
||||
CommandHistory.cpp
|
||||
@@ -54,6 +56,7 @@ add_lldb_library(lldbInterpreter NO_PLUGIN_DEPENDENCIES
|
||||
ScriptInterpreter.cpp
|
||||
|
||||
LINK_LIBS
|
||||
lldbInterpreterInterfaces
|
||||
lldbCommands
|
||||
lldbCore
|
||||
lldbDataFormatters
|
||||
@@ -66,6 +69,7 @@ add_lldb_library(lldbInterpreter NO_PLUGIN_DEPENDENCIES
|
||||
)
|
||||
|
||||
add_dependencies(lldbInterpreter
|
||||
lldbInterpreterInterfaces
|
||||
LLDBInterpreterPropertiesGen
|
||||
LLDBInterpreterPropertiesEnumGen)
|
||||
|
||||
|
||||
10
lldb/source/Interpreter/Interfaces/CMakeLists.txt
Normal file
10
lldb/source/Interpreter/Interfaces/CMakeLists.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
add_lldb_library(lldbInterpreterInterfaces NO_PLUGIN_DEPENDENCIES
|
||||
ScriptedInterfaceUsages.cpp
|
||||
|
||||
LINK_LIBS
|
||||
lldbUtility
|
||||
|
||||
LINK_COMPONENTS
|
||||
Support
|
||||
)
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
//===-- ScriptedInterfaceUsages.cpp --------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h"
|
||||
|
||||
using namespace lldb;
|
||||
using namespace lldb_private;
|
||||
|
||||
void ScriptedInterfaceUsages::Dump(Stream &s, UsageKind kind) const {
|
||||
s.IndentMore();
|
||||
s.Indent();
|
||||
llvm::StringRef usage_kind =
|
||||
(kind == UsageKind::CommandInterpreter) ? "Command Interpreter" : "API";
|
||||
s << usage_kind << " Usages:";
|
||||
const std::vector<llvm::StringRef> &usages =
|
||||
(kind == UsageKind::CommandInterpreter) ? GetCommandInterpreterUsages()
|
||||
: GetSBAPIUsages();
|
||||
if (usages.empty())
|
||||
s << " None\n";
|
||||
else if (usages.size() == 1)
|
||||
s << " " << usages.front() << '\n';
|
||||
else {
|
||||
s << '\n';
|
||||
for (llvm::StringRef usage : usages) {
|
||||
s.IndentMore();
|
||||
s.Indent();
|
||||
s << usage << '\n';
|
||||
s.IndentLess();
|
||||
}
|
||||
}
|
||||
s.IndentLess();
|
||||
}
|
||||
@@ -24,7 +24,6 @@ add_lldb_library(lldbPluginScriptInterpreterPythonInterfaces
|
||||
ScriptedPythonInterface.cpp
|
||||
ScriptedProcessPythonInterface.cpp
|
||||
ScriptedThreadPythonInterface.cpp
|
||||
ScriptedThreadPlanPythonInterface.cpp
|
||||
ScriptedPlatformPythonInterface.cpp
|
||||
|
||||
LINK_LIBS
|
||||
@@ -38,3 +37,4 @@ add_lldb_library(lldbPluginScriptInterpreterPythonInterfaces
|
||||
LINK_COMPONENTS
|
||||
Support
|
||||
)
|
||||
add_subdirectory(ScriptedThreadPlanPythonInterface)
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
add_lldb_library(lldbPluginScriptInterpreterPythonScriptedThreadPlanPythonInterface PLUGIN
|
||||
|
||||
ScriptedThreadPlanPythonInterface.cpp
|
||||
|
||||
LINK_LIBS
|
||||
lldbCore
|
||||
lldbHost
|
||||
lldbInterpreter
|
||||
lldbTarget
|
||||
lldbPluginScriptInterpreterPython
|
||||
${Python3_LIBRARIES}
|
||||
${LLDB_LIBEDIT_LIBS}
|
||||
|
||||
LINK_COMPONENTS
|
||||
Support
|
||||
)
|
||||
@@ -6,23 +6,28 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "lldb/Core/PluginManager.h"
|
||||
#include "lldb/Host/Config.h"
|
||||
#include "lldb/Utility/Log.h"
|
||||
#include "lldb/lldb-enumerations.h"
|
||||
|
||||
#if LLDB_ENABLE_PYTHON
|
||||
|
||||
// clang-format off
|
||||
// LLDB Python header must be included first
|
||||
#include "../lldb-python.h"
|
||||
#include "../../lldb-python.h"
|
||||
//clang-format on
|
||||
|
||||
#include "../SWIGPythonBridge.h"
|
||||
#include "../ScriptInterpreterPythonImpl.h"
|
||||
#include "../../SWIGPythonBridge.h"
|
||||
#include "../../ScriptInterpreterPythonImpl.h"
|
||||
#include "ScriptedThreadPlanPythonInterface.h"
|
||||
|
||||
using namespace lldb;
|
||||
using namespace lldb_private;
|
||||
using namespace lldb_private::python;
|
||||
|
||||
LLDB_PLUGIN_DEFINE_ADV(ScriptedThreadPlanPythonInterface, ScriptInterpreterPythonScriptedThreadPlanPythonInterface)
|
||||
|
||||
ScriptedThreadPlanPythonInterface::ScriptedThreadPlanPythonInterface(
|
||||
ScriptInterpreterPythonImpl &interpreter)
|
||||
: ScriptedThreadPlanInterface(), ScriptedPythonInterface(interpreter) {}
|
||||
@@ -102,4 +107,19 @@ ScriptedThreadPlanPythonInterface::GetStopDescription(lldb::StreamSP &stream) {
|
||||
return llvm::Error::success();
|
||||
}
|
||||
|
||||
void ScriptedThreadPlanPythonInterface::Initialize() {
|
||||
const std::vector<llvm::StringRef> ci_usages = {
|
||||
"thread step-scripted -C <script-name> [-k key -v value ...]"};
|
||||
const std::vector<llvm::StringRef> api_usages = {
|
||||
"SBThread.StepUsingScriptedThreadPlan"};
|
||||
PluginManager::RegisterPlugin(
|
||||
GetPluginNameStatic(),
|
||||
llvm::StringRef("Alter thread stepping logic and stop reason"),
|
||||
CreateInstance, eScriptLanguagePython, {ci_usages, api_usages});
|
||||
}
|
||||
|
||||
void ScriptedThreadPlanPythonInterface::Terminate() {
|
||||
PluginManager::UnregisterPlugin(CreateInstance);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -10,16 +10,18 @@
|
||||
#define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDTHREADPLANPYTHONINTERFACE_H
|
||||
|
||||
#include "lldb/Host/Config.h"
|
||||
#include "lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h"
|
||||
|
||||
#if LLDB_ENABLE_PYTHON
|
||||
|
||||
#include "ScriptedPythonInterface.h"
|
||||
#include "lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h"
|
||||
#include "../ScriptedPythonInterface.h"
|
||||
|
||||
#include <optional>
|
||||
|
||||
namespace lldb_private {
|
||||
class ScriptedThreadPlanPythonInterface : public ScriptedThreadPlanInterface,
|
||||
public ScriptedPythonInterface {
|
||||
public ScriptedPythonInterface,
|
||||
public PluginInterface {
|
||||
public:
|
||||
ScriptedThreadPlanPythonInterface(ScriptInterpreterPythonImpl &interpreter);
|
||||
|
||||
@@ -41,6 +43,16 @@ public:
|
||||
lldb::StateType GetRunState() override;
|
||||
|
||||
llvm::Error GetStopDescription(lldb::StreamSP &stream) override;
|
||||
|
||||
static void Initialize();
|
||||
|
||||
static void Terminate();
|
||||
|
||||
static llvm::StringRef GetPluginNameStatic() {
|
||||
return "ScriptedThreadPlanPythonInterface";
|
||||
}
|
||||
|
||||
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
|
||||
};
|
||||
} // namespace lldb_private
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include "Interfaces/OperatingSystemPythonInterface.h"
|
||||
#include "Interfaces/ScriptedPlatformPythonInterface.h"
|
||||
#include "Interfaces/ScriptedProcessPythonInterface.h"
|
||||
#include "Interfaces/ScriptedThreadPlanPythonInterface.h"
|
||||
#include "Interfaces/ScriptedThreadPlanPythonInterface/ScriptedThreadPlanPythonInterface.h"
|
||||
#include "Interfaces/ScriptedThreadPythonInterface.h"
|
||||
#include "PythonDataObjects.h"
|
||||
#include "PythonReadline.h"
|
||||
|
||||
Reference in New Issue
Block a user