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/ThreadedCommunication.h"
|
||||
#include "lldb/Host/PseudoTerminal.h"
|
||||
#include "lldb/Interpreter/ScriptedPlatformInterface.h"
|
||||
#include "lldb/Interpreter/ScriptedProcessInterface.h"
|
||||
#include "lldb/Utility/Broadcaster.h"
|
||||
#include "lldb/Utility/Status.h"
|
||||
@ -147,7 +148,9 @@ public:
|
||||
ScriptInterpreter(
|
||||
Debugger &debugger, lldb::ScriptLanguage script_lang,
|
||||
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();
|
||||
|
||||
@ -571,6 +574,10 @@ public:
|
||||
return *m_scripted_process_interface_up;
|
||||
}
|
||||
|
||||
ScriptedPlatformInterface &GetScriptedPlatformInterface() {
|
||||
return *m_scripted_platform_interface_up;
|
||||
}
|
||||
|
||||
lldb::DataExtractorSP
|
||||
GetDataExtractorFromSBData(const lldb::SBData &data) const;
|
||||
|
||||
@ -583,6 +590,7 @@ protected:
|
||||
Debugger &m_debugger;
|
||||
lldb::ScriptLanguage m_script_lang;
|
||||
lldb::ScriptedProcessInterfaceUP m_scripted_process_interface_up;
|
||||
lldb::ScriptedPlatformInterfaceUP m_scripted_platform_interface_up;
|
||||
};
|
||||
|
||||
} // 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 Process;
|
||||
class ProcessAttachInfo;
|
||||
class ProcessLaunchInfo;
|
||||
class ProcessInfo;
|
||||
class ProcessInstanceInfo;
|
||||
class ProcessInstanceInfoMatch;
|
||||
@ -180,6 +181,7 @@ class RichManglingContext;
|
||||
class Scalar;
|
||||
class ScriptInterpreter;
|
||||
class ScriptInterpreterLocker;
|
||||
class ScriptedPlatformInterface;
|
||||
class ScriptedProcessInterface;
|
||||
class ScriptedThreadInterface;
|
||||
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::Process> ProcessSP;
|
||||
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::shared_ptr<lldb_private::RegisterCheckpoint> RegisterCheckpointSP;
|
||||
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>
|
||||
ScriptSummaryFormatSP;
|
||||
typedef std::shared_ptr<lldb_private::ScriptInterpreter> ScriptInterpreterSP;
|
||||
typedef std::unique_ptr<lldb_private::ScriptedPlatformInterface>
|
||||
ScriptedPlatformInterfaceUP;
|
||||
typedef std::unique_ptr<lldb_private::ScriptedProcessInterface>
|
||||
ScriptedProcessInterfaceUP;
|
||||
typedef std::shared_ptr<lldb_private::ScriptedThreadInterface>
|
||||
|
@ -29,10 +29,12 @@ using namespace lldb_private;
|
||||
|
||||
ScriptInterpreter::ScriptInterpreter(
|
||||
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_scripted_process_interface_up(
|
||||
std::move(scripted_process_interface_up)) {}
|
||||
m_scripted_process_interface_up(std::move(scripted_process_interface_up)),
|
||||
m_scripted_platform_interface_up(
|
||||
std::move(scripted_platform_interface_up)) {}
|
||||
|
||||
void ScriptInterpreter::CollectDataForBreakpointCommandCallback(
|
||||
std::vector<std::reference_wrapper<BreakpointOptions>> &bp_options_vec,
|
||||
|
@ -20,6 +20,7 @@ add_lldb_library(lldbPluginScriptInterpreterPython PLUGIN
|
||||
ScriptedPythonInterface.cpp
|
||||
ScriptedProcessPythonInterface.cpp
|
||||
ScriptedThreadPythonInterface.cpp
|
||||
ScriptedPlatformPythonInterface.cpp
|
||||
|
||||
LINK_LIBS
|
||||
lldbBreakpoint
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "PythonReadline.h"
|
||||
#include "SWIGPythonBridge.h"
|
||||
#include "ScriptInterpreterPythonImpl.h"
|
||||
#include "ScriptedPlatformPythonInterface.h"
|
||||
#include "ScriptedProcessPythonInterface.h"
|
||||
|
||||
#include "lldb/API/SBError.h"
|
||||
@ -413,6 +414,8 @@ ScriptInterpreterPythonImpl::ScriptInterpreterPythonImpl(Debugger &debugger)
|
||||
m_command_thread_state(nullptr) {
|
||||
m_scripted_process_interface_up =
|
||||
std::make_unique<ScriptedProcessPythonInterface>(*this);
|
||||
m_scripted_platform_interface_up =
|
||||
std::make_unique<ScriptedPlatformPythonInterface>(*this);
|
||||
|
||||
m_dictionary_name.append("_dict");
|
||||
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