1*35653324SMed Ismail Bennani //===-- ScriptedPlatformPythonInterface.cpp -------------------------------===// 2*35653324SMed Ismail Bennani // 3*35653324SMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*35653324SMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information. 5*35653324SMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*35653324SMed Ismail Bennani // 7*35653324SMed Ismail Bennani //===----------------------------------------------------------------------===// 8*35653324SMed Ismail Bennani 9*35653324SMed Ismail Bennani #include "lldb/Core/PluginManager.h" 10*35653324SMed Ismail Bennani #include "lldb/Host/Config.h" 11*35653324SMed Ismail Bennani #include "lldb/Target/ExecutionContext.h" 12*35653324SMed Ismail Bennani #include "lldb/Utility/Log.h" 13*35653324SMed Ismail Bennani #include "lldb/Utility/Status.h" 14*35653324SMed Ismail Bennani #include "lldb/lldb-enumerations.h" 15*35653324SMed Ismail Bennani 16*35653324SMed Ismail Bennani #if LLDB_ENABLE_PYTHON 17*35653324SMed Ismail Bennani 18*35653324SMed Ismail Bennani // clang-format off 19*35653324SMed Ismail Bennani // LLDB Python header must be included first 20*35653324SMed Ismail Bennani #include "../lldb-python.h" 21*35653324SMed Ismail Bennani //clang-format on 22*35653324SMed Ismail Bennani 23*35653324SMed Ismail Bennani #include "../SWIGPythonBridge.h" 24*35653324SMed Ismail Bennani #include "../ScriptInterpreterPythonImpl.h" 25*35653324SMed Ismail Bennani #include "ScriptedPlatformPythonInterface.h" 26*35653324SMed Ismail Bennani 27*35653324SMed Ismail Bennani using namespace lldb; 28*35653324SMed Ismail Bennani using namespace lldb_private; 29*35653324SMed Ismail Bennani using namespace lldb_private::python; 30*35653324SMed Ismail Bennani using Locker = ScriptInterpreterPythonImpl::Locker; 31*35653324SMed Ismail Bennani 32*35653324SMed Ismail Bennani ScriptedPlatformPythonInterface::ScriptedPlatformPythonInterface( 33*35653324SMed Ismail Bennani ScriptInterpreterPythonImpl &interpreter) 34*35653324SMed Ismail Bennani : ScriptedPlatformInterface(), ScriptedPythonInterface(interpreter) {} 35*35653324SMed Ismail Bennani 36*35653324SMed Ismail Bennani llvm::Expected<StructuredData::GenericSP> 37*35653324SMed Ismail Bennani ScriptedPlatformPythonInterface::CreatePluginObject( 38*35653324SMed Ismail Bennani llvm::StringRef class_name, ExecutionContext &exe_ctx, 39*35653324SMed Ismail Bennani StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) { 40*35653324SMed Ismail Bennani ExecutionContextRefSP exe_ctx_ref_sp = 41*35653324SMed Ismail Bennani std::make_shared<ExecutionContextRef>(exe_ctx); 42*35653324SMed Ismail Bennani StructuredDataImpl sd_impl(args_sp); 43*35653324SMed Ismail Bennani return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj, 44*35653324SMed Ismail Bennani exe_ctx_ref_sp, sd_impl); 45*35653324SMed Ismail Bennani } 46*35653324SMed Ismail Bennani 47*35653324SMed Ismail Bennani StructuredData::DictionarySP ScriptedPlatformPythonInterface::ListProcesses() { 48*35653324SMed Ismail Bennani Status error; 49*35653324SMed Ismail Bennani StructuredData::DictionarySP dict_sp = 50*35653324SMed Ismail Bennani Dispatch<StructuredData::DictionarySP>("list_processes", error); 51*35653324SMed Ismail Bennani 52*35653324SMed Ismail Bennani if (!dict_sp || !dict_sp->IsValid() || error.Fail()) { 53*35653324SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>( 54*35653324SMed Ismail Bennani LLVM_PRETTY_FUNCTION, 55*35653324SMed Ismail Bennani llvm::Twine("Null or invalid object (" + 56*35653324SMed Ismail Bennani llvm::Twine(error.AsCString()) + llvm::Twine(").")) 57*35653324SMed Ismail Bennani .str(), 58*35653324SMed Ismail Bennani error); 59*35653324SMed Ismail Bennani } 60*35653324SMed Ismail Bennani 61*35653324SMed Ismail Bennani return dict_sp; 62*35653324SMed Ismail Bennani } 63*35653324SMed Ismail Bennani 64*35653324SMed Ismail Bennani StructuredData::DictionarySP 65*35653324SMed Ismail Bennani ScriptedPlatformPythonInterface::GetProcessInfo(lldb::pid_t pid) { 66*35653324SMed Ismail Bennani Status error; 67*35653324SMed Ismail Bennani StructuredData::DictionarySP dict_sp = 68*35653324SMed Ismail Bennani Dispatch<StructuredData::DictionarySP>("get_process_info", error, pid); 69*35653324SMed Ismail Bennani 70*35653324SMed Ismail Bennani if (!dict_sp || !dict_sp->IsValid() || error.Fail()) { 71*35653324SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>( 72*35653324SMed Ismail Bennani LLVM_PRETTY_FUNCTION, 73*35653324SMed Ismail Bennani llvm::Twine("Null or invalid object (" + 74*35653324SMed Ismail Bennani llvm::Twine(error.AsCString()) + llvm::Twine(").")) 75*35653324SMed Ismail Bennani .str(), 76*35653324SMed Ismail Bennani error); 77*35653324SMed Ismail Bennani } 78*35653324SMed Ismail Bennani 79*35653324SMed Ismail Bennani return dict_sp; 80*35653324SMed Ismail Bennani } 81*35653324SMed Ismail Bennani 82*35653324SMed Ismail Bennani Status ScriptedPlatformPythonInterface::AttachToProcess( 83*35653324SMed Ismail Bennani ProcessAttachInfoSP attach_info) { 84*35653324SMed Ismail Bennani // FIXME: Pass `attach_info` to method call 85*35653324SMed Ismail Bennani return GetStatusFromMethod("attach_to_process"); 86*35653324SMed Ismail Bennani } 87*35653324SMed Ismail Bennani 88*35653324SMed Ismail Bennani Status ScriptedPlatformPythonInterface::LaunchProcess( 89*35653324SMed Ismail Bennani ProcessLaunchInfoSP launch_info) { 90*35653324SMed Ismail Bennani // FIXME: Pass `launch_info` to method call 91*35653324SMed Ismail Bennani return GetStatusFromMethod("launch_process"); 92*35653324SMed Ismail Bennani } 93*35653324SMed Ismail Bennani 94*35653324SMed Ismail Bennani Status ScriptedPlatformPythonInterface::KillProcess(lldb::pid_t pid) { 95*35653324SMed Ismail Bennani return GetStatusFromMethod("kill_process", pid); 96*35653324SMed Ismail Bennani } 97*35653324SMed Ismail Bennani 98*35653324SMed Ismail Bennani void ScriptedPlatformPythonInterface::Initialize() { 99*35653324SMed Ismail Bennani PluginManager::RegisterPlugin( 100*35653324SMed Ismail Bennani GetPluginNameStatic(), "Mock platform and interact with its processes.", 101*35653324SMed Ismail Bennani CreateInstance, eScriptLanguagePython, {}); 102*35653324SMed Ismail Bennani } 103*35653324SMed Ismail Bennani 104*35653324SMed Ismail Bennani void ScriptedPlatformPythonInterface::Terminate() { 105*35653324SMed Ismail Bennani PluginManager::UnregisterPlugin(CreateInstance); 106*35653324SMed Ismail Bennani } 107*35653324SMed Ismail Bennani 108*35653324SMed Ismail Bennani #endif // LLDB_ENABLE_PYTHON 109