1*f732157aSMed Ismail Bennani //===-- ScriptedStopHookPythonInterface.cpp -------------------------------===// 2*f732157aSMed Ismail Bennani // 3*f732157aSMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*f732157aSMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information. 5*f732157aSMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*f732157aSMed Ismail Bennani // 7*f732157aSMed Ismail Bennani //===----------------------------------------------------------------------===// 8*f732157aSMed Ismail Bennani 9*f732157aSMed Ismail Bennani #include "lldb/Core/PluginManager.h" 10*f732157aSMed Ismail Bennani #include "lldb/Host/Config.h" 11*f732157aSMed Ismail Bennani #include "lldb/Target/ExecutionContext.h" 12*f732157aSMed Ismail Bennani #include "lldb/Utility/Log.h" 13*f732157aSMed Ismail Bennani #include "lldb/lldb-enumerations.h" 14*f732157aSMed Ismail Bennani 15*f732157aSMed Ismail Bennani #if LLDB_ENABLE_PYTHON 16*f732157aSMed Ismail Bennani 17*f732157aSMed Ismail Bennani // clang-format off 18*f732157aSMed Ismail Bennani // LLDB Python header must be included first 19*f732157aSMed Ismail Bennani #include "../lldb-python.h" 20*f732157aSMed Ismail Bennani //clang-format on 21*f732157aSMed Ismail Bennani 22*f732157aSMed Ismail Bennani #include "../SWIGPythonBridge.h" 23*f732157aSMed Ismail Bennani #include "../ScriptInterpreterPythonImpl.h" 24*f732157aSMed Ismail Bennani #include "ScriptedStopHookPythonInterface.h" 25*f732157aSMed Ismail Bennani 26*f732157aSMed Ismail Bennani using namespace lldb; 27*f732157aSMed Ismail Bennani using namespace lldb_private; 28*f732157aSMed Ismail Bennani using namespace lldb_private::python; 29*f732157aSMed Ismail Bennani 30*f732157aSMed Ismail Bennani ScriptedStopHookPythonInterface::ScriptedStopHookPythonInterface( 31*f732157aSMed Ismail Bennani ScriptInterpreterPythonImpl &interpreter) 32*f732157aSMed Ismail Bennani : ScriptedStopHookInterface(), ScriptedPythonInterface(interpreter) {} 33*f732157aSMed Ismail Bennani 34*f732157aSMed Ismail Bennani llvm::Expected<StructuredData::GenericSP> 35*f732157aSMed Ismail Bennani ScriptedStopHookPythonInterface::CreatePluginObject(llvm::StringRef class_name, 36*f732157aSMed Ismail Bennani lldb::TargetSP target_sp, 37*f732157aSMed Ismail Bennani const StructuredDataImpl &args_sp) { 38*f732157aSMed Ismail Bennani return ScriptedPythonInterface::CreatePluginObject(class_name, nullptr, 39*f732157aSMed Ismail Bennani target_sp, args_sp); 40*f732157aSMed Ismail Bennani } 41*f732157aSMed Ismail Bennani 42*f732157aSMed Ismail Bennani llvm::Expected<bool> 43*f732157aSMed Ismail Bennani ScriptedStopHookPythonInterface::HandleStop(ExecutionContext &exe_ctx, 44*f732157aSMed Ismail Bennani lldb::StreamSP& output_sp) { 45*f732157aSMed Ismail Bennani ExecutionContextRefSP exe_ctx_ref_sp = 46*f732157aSMed Ismail Bennani std::make_shared<ExecutionContextRef>(exe_ctx); 47*f732157aSMed Ismail Bennani Status error; 48*f732157aSMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("handle_stop", error, exe_ctx_ref_sp, output_sp); 49*f732157aSMed Ismail Bennani 50*f732157aSMed Ismail Bennani if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, 51*f732157aSMed Ismail Bennani error)) { 52*f732157aSMed Ismail Bennani if (!obj) 53*f732157aSMed Ismail Bennani return true; 54*f732157aSMed Ismail Bennani return error.ToError(); 55*f732157aSMed Ismail Bennani } 56*f732157aSMed Ismail Bennani 57*f732157aSMed Ismail Bennani return obj->GetBooleanValue(); 58*f732157aSMed Ismail Bennani } 59*f732157aSMed Ismail Bennani 60*f732157aSMed Ismail Bennani 61*f732157aSMed Ismail Bennani void ScriptedStopHookPythonInterface::Initialize() { 62*f732157aSMed Ismail Bennani const std::vector<llvm::StringRef> ci_usages = { 63*f732157aSMed Ismail Bennani "target stop-hook add -P <script-name> [-k key -v value ...]"}; 64*f732157aSMed Ismail Bennani const std::vector<llvm::StringRef> api_usages = {}; 65*f732157aSMed Ismail Bennani PluginManager::RegisterPlugin( 66*f732157aSMed Ismail Bennani GetPluginNameStatic(), 67*f732157aSMed Ismail Bennani llvm::StringRef("Perform actions whenever the process stops, before control is returned to the user."), 68*f732157aSMed Ismail Bennani CreateInstance, eScriptLanguagePython, {ci_usages, api_usages}); 69*f732157aSMed Ismail Bennani } 70*f732157aSMed Ismail Bennani 71*f732157aSMed Ismail Bennani void ScriptedStopHookPythonInterface::Terminate() { 72*f732157aSMed Ismail Bennani PluginManager::UnregisterPlugin(CreateInstance); 73*f732157aSMed Ismail Bennani } 74*f732157aSMed Ismail Bennani 75*f732157aSMed Ismail Bennani #endif 76