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