11f6a57c1SMed Ismail Bennani //===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===//
21f6a57c1SMed Ismail Bennani //
31f6a57c1SMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41f6a57c1SMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
51f6a57c1SMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61f6a57c1SMed Ismail Bennani //
71f6a57c1SMed Ismail Bennani //===----------------------------------------------------------------------===//
81f6a57c1SMed Ismail Bennani 
91f6a57c1SMed Ismail Bennani #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SWIGPYTHONBRIDGE_H
101f6a57c1SMed Ismail Bennani #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SWIGPYTHONBRIDGE_H
111f6a57c1SMed Ismail Bennani 
121f6a57c1SMed Ismail Bennani #include <string>
131f6a57c1SMed Ismail Bennani 
141f6a57c1SMed Ismail Bennani #include "lldb/Host/Config.h"
151f6a57c1SMed Ismail Bennani 
161f6a57c1SMed Ismail Bennani #if LLDB_ENABLE_PYTHON
171f6a57c1SMed Ismail Bennani 
18*9a14adeaSPavel Labath // LLDB Python header must be included first
19*9a14adeaSPavel Labath #include "lldb-python.h"
20*9a14adeaSPavel Labath 
211f6a57c1SMed Ismail Bennani #include "lldb/lldb-forward.h"
221f6a57c1SMed Ismail Bennani #include "lldb/lldb-types.h"
23*9a14adeaSPavel Labath #include "llvm/Support/Error.h"
241f6a57c1SMed Ismail Bennani 
251f6a57c1SMed Ismail Bennani namespace lldb_private {
261f6a57c1SMed Ismail Bennani 
271f6a57c1SMed Ismail Bennani // GetPythonValueFormatString provides a system independent type safe way to
281f6a57c1SMed Ismail Bennani // convert a variable's type into a python value format. Python value formats
291f6a57c1SMed Ismail Bennani // are defined in terms of builtin C types and could change from system to as
301f6a57c1SMed Ismail Bennani // the underlying typedef for uint* types, size_t, off_t and other values
311f6a57c1SMed Ismail Bennani // change.
321f6a57c1SMed Ismail Bennani 
331f6a57c1SMed Ismail Bennani template <typename T> const char *GetPythonValueFormatString(T t);
341f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(char *);
351f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(char);
361f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(unsigned char);
371f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(short);
381f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(unsigned short);
391f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(int);
401f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(unsigned int);
411f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(long);
421f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(unsigned long);
431f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(long long);
441f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(unsigned long long);
451f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(float t);
461f6a57c1SMed Ismail Bennani template <> const char *GetPythonValueFormatString(double t);
471f6a57c1SMed Ismail Bennani 
48*9a14adeaSPavel Labath void *LLDBSWIGPython_CastPyObjectToSBData(PyObject *data);
49*9a14adeaSPavel Labath void *LLDBSWIGPython_CastPyObjectToSBError(PyObject *data);
50*9a14adeaSPavel Labath void *LLDBSWIGPython_CastPyObjectToSBValue(PyObject *data);
51*9a14adeaSPavel Labath void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(PyObject *data);
52*9a14adeaSPavel Labath 
53*9a14adeaSPavel Labath // These prototypes are the Pythonic implementations of the required callbacks.
54*9a14adeaSPavel Labath // Although these are scripting-language specific, their definition depends on
55*9a14adeaSPavel Labath // the public API.
56*9a14adeaSPavel Labath 
57*9a14adeaSPavel Labath void *LLDBSwigPythonCreateScriptedProcess(const char *python_class_name,
58*9a14adeaSPavel Labath                                           const char *session_dictionary_name,
59*9a14adeaSPavel Labath                                           const lldb::TargetSP &target_sp,
60*9a14adeaSPavel Labath                                           StructuredDataImpl *args_impl,
611f6a57c1SMed Ismail Bennani                                           std::string &error_string);
621f6a57c1SMed Ismail Bennani 
63*9a14adeaSPavel Labath void *LLDBSwigPythonCreateScriptedThread(const char *python_class_name,
64*9a14adeaSPavel Labath                                          const char *session_dictionary_name,
65*9a14adeaSPavel Labath                                          const lldb::ProcessSP &process_sp,
66*9a14adeaSPavel Labath                                          StructuredDataImpl *args_impl,
67738621d0SMed Ismail Bennani                                          std::string &error_string);
6859d8dd79SMed Ismail Bennani 
69*9a14adeaSPavel Labath llvm::Expected<bool> LLDBSwigPythonBreakpointCallbackFunction(
70*9a14adeaSPavel Labath     const char *python_function_name, const char *session_dictionary_name,
71*9a14adeaSPavel Labath     const lldb::StackFrameSP &sb_frame,
72*9a14adeaSPavel Labath     const lldb::BreakpointLocationSP &sb_bp_loc,
73*9a14adeaSPavel Labath     lldb_private::StructuredDataImpl *args_impl);
74*9a14adeaSPavel Labath 
75*9a14adeaSPavel Labath bool LLDBSwigPythonWatchpointCallbackFunction(
76*9a14adeaSPavel Labath     const char *python_function_name, const char *session_dictionary_name,
77*9a14adeaSPavel Labath     const lldb::StackFrameSP &sb_frame, const lldb::WatchpointSP &sb_wp);
78*9a14adeaSPavel Labath 
79*9a14adeaSPavel Labath bool LLDBSwigPythonCallTypeScript(const char *python_function_name,
80*9a14adeaSPavel Labath                                   const void *session_dictionary,
81*9a14adeaSPavel Labath                                   const lldb::ValueObjectSP &valobj_sp,
82*9a14adeaSPavel Labath                                   void **pyfunct_wrapper,
83*9a14adeaSPavel Labath                                   const lldb::TypeSummaryOptionsSP &options_sp,
84*9a14adeaSPavel Labath                                   std::string &retval);
85*9a14adeaSPavel Labath 
86*9a14adeaSPavel Labath void *
87*9a14adeaSPavel Labath LLDBSwigPythonCreateSyntheticProvider(const char *python_class_name,
88*9a14adeaSPavel Labath                                       const char *session_dictionary_name,
89*9a14adeaSPavel Labath                                       const lldb::ValueObjectSP &valobj_sp);
90*9a14adeaSPavel Labath 
91*9a14adeaSPavel Labath void *LLDBSwigPythonCreateCommandObject(const char *python_class_name,
92*9a14adeaSPavel Labath                                         const char *session_dictionary_name,
93*9a14adeaSPavel Labath                                         const lldb::DebuggerSP debugger_sp);
94*9a14adeaSPavel Labath 
95*9a14adeaSPavel Labath void *LLDBSwigPythonCreateScriptedThreadPlan(
96*9a14adeaSPavel Labath     const char *python_class_name, const char *session_dictionary_name,
97*9a14adeaSPavel Labath     lldb_private::StructuredDataImpl *args_data, std::string &error_string,
98*9a14adeaSPavel Labath     const lldb::ThreadPlanSP &thread_plan_sp);
99*9a14adeaSPavel Labath 
100*9a14adeaSPavel Labath bool LLDBSWIGPythonCallThreadPlan(void *implementor, const char *method_name,
101*9a14adeaSPavel Labath                                   lldb_private::Event *event_sp,
102*9a14adeaSPavel Labath                                   bool &got_error);
103*9a14adeaSPavel Labath 
104*9a14adeaSPavel Labath void *LLDBSwigPythonCreateScriptedBreakpointResolver(
105*9a14adeaSPavel Labath     const char *python_class_name, const char *session_dictionary_name,
106*9a14adeaSPavel Labath     lldb_private::StructuredDataImpl *args, const lldb::BreakpointSP &bkpt_sp);
107*9a14adeaSPavel Labath 
108*9a14adeaSPavel Labath unsigned int
109*9a14adeaSPavel Labath LLDBSwigPythonCallBreakpointResolver(void *implementor, const char *method_name,
110*9a14adeaSPavel Labath                                      lldb_private::SymbolContext *sym_ctx);
111*9a14adeaSPavel Labath 
112*9a14adeaSPavel Labath void *LLDBSwigPythonCreateScriptedStopHook(
113*9a14adeaSPavel Labath     lldb::TargetSP target_sp, const char *python_class_name,
114*9a14adeaSPavel Labath     const char *session_dictionary_name, lldb_private::StructuredDataImpl *args,
115*9a14adeaSPavel Labath     lldb_private::Status &error);
116*9a14adeaSPavel Labath 
117*9a14adeaSPavel Labath bool LLDBSwigPythonStopHookCallHandleStop(void *implementor,
118*9a14adeaSPavel Labath                                           lldb::ExecutionContextRefSP exc_ctx,
119*9a14adeaSPavel Labath                                           lldb::StreamSP stream);
120*9a14adeaSPavel Labath 
121*9a14adeaSPavel Labath size_t LLDBSwigPython_CalculateNumChildren(PyObject *implementor, uint32_t max);
122*9a14adeaSPavel Labath 
123*9a14adeaSPavel Labath PyObject *LLDBSwigPython_GetChildAtIndex(PyObject *implementor, uint32_t idx);
124*9a14adeaSPavel Labath 
125*9a14adeaSPavel Labath int LLDBSwigPython_GetIndexOfChildWithName(PyObject *implementor,
126*9a14adeaSPavel Labath                                            const char *child_name);
127*9a14adeaSPavel Labath 
128*9a14adeaSPavel Labath lldb::ValueObjectSP LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data);
129*9a14adeaSPavel Labath 
130*9a14adeaSPavel Labath bool LLDBSwigPython_UpdateSynthProviderInstance(PyObject *implementor);
131*9a14adeaSPavel Labath 
132*9a14adeaSPavel Labath bool LLDBSwigPython_MightHaveChildrenSynthProviderInstance(
133*9a14adeaSPavel Labath     PyObject *implementor);
134*9a14adeaSPavel Labath 
135*9a14adeaSPavel Labath PyObject *LLDBSwigPython_GetValueSynthProviderInstance(PyObject *implementor);
136*9a14adeaSPavel Labath 
137*9a14adeaSPavel Labath bool LLDBSwigPythonCallCommand(const char *python_function_name,
138*9a14adeaSPavel Labath                                const char *session_dictionary_name,
139*9a14adeaSPavel Labath                                lldb::DebuggerSP &debugger, const char *args,
140*9a14adeaSPavel Labath                                lldb_private::CommandReturnObject &cmd_retobj,
141*9a14adeaSPavel Labath                                lldb::ExecutionContextRefSP exe_ctx_ref_sp);
142*9a14adeaSPavel Labath 
143*9a14adeaSPavel Labath bool LLDBSwigPythonCallCommandObject(
144*9a14adeaSPavel Labath     PyObject *implementor, lldb::DebuggerSP &debugger, const char *args,
145*9a14adeaSPavel Labath     lldb_private::CommandReturnObject &cmd_retobj,
146*9a14adeaSPavel Labath     lldb::ExecutionContextRefSP exe_ctx_ref_sp);
147*9a14adeaSPavel Labath 
148*9a14adeaSPavel Labath bool LLDBSwigPythonCallModuleInit(const char *python_module_name,
149*9a14adeaSPavel Labath                                   const char *session_dictionary_name,
150*9a14adeaSPavel Labath                                   lldb::DebuggerSP &debugger);
151*9a14adeaSPavel Labath 
152*9a14adeaSPavel Labath void *LLDBSWIGPythonCreateOSPlugin(const char *python_class_name,
153*9a14adeaSPavel Labath                                    const char *session_dictionary_name,
154*9a14adeaSPavel Labath                                    const lldb::ProcessSP &process_sp);
155*9a14adeaSPavel Labath 
156*9a14adeaSPavel Labath void *LLDBSWIGPython_CreateFrameRecognizer(const char *python_class_name,
157*9a14adeaSPavel Labath                                            const char *session_dictionary_name);
158*9a14adeaSPavel Labath 
159*9a14adeaSPavel Labath PyObject *
160*9a14adeaSPavel Labath LLDBSwigPython_GetRecognizedArguments(PyObject *implementor,
161*9a14adeaSPavel Labath                                       const lldb::StackFrameSP &frame_sp);
162*9a14adeaSPavel Labath 
163*9a14adeaSPavel Labath bool LLDBSWIGPythonRunScriptKeywordProcess(const char *python_function_name,
164*9a14adeaSPavel Labath                                            const char *session_dictionary_name,
165*9a14adeaSPavel Labath                                            const lldb::ProcessSP &process,
166*9a14adeaSPavel Labath                                            std::string &output);
167*9a14adeaSPavel Labath 
168*9a14adeaSPavel Labath bool LLDBSWIGPythonRunScriptKeywordThread(const char *python_function_name,
169*9a14adeaSPavel Labath                                           const char *session_dictionary_name,
170*9a14adeaSPavel Labath                                           lldb::ThreadSP &thread,
171*9a14adeaSPavel Labath                                           std::string &output);
172*9a14adeaSPavel Labath 
173*9a14adeaSPavel Labath bool LLDBSWIGPythonRunScriptKeywordTarget(const char *python_function_name,
174*9a14adeaSPavel Labath                                           const char *session_dictionary_name,
175*9a14adeaSPavel Labath                                           const lldb::TargetSP &target,
176*9a14adeaSPavel Labath                                           std::string &output);
177*9a14adeaSPavel Labath 
178*9a14adeaSPavel Labath bool LLDBSWIGPythonRunScriptKeywordFrame(const char *python_function_name,
179*9a14adeaSPavel Labath                                          const char *session_dictionary_name,
180*9a14adeaSPavel Labath                                          lldb::StackFrameSP &frame,
181*9a14adeaSPavel Labath                                          std::string &output);
182*9a14adeaSPavel Labath 
183*9a14adeaSPavel Labath bool LLDBSWIGPythonRunScriptKeywordValue(const char *python_function_name,
184*9a14adeaSPavel Labath                                          const char *session_dictionary_name,
185*9a14adeaSPavel Labath                                          const lldb::ValueObjectSP &value,
186*9a14adeaSPavel Labath                                          std::string &output);
187*9a14adeaSPavel Labath 
188*9a14adeaSPavel Labath void *LLDBSWIGPython_GetDynamicSetting(void *module, const char *setting,
189*9a14adeaSPavel Labath                                        const lldb::TargetSP &target_sp);
1901f6a57c1SMed Ismail Bennani 
191ec00502bSShafik Yaghmour } // namespace lldb_private
1921f6a57c1SMed Ismail Bennani 
1931f6a57c1SMed Ismail Bennani #endif // LLDB_ENABLE_PYTHON
1941f6a57c1SMed Ismail Bennani #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SWIGPYTHONBRIDGE_H
195