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