/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
Line | Count | Source |
1 | | //===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===// |
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 | | #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SWIGPYTHONBRIDGE_H |
10 | | #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SWIGPYTHONBRIDGE_H |
11 | | |
12 | | #include <optional> |
13 | | #include <string> |
14 | | |
15 | | #include "lldb/Host/Config.h" |
16 | | |
17 | | #if LLDB_ENABLE_PYTHON |
18 | | |
19 | | // LLDB Python header must be included first |
20 | | #include "lldb-python.h" |
21 | | |
22 | | #include "Plugins/ScriptInterpreter/Python/PythonDataObjects.h" |
23 | | #include "lldb/lldb-forward.h" |
24 | | #include "lldb/lldb-types.h" |
25 | | #include "llvm/Support/Error.h" |
26 | | |
27 | | namespace lldb { |
28 | | class SBEvent; |
29 | | class SBCommandReturnObject; |
30 | | class SBValue; |
31 | | class SBStream; |
32 | | class SBStructuredData; |
33 | | class SBFileSpec; |
34 | | class SBModuleSpec; |
35 | | } // namespace lldb |
36 | | |
37 | | namespace lldb_private { |
38 | | namespace python { |
39 | | |
40 | | typedef struct swig_type_info swig_type_info; |
41 | | |
42 | | python::PythonObject ToSWIGHelper(void *obj, swig_type_info *info); |
43 | | |
44 | | /// A class that automatically clears an SB object when it goes out of scope. |
45 | | /// Use for cases where the SB object points to a temporary/unowned entity. |
46 | | template <typename T> class ScopedPythonObject : PythonObject { |
47 | | public: |
48 | | ScopedPythonObject(T *sb, swig_type_info *info) |
49 | 97 | : PythonObject(ToSWIGHelper(sb, info)), m_sb(sb) {} lldb_private::python::ScopedPythonObject<lldb::SBCommandReturnObject>::ScopedPythonObject(lldb::SBCommandReturnObject*, swig_type_info*) Line | Count | Source | 49 | 81 | : PythonObject(ToSWIGHelper(sb, info)), m_sb(sb) {} |
lldb_private::python::ScopedPythonObject<lldb::SBEvent>::ScopedPythonObject(lldb::SBEvent*, swig_type_info*) Line | Count | Source | 49 | 16 | : PythonObject(ToSWIGHelper(sb, info)), m_sb(sb) {} |
|
50 | 97 | ~ScopedPythonObject() { |
51 | 97 | if (m_sb) |
52 | 97 | *m_sb = T(); |
53 | 97 | } lldb_private::python::ScopedPythonObject<lldb::SBCommandReturnObject>::~ScopedPythonObject() Line | Count | Source | 50 | 81 | ~ScopedPythonObject() { | 51 | 81 | if (m_sb) | 52 | 81 | *m_sb = T(); | 53 | 81 | } |
lldb_private::python::ScopedPythonObject<lldb::SBEvent>::~ScopedPythonObject() Line | Count | Source | 50 | 16 | ~ScopedPythonObject() { | 51 | 16 | if (m_sb) | 52 | 16 | *m_sb = T(); | 53 | 16 | } |
|
54 | | ScopedPythonObject(ScopedPythonObject &&rhs) |
55 | | : PythonObject(std::move(rhs)), m_sb(std::exchange(rhs.m_sb, nullptr)) {} |
56 | | ScopedPythonObject(const ScopedPythonObject &) = delete; |
57 | | ScopedPythonObject &operator=(const ScopedPythonObject &) = delete; |
58 | | ScopedPythonObject &operator=(ScopedPythonObject &&) = delete; |
59 | | |
60 | 97 | const PythonObject &obj() const { return *this; } lldb_private::python::ScopedPythonObject<lldb::SBEvent>::obj() const Line | Count | Source | 60 | 16 | const PythonObject &obj() const { return *this; } |
lldb_private::python::ScopedPythonObject<lldb::SBCommandReturnObject>::obj() const Line | Count | Source | 60 | 81 | const PythonObject &obj() const { return *this; } |
|
61 | | |
62 | | private: |
63 | | T *m_sb; |
64 | | }; |
65 | | |
66 | | // TODO: We may want to support other languages in the future w/ SWIG (we |
67 | | // already support Lua right now, for example). We could create a generic |
68 | | // SWIGBridge class and have this one specialize it, something like this: |
69 | | // |
70 | | // <typename T> |
71 | | // class SWIGBridge { |
72 | | // static T ToSWIGWrapper(...); |
73 | | // }; |
74 | | // |
75 | | // class SWIGPythonBridge : public SWIGBridge<PythonObject> { |
76 | | // template<> static PythonObject ToSWIGWrapper(...); |
77 | | // }; |
78 | | // |
79 | | // And we should be able to more easily support things like Lua |
80 | | class SWIGBridge { |
81 | | public: |
82 | | static PythonObject ToSWIGWrapper(std::unique_ptr<lldb::SBValue> value_sb); |
83 | | static PythonObject ToSWIGWrapper(lldb::ValueObjectSP value_sp); |
84 | | static PythonObject ToSWIGWrapper(lldb::TargetSP target_sp); |
85 | | static PythonObject ToSWIGWrapper(lldb::ProcessSP process_sp); |
86 | | static PythonObject ToSWIGWrapper(lldb::ThreadPlanSP thread_plan_sp); |
87 | | static PythonObject ToSWIGWrapper(lldb::BreakpointSP breakpoint_sp); |
88 | | static PythonObject ToSWIGWrapper(const Status &status); |
89 | | static PythonObject ToSWIGWrapper(const StructuredDataImpl &data_impl); |
90 | | static PythonObject ToSWIGWrapper(lldb::ThreadSP thread_sp); |
91 | | static PythonObject ToSWIGWrapper(lldb::StackFrameSP frame_sp); |
92 | | static PythonObject ToSWIGWrapper(lldb::DebuggerSP debugger_sp); |
93 | | static PythonObject ToSWIGWrapper(lldb::WatchpointSP watchpoint_sp); |
94 | | static PythonObject ToSWIGWrapper(lldb::BreakpointLocationSP bp_loc_sp); |
95 | | static PythonObject ToSWIGWrapper(lldb::TypeImplSP type_impl_sp); |
96 | | static PythonObject ToSWIGWrapper(lldb::ExecutionContextRefSP ctx_sp); |
97 | | static PythonObject ToSWIGWrapper(const TypeSummaryOptions &summary_options); |
98 | | static PythonObject ToSWIGWrapper(const SymbolContext &sym_ctx); |
99 | | |
100 | | static PythonObject ToSWIGWrapper(lldb::ProcessAttachInfoSP attach_info_sp); |
101 | | static PythonObject ToSWIGWrapper(lldb::ProcessLaunchInfoSP launch_info_sp); |
102 | | static PythonObject ToSWIGWrapper(lldb::DataExtractorSP data_extractor_sp); |
103 | | |
104 | | static PythonObject ToSWIGWrapper(std::unique_ptr<lldb::SBStream> stream_sb); |
105 | | static PythonObject |
106 | | ToSWIGWrapper(std::unique_ptr<lldb::SBStructuredData> data_sb); |
107 | | static PythonObject |
108 | | ToSWIGWrapper(std::unique_ptr<lldb::SBFileSpec> file_spec_sb); |
109 | | static PythonObject |
110 | | ToSWIGWrapper(std::unique_ptr<lldb::SBModuleSpec> module_spec_sb); |
111 | | |
112 | | static python::ScopedPythonObject<lldb::SBCommandReturnObject> |
113 | | ToSWIGWrapper(CommandReturnObject &cmd_retobj); |
114 | | static python::ScopedPythonObject<lldb::SBEvent> ToSWIGWrapper(Event *event); |
115 | | // These prototypes are the Pythonic implementations of the required |
116 | | // callbacks. Although these are scripting-language specific, their definition |
117 | | // depends on the public API. |
118 | | |
119 | | static python::PythonObject LLDBSwigPythonCreateScriptedObject( |
120 | | const char *python_class_name, const char *session_dictionary_name, |
121 | | lldb::ExecutionContextRefSP exe_ctx_sp, |
122 | | const lldb_private::StructuredDataImpl &args_impl, |
123 | | std::string &error_string); |
124 | | |
125 | | static llvm::Expected<bool> LLDBSwigPythonBreakpointCallbackFunction( |
126 | | const char *python_function_name, const char *session_dictionary_name, |
127 | | const lldb::StackFrameSP &sb_frame, |
128 | | const lldb::BreakpointLocationSP &sb_bp_loc, |
129 | | const lldb_private::StructuredDataImpl &args_impl); |
130 | | |
131 | | static bool LLDBSwigPythonWatchpointCallbackFunction( |
132 | | const char *python_function_name, const char *session_dictionary_name, |
133 | | const lldb::StackFrameSP &sb_frame, const lldb::WatchpointSP &sb_wp); |
134 | | |
135 | | static bool |
136 | | LLDBSwigPythonFormatterCallbackFunction(const char *python_function_name, |
137 | | const char *session_dictionary_name, |
138 | | lldb::TypeImplSP type_impl_sp); |
139 | | |
140 | | static bool LLDBSwigPythonCallTypeScript( |
141 | | const char *python_function_name, const void *session_dictionary, |
142 | | const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper, |
143 | | const lldb::TypeSummaryOptionsSP &options_sp, std::string &retval); |
144 | | |
145 | | static python::PythonObject |
146 | | LLDBSwigPythonCreateSyntheticProvider(const char *python_class_name, |
147 | | const char *session_dictionary_name, |
148 | | const lldb::ValueObjectSP &valobj_sp); |
149 | | |
150 | | static python::PythonObject |
151 | | LLDBSwigPythonCreateCommandObject(const char *python_class_name, |
152 | | const char *session_dictionary_name, |
153 | | lldb::DebuggerSP debugger_sp); |
154 | | |
155 | | static python::PythonObject LLDBSwigPythonCreateScriptedThreadPlan( |
156 | | const char *python_class_name, const char *session_dictionary_name, |
157 | | const StructuredDataImpl &args_data, std::string &error_string, |
158 | | const lldb::ThreadPlanSP &thread_plan_sp); |
159 | | |
160 | | static bool LLDBSWIGPythonCallThreadPlan(void *implementor, |
161 | | const char *method_name, |
162 | | lldb_private::Event *event_sp, |
163 | | bool &got_error); |
164 | | |
165 | | static bool LLDBSWIGPythonCallThreadPlan(void *implementor, |
166 | | const char *method_name, |
167 | | lldb_private::Stream *stream, |
168 | | bool &got_error); |
169 | | |
170 | | static python::PythonObject LLDBSwigPythonCreateScriptedBreakpointResolver( |
171 | | const char *python_class_name, const char *session_dictionary_name, |
172 | | const StructuredDataImpl &args, const lldb::BreakpointSP &bkpt_sp); |
173 | | |
174 | | static unsigned int |
175 | | LLDBSwigPythonCallBreakpointResolver(void *implementor, |
176 | | const char *method_name, |
177 | | lldb_private::SymbolContext *sym_ctx); |
178 | | |
179 | | static python::PythonObject LLDBSwigPythonCreateScriptedStopHook( |
180 | | lldb::TargetSP target_sp, const char *python_class_name, |
181 | | const char *session_dictionary_name, const StructuredDataImpl &args, |
182 | | lldb_private::Status &error); |
183 | | |
184 | | static bool |
185 | | LLDBSwigPythonStopHookCallHandleStop(void *implementor, |
186 | | lldb::ExecutionContextRefSP exc_ctx, |
187 | | lldb::StreamSP stream); |
188 | | |
189 | | static size_t LLDBSwigPython_CalculateNumChildren(PyObject *implementor, |
190 | | uint32_t max); |
191 | | |
192 | | static PyObject *LLDBSwigPython_GetChildAtIndex(PyObject *implementor, |
193 | | uint32_t idx); |
194 | | |
195 | | static int LLDBSwigPython_GetIndexOfChildWithName(PyObject *implementor, |
196 | | const char *child_name); |
197 | | |
198 | | static lldb::ValueObjectSP |
199 | | LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data); |
200 | | |
201 | | static bool LLDBSwigPython_UpdateSynthProviderInstance(PyObject *implementor); |
202 | | |
203 | | static bool |
204 | | LLDBSwigPython_MightHaveChildrenSynthProviderInstance(PyObject *implementor); |
205 | | |
206 | | static PyObject * |
207 | | LLDBSwigPython_GetValueSynthProviderInstance(PyObject *implementor); |
208 | | |
209 | | static bool |
210 | | LLDBSwigPythonCallCommand(const char *python_function_name, |
211 | | const char *session_dictionary_name, |
212 | | lldb::DebuggerSP debugger, const char *args, |
213 | | lldb_private::CommandReturnObject &cmd_retobj, |
214 | | lldb::ExecutionContextRefSP exe_ctx_ref_sp); |
215 | | |
216 | | static bool |
217 | | LLDBSwigPythonCallCommandObject(PyObject *implementor, |
218 | | lldb::DebuggerSP debugger, const char *args, |
219 | | lldb_private::CommandReturnObject &cmd_retobj, |
220 | | lldb::ExecutionContextRefSP exe_ctx_ref_sp); |
221 | | |
222 | | static bool LLDBSwigPythonCallModuleInit(const char *python_module_name, |
223 | | const char *session_dictionary_name, |
224 | | lldb::DebuggerSP debugger); |
225 | | |
226 | | static python::PythonObject |
227 | | LLDBSWIGPythonCreateOSPlugin(const char *python_class_name, |
228 | | const char *session_dictionary_name, |
229 | | const lldb::ProcessSP &process_sp); |
230 | | |
231 | | static python::PythonObject |
232 | | LLDBSWIGPython_CreateFrameRecognizer(const char *python_class_name, |
233 | | const char *session_dictionary_name); |
234 | | |
235 | | static PyObject * |
236 | | LLDBSwigPython_GetRecognizedArguments(PyObject *implementor, |
237 | | const lldb::StackFrameSP &frame_sp); |
238 | | |
239 | | static bool LLDBSWIGPythonRunScriptKeywordProcess( |
240 | | const char *python_function_name, const char *session_dictionary_name, |
241 | | const lldb::ProcessSP &process, std::string &output); |
242 | | |
243 | | static std::optional<std::string> |
244 | | LLDBSWIGPythonRunScriptKeywordThread(const char *python_function_name, |
245 | | const char *session_dictionary_name, |
246 | | lldb::ThreadSP thread); |
247 | | |
248 | | static bool LLDBSWIGPythonRunScriptKeywordTarget( |
249 | | const char *python_function_name, const char *session_dictionary_name, |
250 | | const lldb::TargetSP &target, std::string &output); |
251 | | |
252 | | static std::optional<std::string> |
253 | | LLDBSWIGPythonRunScriptKeywordFrame(const char *python_function_name, |
254 | | const char *session_dictionary_name, |
255 | | lldb::StackFrameSP frame); |
256 | | |
257 | | static bool LLDBSWIGPythonRunScriptKeywordValue( |
258 | | const char *python_function_name, const char *session_dictionary_name, |
259 | | const lldb::ValueObjectSP &value, std::string &output); |
260 | | |
261 | | static void * |
262 | | LLDBSWIGPython_GetDynamicSetting(void *module, const char *setting, |
263 | | const lldb::TargetSP &target_sp); |
264 | | }; |
265 | | |
266 | | void *LLDBSWIGPython_CastPyObjectToSBData(PyObject *data); |
267 | | void *LLDBSWIGPython_CastPyObjectToSBBreakpoint(PyObject *data); |
268 | | void *LLDBSWIGPython_CastPyObjectToSBAttachInfo(PyObject *data); |
269 | | void *LLDBSWIGPython_CastPyObjectToSBLaunchInfo(PyObject *data); |
270 | | void *LLDBSWIGPython_CastPyObjectToSBError(PyObject *data); |
271 | | void *LLDBSWIGPython_CastPyObjectToSBValue(PyObject *data); |
272 | | void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(PyObject *data); |
273 | | } // namespace python |
274 | | |
275 | | } // namespace lldb_private |
276 | | |
277 | | #endif // LLDB_ENABLE_PYTHON |
278 | | #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SWIGPYTHONBRIDGE_H |