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