X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/db1337cc8300bb44f8ccf9dced3e122b6e50b4c9..db972fce46368f7d2a60e43aca78f0757515c0c8:/gdb/python/python-internal.h diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 0b42603dce..56702cad53 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -1,6 +1,6 @@ /* Gdb/Python header for private use by Python module. - Copyright (C) 2008-2018 Free Software Foundation, Inc. + Copyright (C) 2008-2021 Free Software Foundation, Inc. This file is part of GDB. @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef GDB_PYTHON_INTERNAL_H -#define GDB_PYTHON_INTERNAL_H +#ifndef PYTHON_PYTHON_INTERNAL_H +#define PYTHON_PYTHON_INTERNAL_H #include "extension.h" #include "extension-priv.h" @@ -27,14 +27,9 @@ comes with the Python plugin for GCC. See: https://gcc-python-plugin.readthedocs.org/en/latest/cpychecker.html The checker defines a WITH_ macro for each attribute it - exposes. */ - -#ifdef WITH_CPYCHECKER_RETURNS_BORROWED_REF_ATTRIBUTE -#define CPYCHECKER_RETURNS_BORROWED_REF \ - __attribute__ ((cpychecker_returns_borrowed_ref)) -#else -#define CPYCHECKER_RETURNS_BORROWED_REF -#endif + exposes. Note that we intentionally do not use + 'cpychecker_returns_borrowed_ref' -- that idiom is forbidden in + gdb. */ #ifdef WITH_CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF_ATTRIBUTE #define CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF(ARG) \ @@ -43,13 +38,6 @@ #define CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF(ARG) #endif -#ifdef WITH_CPYCHECKER_STEALS_REFERENCE_TO_ARG_ATTRIBUTE -#define CPYCHECKER_STEALS_REFERENCE_TO_ARG(n) \ - __attribute__ ((cpychecker_steals_reference_to_arg (n))) -#else -#define CPYCHECKER_STEALS_REFERENCE_TO_ARG(n) -#endif - #ifdef WITH_CPYCHECKER_SETS_EXCEPTION_ATTRIBUTE #define CPYCHECKER_SETS_EXCEPTION __attribute__ ((cpychecker_sets_exception)) #else @@ -63,8 +51,6 @@ #define CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION #endif -/* Python 2.4 doesn't include stdint.h soon enough to get {u,}intptr_t - needed by pyport.h. */ /* /usr/include/features.h on linux systems will define _POSIX_C_SOURCE if it sees _GNU_SOURCE (which config.h will define). pyconfig.h defines _POSIX_C_SOURCE to a different value than @@ -110,8 +96,6 @@ #define Py_TPFLAGS_CHECKTYPES 0 #define PyInt_Check PyLong_Check -#define PyInt_FromLong PyLong_FromLong -#define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AsSsize_t PyLong_AsSsize_t @@ -121,26 +105,6 @@ #define PyString_Check PyUnicode_Check #endif -#if HAVE_LIBPYTHON2_4 -/* Py_ssize_t is not defined until 2.5. - Logical type for Py_ssize_t is Py_intptr_t, but that fails in 64-bit - compilation due to several apparent mistakes in python2.4 API, so we - use 'int' instead. */ -typedef int Py_ssize_t; -#endif - -#ifndef PyVarObject_HEAD_INIT -/* Python 2.4 does not define PyVarObject_HEAD_INIT. */ -#define PyVarObject_HEAD_INIT(type, size) \ - PyObject_HEAD_INIT(type) size, - -#endif - -#ifndef Py_TYPE -/* Python 2.4 does not define Py_TYPE. */ -#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) -#endif - /* If Python.h does not define WITH_THREAD, then the various GIL-related functions will not be defined. However, PyGILState_STATE will be. */ @@ -161,8 +125,6 @@ typedef int Py_ssize_t; #define GDB_PY_LLU_ARG "K" typedef PY_LONG_LONG gdb_py_longest; typedef unsigned PY_LONG_LONG gdb_py_ulongest; -#define gdb_py_long_from_longest PyLong_FromLongLong -#define gdb_py_long_from_ulongest PyLong_FromUnsignedLongLong #define gdb_py_long_as_ulongest PyLong_AsUnsignedLongLong #else /* HAVE_LONG_LONG */ @@ -171,8 +133,6 @@ typedef unsigned PY_LONG_LONG gdb_py_ulongest; #define GDB_PY_LLU_ARG "K" typedef long gdb_py_longest; typedef unsigned long gdb_py_ulongest; -#define gdb_py_long_from_longest PyLong_FromLong -#define gdb_py_long_from_ulongest PyLong_FromUnsignedLong #define gdb_py_long_as_ulongest PyLong_AsUnsignedLong #endif /* HAVE_LONG_LONG */ @@ -195,41 +155,12 @@ typedef long Py_hash_t; static inline void gdb_Py_DECREF (void *op) /* ARI: editCase function */ { - /* ... and Python 2.4 didn't cast OP to PyObject pointer on the - '(op)->ob_refcnt' references within the macro. Cast it ourselves - too. */ - Py_DECREF ((PyObject *) op); + Py_DECREF (op); } #undef Py_DECREF #define Py_DECREF(op) gdb_Py_DECREF (op) -/* The second argument to PyObject_GetAttrString was missing the 'const' - qualifier in Python-2.4. Hence, we wrap it in a function to avoid errors - when compiled with -Werror. */ - -static inline PyObject * -gdb_PyObject_GetAttrString (PyObject *obj, - const char *attr) /* ARI: editCase function */ -{ - return PyObject_GetAttrString (obj, (char *) attr); -} - -#define PyObject_GetAttrString(obj, attr) gdb_PyObject_GetAttrString (obj, attr) - -/* The second argument to PyObject_HasAttrString was also missing the 'const' - qualifier in Python-2.4. Hence, we wrap it also in a function to avoid - errors when compiled with -Werror. */ - -static inline int -gdb_PyObject_HasAttrString (PyObject *obj, - const char *attr) /* ARI: editCase function */ -{ - return PyObject_HasAttrString (obj, (char *) attr); -} - -#define PyObject_HasAttrString(obj, attr) gdb_PyObject_HasAttrString (obj, attr) - /* PyObject_CallMethod's 'method' and 'format' parameters were missing the 'const' qualifier before Python 3.4. Hence, we wrap the function in our own version to avoid errors with string literals. @@ -387,7 +318,7 @@ extern PyTypeObject frame_object_type extern PyTypeObject thread_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("thread_object"); -typedef struct gdbpy_breakpoint_object +struct gdbpy_breakpoint_object { PyObject_HEAD @@ -400,16 +331,16 @@ typedef struct gdbpy_breakpoint_object /* 1 is this is a FinishBreakpoint object, 0 otherwise. */ int is_finish_bp; -} gdbpy_breakpoint_object; +}; /* Require that BREAKPOINT be a valid breakpoint ID; throw a Python exception if it is invalid. */ #define BPPY_REQUIRE_VALID(Breakpoint) \ do { \ if ((Breakpoint)->bp == NULL) \ - return PyErr_Format (PyExc_RuntimeError, \ - _("Breakpoint %d is invalid."), \ - (Breakpoint)->number); \ + return PyErr_Format (PyExc_RuntimeError, \ + _("Breakpoint %d is invalid."), \ + (Breakpoint)->number); \ } while (0) /* Require that BREAKPOINT be a valid breakpoint ID; throw a Python @@ -417,11 +348,11 @@ typedef struct gdbpy_breakpoint_object #define BPPY_SET_REQUIRE_VALID(Breakpoint) \ do { \ if ((Breakpoint)->bp == NULL) \ - { \ - PyErr_Format (PyExc_RuntimeError, _("Breakpoint %d is invalid."), \ - (Breakpoint)->number); \ - return -1; \ - } \ + { \ + PyErr_Format (PyExc_RuntimeError, _("Breakpoint %d is invalid."), \ + (Breakpoint)->number); \ + return -1; \ + } \ } while (0) @@ -430,7 +361,7 @@ typedef struct gdbpy_breakpoint_object extern gdbpy_breakpoint_object *bppy_pending_object; -typedef struct +struct thread_object { PyObject_HEAD @@ -439,7 +370,7 @@ typedef struct /* The Inferior object to which this thread belongs. */ PyObject *inf_obj; -} thread_object; +}; struct inferior_object; @@ -448,16 +379,17 @@ extern struct cmd_list_element *show_python_list; /* extension_language_script_ops "methods". */ -extern int gdbpy_auto_load_enabled (const struct extension_language_defn *); +/* Return true if auto-loading Python scripts is enabled. + This is the extension_language_script_ops.auto_load_enabled "method". */ + +extern bool gdbpy_auto_load_enabled (const struct extension_language_defn *); /* extension_language_ops "methods". */ extern enum ext_lang_rc gdbpy_apply_val_pretty_printer (const struct extension_language_defn *, - struct type *type, - LONGEST embedded_offset, CORE_ADDR address, + struct value *value, struct ui_file *stream, int recurse, - struct value *val, const struct value_print_options *options, const struct language_defn *language); extern enum ext_lang_bt_status gdbpy_apply_frame_filter @@ -487,6 +419,10 @@ PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *); PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw); PyObject *gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw); +PyObject *gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, + PyObject *kw); +PyObject *gdbpy_lookup_static_symbols (PyObject *self, PyObject *args, + PyObject *kw); PyObject *gdbpy_start_recording (PyObject *self, PyObject *args); PyObject *gdbpy_current_recording (PyObject *self, PyObject *args); PyObject *gdbpy_stop_recording (PyObject *self, PyObject *args); @@ -506,6 +442,8 @@ PyObject *gdbpy_parameter_value (enum var_types type, void *var); char *gdbpy_parse_command_name (const char *name, struct cmd_list_element ***base_list, struct cmd_list_element **start_list); +PyObject *gdbpy_register_tui_window (PyObject *self, PyObject *args, + PyObject *kw); PyObject *symtab_and_line_to_sal_object (struct symtab_and_line sal); PyObject *symtab_to_symtab_object (struct symtab *symtab); @@ -513,6 +451,7 @@ PyObject *symbol_to_symbol_object (struct symbol *sym); PyObject *block_to_block_object (const struct block *block, struct objfile *objfile); PyObject *value_to_value_object (struct value *v); +PyObject *value_to_value_object_no_release (struct value *v); PyObject *type_to_type_object (struct type *); PyObject *frame_info_to_frame_object (struct frame_info *frame); PyObject *symtab_to_linetable_object (PyObject *symtab); @@ -531,9 +470,13 @@ PyObject *gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw); PyObject *gdbarch_to_arch_object (struct gdbarch *gdbarch); -thread_object *create_thread_object (struct thread_info *tp); +PyObject *gdbpy_new_register_descriptor_iterator (struct gdbarch *gdbarch, + const char *group_name); +PyObject *gdbpy_new_reggroup_iterator (struct gdbarch *gdbarch); + +gdbpy_ref create_thread_object (struct thread_info *tp); gdbpy_ref<> thread_to_thread_object (thread_info *thr);; -inferior_object *inferior_to_inferior_object (inferior *inf); +gdbpy_ref inferior_to_inferior_object (inferior *inf); const struct block *block_object_to_block (PyObject *obj); struct symbol *symbol_object_to_symbol (PyObject *obj); @@ -598,10 +541,68 @@ int gdbpy_initialize_py_events (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_arch (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; +int gdbpy_initialize_registers () + CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_xmethods (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_unwind (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; +int gdbpy_initialize_tui () + CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; + +/* A wrapper for PyErr_Fetch that handles reference counting for the + caller. */ +class gdbpy_err_fetch +{ +public: + + gdbpy_err_fetch () + { + PyErr_Fetch (&m_error_type, &m_error_value, &m_error_traceback); + } + + ~gdbpy_err_fetch () + { + Py_XDECREF (m_error_type); + Py_XDECREF (m_error_value); + Py_XDECREF (m_error_traceback); + } + + /* Call PyErr_Restore using the values stashed in this object. + After this call, this object is invalid and neither the to_string + nor restore methods may be used again. */ + + void restore () + { + PyErr_Restore (m_error_type, m_error_value, m_error_traceback); + m_error_type = nullptr; + m_error_value = nullptr; + m_error_traceback = nullptr; + } + + /* Return the string representation of the exception represented by + this object. If the result is NULL a python error occurred, the + caller must clear it. */ + + gdb::unique_xmalloc_ptr to_string () const; + + /* Return the string representation of the type of the exception + represented by this object. If the result is NULL a python error + occurred, the caller must clear it. */ + + gdb::unique_xmalloc_ptr type_to_string () const; + + /* Return true if the stored type matches TYPE, false otherwise. */ + + bool type_matches (PyObject *type) const + { + return PyErr_GivenExceptionMatches (m_error_type, type); + } + +private: + + PyObject *m_error_type, *m_error_value, *m_error_traceback; +}; /* Called before entering the Python interpreter to install the current language and architecture to be used for Python values. @@ -624,7 +625,10 @@ class gdbpy_enter PyGILState_STATE m_state; struct gdbarch *m_gdbarch; const struct language_defn *m_language; - PyObject *m_error_type, *m_error_value, *m_error_traceback; + + /* An optional is used here because we don't want to call + PyErr_Fetch too early. */ + gdb::optional m_error; }; /* Like gdbpy_enter, but takes a varobj. This is a subclass just to @@ -639,6 +643,31 @@ class gdbpy_enter_varobj : public gdbpy_enter }; +/* The opposite of gdb_enter: this releases the GIL around a region, + allowing other Python threads to run. No Python APIs may be used + while this is active. */ +class gdbpy_allow_threads +{ +public: + + gdbpy_allow_threads () + : m_save (PyEval_SaveThread ()) + { + gdb_assert (m_save != nullptr); + } + + ~gdbpy_allow_threads () + { + PyEval_RestoreThread (m_save); + } + + DISABLE_COPY_AND_ASSIGN (gdbpy_allow_threads); + +private: + + PyThreadState *m_save; +}; + extern struct gdbarch *python_gdbarch; extern const struct language_defn *python_language; @@ -649,7 +678,7 @@ extern const struct language_defn *python_language; if (Exception.reason < 0) \ { \ gdbpy_convert_exception (Exception); \ - return NULL; \ + return NULL; \ } \ } while (0) @@ -658,7 +687,7 @@ extern const struct language_defn *python_language; #define GDB_PY_SET_HANDLE_EXCEPTION(Exception) \ do { \ if (Exception.reason < 0) \ - { \ + { \ gdbpy_convert_exception (Exception); \ return -1; \ } \ @@ -666,17 +695,17 @@ extern const struct language_defn *python_language; int gdbpy_print_python_errors_p (void); void gdbpy_print_stack (void); +void gdbpy_print_stack_or_quit (); +void gdbpy_handle_exception () ATTRIBUTE_NORETURN; -PyObject *python_string_to_unicode (PyObject *obj); +gdbpy_ref<> python_string_to_unicode (PyObject *obj); gdb::unique_xmalloc_ptr unicode_to_target_string (PyObject *unicode_str); gdb::unique_xmalloc_ptr python_string_to_target_string (PyObject *obj); -PyObject *python_string_to_target_python_string (PyObject *obj); +gdbpy_ref<> python_string_to_target_python_string (PyObject *obj); gdb::unique_xmalloc_ptr python_string_to_host_string (PyObject *obj); -PyObject *host_string_to_python_string (const char *str); +gdbpy_ref<> host_string_to_python_string (const char *str); int gdbpy_is_string (PyObject *obj); gdb::unique_xmalloc_ptr gdbpy_obj_to_string (PyObject *obj); -gdb::unique_xmalloc_ptr gdbpy_exception_to_string (PyObject *ptype, - PyObject *pvalue); int gdbpy_is_lazy_string (PyObject *result); void gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr, @@ -691,7 +720,7 @@ int gdbpy_is_value_object (PyObject *obj); gdbpy_ref<> apply_varobj_pretty_printer (PyObject *print_obj, struct value **replacement, struct ui_file *stream); -PyObject *gdbpy_get_varobj_pretty_printer (struct value *value); +gdbpy_ref<> gdbpy_get_varobj_pretty_printer (struct value *value); gdb::unique_xmalloc_ptr gdbpy_get_display_hint (PyObject *printer); PyObject *gdbpy_default_visualizer (PyObject *self, PyObject *args); @@ -710,14 +739,14 @@ extern PyObject *gdbpy_gdb_error; extern PyObject *gdbpy_gdb_memory_error; extern PyObject *gdbpy_gdberror_exc; -extern void gdbpy_convert_exception (struct gdb_exception) +extern void gdbpy_convert_exception (const struct gdb_exception &) CPYCHECKER_SETS_EXCEPTION; int get_addr_from_python (PyObject *obj, CORE_ADDR *addr) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -PyObject *gdb_py_object_from_longest (LONGEST l); -PyObject *gdb_py_object_from_ulongest (ULONGEST l); +gdbpy_ref<> gdb_py_object_from_longest (LONGEST l); +gdbpy_ref<> gdb_py_object_from_ulongest (ULONGEST l); int gdb_py_int_as_long (PyObject *, long *); PyObject *gdb_py_generic_dict (PyObject *self, void *closure); @@ -728,7 +757,39 @@ int gdb_pymodule_addobject (PyObject *module, const char *name, struct varobj_iter; struct varobj; -struct varobj_iter *py_varobj_get_iterator (struct varobj *var, - PyObject *printer); +std::unique_ptr py_varobj_get_iterator (struct varobj *var, + PyObject *printer); + +/* Deleter for Py_buffer unique_ptr specialization. */ + +struct Py_buffer_deleter +{ + void operator() (Py_buffer *b) const + { + PyBuffer_Release (b); + } +}; + +/* A unique_ptr specialization for Py_buffer. */ +typedef std::unique_ptr Py_buffer_up; + +/* Parse a register number from PYO_REG_ID and place the register number + into *REG_NUM. The register is a register for GDBARCH. + + If a register is parsed successfully then *REG_NUM will have been + updated, and true is returned. Otherwise the contents of *REG_NUM are + undefined, and false is returned. + + The PYO_REG_ID object can be a string, the name of the register. This + is the slowest approach as GDB has to map the name to a number for each + call. Alternatively PYO_REG_ID can be an internal GDB register + number. This is quick but should not be encouraged as this means + Python scripts are now dependent on GDB's internal register numbering. + Final PYO_REG_ID can be a gdb.RegisterDescriptor object, these objects + can be looked up by name once, and then cache the register number so + should be as quick as using a register number. */ + +extern bool gdbpy_parse_register_id (struct gdbarch *gdbarch, + PyObject *pyo_reg_id, int *reg_num); -#endif /* GDB_PYTHON_INTERNAL_H */ +#endif /* PYTHON_PYTHON_INTERNAL_H */