mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-10-08 11:44:05 +00:00
[lldb/Interpreter] Introduce ScriptedPlatform{,Python}Interface
This patch introduces both the ScriptedPlatformInterface and the ScriptedPlatformPythonInterface. As the name suggests, these calls will be used to call into the Scripted Platform python implementation from the C++ Scripted Platform plugin instance. Differential Revision: https://reviews.llvm.org/D139251 Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
This commit is contained in:
parent
bb4ccc6688
commit
b1256f2345
@ -18,6 +18,7 @@
|
|||||||
#include "lldb/Core/StreamFile.h"
|
#include "lldb/Core/StreamFile.h"
|
||||||
#include "lldb/Core/ThreadedCommunication.h"
|
#include "lldb/Core/ThreadedCommunication.h"
|
||||||
#include "lldb/Host/PseudoTerminal.h"
|
#include "lldb/Host/PseudoTerminal.h"
|
||||||
|
#include "lldb/Interpreter/ScriptedPlatformInterface.h"
|
||||||
#include "lldb/Interpreter/ScriptedProcessInterface.h"
|
#include "lldb/Interpreter/ScriptedProcessInterface.h"
|
||||||
#include "lldb/Utility/Broadcaster.h"
|
#include "lldb/Utility/Broadcaster.h"
|
||||||
#include "lldb/Utility/Status.h"
|
#include "lldb/Utility/Status.h"
|
||||||
@ -147,7 +148,9 @@ public:
|
|||||||
ScriptInterpreter(
|
ScriptInterpreter(
|
||||||
Debugger &debugger, lldb::ScriptLanguage script_lang,
|
Debugger &debugger, lldb::ScriptLanguage script_lang,
|
||||||
lldb::ScriptedProcessInterfaceUP scripted_process_interface_up =
|
lldb::ScriptedProcessInterfaceUP scripted_process_interface_up =
|
||||||
std::make_unique<ScriptedProcessInterface>());
|
std::make_unique<ScriptedProcessInterface>(),
|
||||||
|
lldb::ScriptedPlatformInterfaceUP scripted_platform_interface_up =
|
||||||
|
std::make_unique<ScriptedPlatformInterface>());
|
||||||
|
|
||||||
virtual StructuredData::DictionarySP GetInterpreterInfo();
|
virtual StructuredData::DictionarySP GetInterpreterInfo();
|
||||||
|
|
||||||
@ -571,6 +574,10 @@ public:
|
|||||||
return *m_scripted_process_interface_up;
|
return *m_scripted_process_interface_up;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScriptedPlatformInterface &GetScriptedPlatformInterface() {
|
||||||
|
return *m_scripted_platform_interface_up;
|
||||||
|
}
|
||||||
|
|
||||||
lldb::DataExtractorSP
|
lldb::DataExtractorSP
|
||||||
GetDataExtractorFromSBData(const lldb::SBData &data) const;
|
GetDataExtractorFromSBData(const lldb::SBData &data) const;
|
||||||
|
|
||||||
@ -583,6 +590,7 @@ protected:
|
|||||||
Debugger &m_debugger;
|
Debugger &m_debugger;
|
||||||
lldb::ScriptLanguage m_script_lang;
|
lldb::ScriptLanguage m_script_lang;
|
||||||
lldb::ScriptedProcessInterfaceUP m_scripted_process_interface_up;
|
lldb::ScriptedProcessInterfaceUP m_scripted_process_interface_up;
|
||||||
|
lldb::ScriptedPlatformInterfaceUP m_scripted_platform_interface_up;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace lldb_private
|
} // namespace lldb_private
|
||||||
|
49
lldb/include/lldb/Interpreter/ScriptedPlatformInterface.h
Normal file
49
lldb/include/lldb/Interpreter/ScriptedPlatformInterface.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
//===-- ScriptedPlatformInterface.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_SCRIPTEDPLATFORMINTERFACE_H
|
||||||
|
#define LLDB_INTERPRETER_SCRIPTEDPLATFORMINTERFACE_H
|
||||||
|
|
||||||
|
#include "lldb/Core/StructuredDataImpl.h"
|
||||||
|
#include "lldb/Interpreter/ScriptedInterface.h"
|
||||||
|
|
||||||
|
#include "lldb/lldb-private.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace lldb_private {
|
||||||
|
class ScriptedPlatformInterface : virtual public ScriptedInterface {
|
||||||
|
public:
|
||||||
|
StructuredData::GenericSP
|
||||||
|
CreatePluginObject(llvm::StringRef class_name, ExecutionContext &exe_ctx,
|
||||||
|
StructuredData::DictionarySP args_sp,
|
||||||
|
StructuredData::Generic *script_obj = nullptr) override {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual StructuredData::DictionarySP ListProcesses() { return {}; }
|
||||||
|
|
||||||
|
virtual StructuredData::DictionarySP GetProcessInfo(lldb::pid_t) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual Status AttachToProcess(lldb::ProcessAttachInfoSP attach_info) {
|
||||||
|
return Status("ScriptedPlatformInterface cannot attach to a process");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual Status LaunchProcess(lldb::ProcessLaunchInfoSP launch_info) {
|
||||||
|
return Status("ScriptedPlatformInterface cannot launch process");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual Status KillProcess(lldb::pid_t pid) {
|
||||||
|
return Status("ScriptedPlatformInterface cannot kill process");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace lldb_private
|
||||||
|
|
||||||
|
#endif // LLDB_INTERPRETER_SCRIPTEDPLATFORMINTERFACE_H
|
@ -161,6 +161,7 @@ class PersistentExpressionState;
|
|||||||
class Platform;
|
class Platform;
|
||||||
class Process;
|
class Process;
|
||||||
class ProcessAttachInfo;
|
class ProcessAttachInfo;
|
||||||
|
class ProcessLaunchInfo;
|
||||||
class ProcessInfo;
|
class ProcessInfo;
|
||||||
class ProcessInstanceInfo;
|
class ProcessInstanceInfo;
|
||||||
class ProcessInstanceInfoMatch;
|
class ProcessInstanceInfoMatch;
|
||||||
@ -180,6 +181,7 @@ class RichManglingContext;
|
|||||||
class Scalar;
|
class Scalar;
|
||||||
class ScriptInterpreter;
|
class ScriptInterpreter;
|
||||||
class ScriptInterpreterLocker;
|
class ScriptInterpreterLocker;
|
||||||
|
class ScriptedPlatformInterface;
|
||||||
class ScriptedProcessInterface;
|
class ScriptedProcessInterface;
|
||||||
class ScriptedThreadInterface;
|
class ScriptedThreadInterface;
|
||||||
class ScriptedSyntheticChildren;
|
class ScriptedSyntheticChildren;
|
||||||
@ -364,6 +366,7 @@ typedef std::shared_ptr<lldb_private::OptionValueProperties>
|
|||||||
typedef std::shared_ptr<lldb_private::Platform> PlatformSP;
|
typedef std::shared_ptr<lldb_private::Platform> PlatformSP;
|
||||||
typedef std::shared_ptr<lldb_private::Process> ProcessSP;
|
typedef std::shared_ptr<lldb_private::Process> ProcessSP;
|
||||||
typedef std::shared_ptr<lldb_private::ProcessAttachInfo> ProcessAttachInfoSP;
|
typedef std::shared_ptr<lldb_private::ProcessAttachInfo> ProcessAttachInfoSP;
|
||||||
|
typedef std::shared_ptr<lldb_private::ProcessLaunchInfo> ProcessLaunchInfoSP;
|
||||||
typedef std::weak_ptr<lldb_private::Process> ProcessWP;
|
typedef std::weak_ptr<lldb_private::Process> ProcessWP;
|
||||||
typedef std::shared_ptr<lldb_private::RegisterCheckpoint> RegisterCheckpointSP;
|
typedef std::shared_ptr<lldb_private::RegisterCheckpoint> RegisterCheckpointSP;
|
||||||
typedef std::shared_ptr<lldb_private::RegisterContext> RegisterContextSP;
|
typedef std::shared_ptr<lldb_private::RegisterContext> RegisterContextSP;
|
||||||
@ -377,6 +380,8 @@ typedef std::shared_ptr<lldb_private::RecognizedStackFrame>
|
|||||||
typedef std::shared_ptr<lldb_private::ScriptSummaryFormat>
|
typedef std::shared_ptr<lldb_private::ScriptSummaryFormat>
|
||||||
ScriptSummaryFormatSP;
|
ScriptSummaryFormatSP;
|
||||||
typedef std::shared_ptr<lldb_private::ScriptInterpreter> ScriptInterpreterSP;
|
typedef std::shared_ptr<lldb_private::ScriptInterpreter> ScriptInterpreterSP;
|
||||||
|
typedef std::unique_ptr<lldb_private::ScriptedPlatformInterface>
|
||||||
|
ScriptedPlatformInterfaceUP;
|
||||||
typedef std::unique_ptr<lldb_private::ScriptedProcessInterface>
|
typedef std::unique_ptr<lldb_private::ScriptedProcessInterface>
|
||||||
ScriptedProcessInterfaceUP;
|
ScriptedProcessInterfaceUP;
|
||||||
typedef std::shared_ptr<lldb_private::ScriptedThreadInterface>
|
typedef std::shared_ptr<lldb_private::ScriptedThreadInterface>
|
||||||
|
@ -29,10 +29,12 @@ using namespace lldb_private;
|
|||||||
|
|
||||||
ScriptInterpreter::ScriptInterpreter(
|
ScriptInterpreter::ScriptInterpreter(
|
||||||
Debugger &debugger, lldb::ScriptLanguage script_lang,
|
Debugger &debugger, lldb::ScriptLanguage script_lang,
|
||||||
lldb::ScriptedProcessInterfaceUP scripted_process_interface_up)
|
lldb::ScriptedProcessInterfaceUP scripted_process_interface_up,
|
||||||
|
lldb::ScriptedPlatformInterfaceUP scripted_platform_interface_up)
|
||||||
: m_debugger(debugger), m_script_lang(script_lang),
|
: m_debugger(debugger), m_script_lang(script_lang),
|
||||||
m_scripted_process_interface_up(
|
m_scripted_process_interface_up(std::move(scripted_process_interface_up)),
|
||||||
std::move(scripted_process_interface_up)) {}
|
m_scripted_platform_interface_up(
|
||||||
|
std::move(scripted_platform_interface_up)) {}
|
||||||
|
|
||||||
void ScriptInterpreter::CollectDataForBreakpointCommandCallback(
|
void ScriptInterpreter::CollectDataForBreakpointCommandCallback(
|
||||||
std::vector<std::reference_wrapper<BreakpointOptions>> &bp_options_vec,
|
std::vector<std::reference_wrapper<BreakpointOptions>> &bp_options_vec,
|
||||||
|
@ -20,6 +20,7 @@ add_lldb_library(lldbPluginScriptInterpreterPython PLUGIN
|
|||||||
ScriptedPythonInterface.cpp
|
ScriptedPythonInterface.cpp
|
||||||
ScriptedProcessPythonInterface.cpp
|
ScriptedProcessPythonInterface.cpp
|
||||||
ScriptedThreadPythonInterface.cpp
|
ScriptedThreadPythonInterface.cpp
|
||||||
|
ScriptedPlatformPythonInterface.cpp
|
||||||
|
|
||||||
LINK_LIBS
|
LINK_LIBS
|
||||||
lldbBreakpoint
|
lldbBreakpoint
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "PythonReadline.h"
|
#include "PythonReadline.h"
|
||||||
#include "SWIGPythonBridge.h"
|
#include "SWIGPythonBridge.h"
|
||||||
#include "ScriptInterpreterPythonImpl.h"
|
#include "ScriptInterpreterPythonImpl.h"
|
||||||
|
#include "ScriptedPlatformPythonInterface.h"
|
||||||
#include "ScriptedProcessPythonInterface.h"
|
#include "ScriptedProcessPythonInterface.h"
|
||||||
|
|
||||||
#include "lldb/API/SBError.h"
|
#include "lldb/API/SBError.h"
|
||||||
@ -413,6 +414,8 @@ ScriptInterpreterPythonImpl::ScriptInterpreterPythonImpl(Debugger &debugger)
|
|||||||
m_command_thread_state(nullptr) {
|
m_command_thread_state(nullptr) {
|
||||||
m_scripted_process_interface_up =
|
m_scripted_process_interface_up =
|
||||||
std::make_unique<ScriptedProcessPythonInterface>(*this);
|
std::make_unique<ScriptedProcessPythonInterface>(*this);
|
||||||
|
m_scripted_platform_interface_up =
|
||||||
|
std::make_unique<ScriptedPlatformPythonInterface>(*this);
|
||||||
|
|
||||||
m_dictionary_name.append("_dict");
|
m_dictionary_name.append("_dict");
|
||||||
StreamString run_string;
|
StreamString run_string;
|
||||||
|
@ -0,0 +1,108 @@
|
|||||||
|
//===-- ScriptedPlatformPythonInterface.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/Host/Config.h"
|
||||||
|
#include "lldb/Utility/Log.h"
|
||||||
|
#include "lldb/Utility/Status.h"
|
||||||
|
#include "lldb/lldb-enumerations.h"
|
||||||
|
|
||||||
|
#if LLDB_ENABLE_PYTHON
|
||||||
|
|
||||||
|
// LLDB Python header must be included first
|
||||||
|
#include "lldb-python.h"
|
||||||
|
|
||||||
|
#include "SWIGPythonBridge.h"
|
||||||
|
#include "ScriptInterpreterPythonImpl.h"
|
||||||
|
#include "ScriptedPlatformPythonInterface.h"
|
||||||
|
|
||||||
|
using namespace lldb;
|
||||||
|
using namespace lldb_private;
|
||||||
|
using namespace lldb_private::python;
|
||||||
|
using Locker = ScriptInterpreterPythonImpl::Locker;
|
||||||
|
|
||||||
|
ScriptedPlatformPythonInterface::ScriptedPlatformPythonInterface(
|
||||||
|
ScriptInterpreterPythonImpl &interpreter)
|
||||||
|
: ScriptedPlatformInterface(), ScriptedPythonInterface(interpreter) {}
|
||||||
|
|
||||||
|
StructuredData::GenericSP ScriptedPlatformPythonInterface::CreatePluginObject(
|
||||||
|
llvm::StringRef class_name, ExecutionContext &exe_ctx,
|
||||||
|
StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) {
|
||||||
|
if (class_name.empty())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
StructuredDataImpl args_impl(args_sp);
|
||||||
|
std::string error_string;
|
||||||
|
|
||||||
|
Locker py_lock(&m_interpreter, Locker::AcquireLock | Locker::NoSTDIN,
|
||||||
|
Locker::FreeLock);
|
||||||
|
|
||||||
|
lldb::ExecutionContextRefSP exe_ctx_ref_sp =
|
||||||
|
std::make_shared<ExecutionContextRef>(exe_ctx);
|
||||||
|
|
||||||
|
PythonObject ret_val = LLDBSwigPythonCreateScriptedObject(
|
||||||
|
class_name.str().c_str(), m_interpreter.GetDictionaryName(),
|
||||||
|
exe_ctx_ref_sp, args_impl, error_string);
|
||||||
|
|
||||||
|
m_object_instance_sp =
|
||||||
|
StructuredData::GenericSP(new StructuredPythonObject(std::move(ret_val)));
|
||||||
|
|
||||||
|
return m_object_instance_sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
StructuredData::DictionarySP ScriptedPlatformPythonInterface::ListProcesses() {
|
||||||
|
Status error;
|
||||||
|
StructuredData::DictionarySP dict_sp =
|
||||||
|
Dispatch<StructuredData::DictionarySP>("list_processes", error);
|
||||||
|
|
||||||
|
if (!dict_sp || !dict_sp->IsValid() || error.Fail()) {
|
||||||
|
return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>(
|
||||||
|
LLVM_PRETTY_FUNCTION,
|
||||||
|
llvm::Twine("Null or invalid object (" +
|
||||||
|
llvm::Twine(error.AsCString()) + llvm::Twine(")."))
|
||||||
|
.str(),
|
||||||
|
error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dict_sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
StructuredData::DictionarySP
|
||||||
|
ScriptedPlatformPythonInterface::GetProcessInfo(lldb::pid_t pid) {
|
||||||
|
Status error;
|
||||||
|
StructuredData::DictionarySP dict_sp =
|
||||||
|
Dispatch<StructuredData::DictionarySP>("get_process_info", error, pid);
|
||||||
|
|
||||||
|
if (!dict_sp || !dict_sp->IsValid() || error.Fail()) {
|
||||||
|
return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>(
|
||||||
|
LLVM_PRETTY_FUNCTION,
|
||||||
|
llvm::Twine("Null or invalid object (" +
|
||||||
|
llvm::Twine(error.AsCString()) + llvm::Twine(")."))
|
||||||
|
.str(),
|
||||||
|
error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dict_sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status ScriptedPlatformPythonInterface::AttachToProcess(
|
||||||
|
ProcessAttachInfoSP attach_info) {
|
||||||
|
// FIXME: Pass `attach_info` to method call
|
||||||
|
return GetStatusFromMethod("attach_to_process");
|
||||||
|
}
|
||||||
|
|
||||||
|
Status ScriptedPlatformPythonInterface::LaunchProcess(
|
||||||
|
ProcessLaunchInfoSP launch_info) {
|
||||||
|
// FIXME: Pass `launch_info` to method call
|
||||||
|
return GetStatusFromMethod("launch_process");
|
||||||
|
}
|
||||||
|
|
||||||
|
Status ScriptedPlatformPythonInterface::KillProcess(lldb::pid_t pid) {
|
||||||
|
return GetStatusFromMethod("kill_process", pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // LLDB_ENABLE_PYTHON
|
@ -0,0 +1,44 @@
|
|||||||
|
//===-- ScriptedPlatformPythonInterface.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_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTEDPLATFORMPYTHONINTERFACE_H
|
||||||
|
#define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTEDPLATFORMPYTHONINTERFACE_H
|
||||||
|
|
||||||
|
#include "lldb/Host/Config.h"
|
||||||
|
|
||||||
|
#if LLDB_ENABLE_PYTHON
|
||||||
|
|
||||||
|
#include "ScriptedPythonInterface.h"
|
||||||
|
#include "lldb/Interpreter/ScriptedPlatformInterface.h"
|
||||||
|
|
||||||
|
namespace lldb_private {
|
||||||
|
class ScriptedPlatformPythonInterface : public ScriptedPlatformInterface,
|
||||||
|
public ScriptedPythonInterface {
|
||||||
|
public:
|
||||||
|
ScriptedPlatformPythonInterface(ScriptInterpreterPythonImpl &interpreter);
|
||||||
|
|
||||||
|
StructuredData::GenericSP
|
||||||
|
CreatePluginObject(const llvm::StringRef class_name,
|
||||||
|
ExecutionContext &exe_ctx,
|
||||||
|
StructuredData::DictionarySP args_sp,
|
||||||
|
StructuredData::Generic *script_obj = nullptr) override;
|
||||||
|
|
||||||
|
StructuredData::DictionarySP ListProcesses() override;
|
||||||
|
|
||||||
|
StructuredData::DictionarySP GetProcessInfo(lldb::pid_t) override;
|
||||||
|
|
||||||
|
Status AttachToProcess(lldb::ProcessAttachInfoSP attach_info) override;
|
||||||
|
|
||||||
|
Status LaunchProcess(lldb::ProcessLaunchInfoSP launch_info) override;
|
||||||
|
|
||||||
|
Status KillProcess(lldb::pid_t pid) override;
|
||||||
|
};
|
||||||
|
} // namespace lldb_private
|
||||||
|
|
||||||
|
#endif // LLDB_ENABLE_PYTHON
|
||||||
|
#endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTEDPLATFORMPYTHONINTERFACE_H
|
Loading…
Reference in New Issue
Block a user