gdb/python/py-objfile.c - gdb
Global variables defined
Data types defined
Functions defined
Macros defined
Source code
- #include "defs.h"
- #include "python-internal.h"
- #include "charset.h"
- #include "objfiles.h"
- #include "language.h"
- #include "build-id.h"
- #include "elf-bfd.h"
- #include "symtab.h"
- typedef struct
- {
- PyObject_HEAD
-
- struct objfile *objfile;
-
- PyObject *dict;
-
- PyObject *printers;
-
- PyObject *frame_filters;
-
- PyObject *type_printers;
-
- PyObject *xmethods;
- } objfile_object;
- static PyTypeObject objfile_object_type
- CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("objfile_object");
- static const struct objfile_data *objfpy_objfile_data_key;
- #define OBJFPY_REQUIRE_VALID(obj) \
- do { \
- if (!(obj)->objfile) \
- { \
- PyErr_SetString (PyExc_RuntimeError, \
- _("Objfile no longer exists.")); \
- return NULL; \
- } \
- } while (0)
- static PyObject *
- objfpy_get_filename (PyObject *self, void *closure)
- {
- objfile_object *obj = (objfile_object *) self;
- if (obj->objfile)
- return PyString_Decode (objfile_name (obj->objfile),
- strlen (objfile_name (obj->objfile)),
- host_charset (), NULL);
- Py_RETURN_NONE;
- }
- static PyObject *
- objfpy_get_owner (PyObject *self, void *closure)
- {
- objfile_object *obj = (objfile_object *) self;
- struct objfile *objfile = obj->objfile;
- struct objfile *owner;
- OBJFPY_REQUIRE_VALID (obj);
- owner = objfile->separate_debug_objfile_backlink;
- if (owner != NULL)
- {
- PyObject *result = objfile_to_objfile_object (owner);
- Py_XINCREF (result);
- return result;
- }
- Py_RETURN_NONE;
- }
- static PyObject *
- objfpy_get_build_id (PyObject *self, void *closure)
- {
- objfile_object *obj = (objfile_object *) self;
- struct objfile *objfile = obj->objfile;
- const struct elf_build_id *build_id = NULL;
- volatile struct gdb_exception except;
- OBJFPY_REQUIRE_VALID (obj);
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- build_id = build_id_bfd_get (objfile->obfd);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- if (build_id != NULL)
- {
- char *hex_form = make_hex_string (build_id->data, build_id->size);
- PyObject *result;
- result = PyString_Decode (hex_form, strlen (hex_form),
- host_charset (), NULL);
- xfree (hex_form);
- return result;
- }
- Py_RETURN_NONE;
- }
- static PyObject *
- objfpy_get_progspace (PyObject *self, void *closure)
- {
- objfile_object *obj = (objfile_object *) self;
- if (obj->objfile)
- {
- PyObject *pspace = pspace_to_pspace_object (obj->objfile->pspace);
- Py_XINCREF (pspace);
- return pspace;
- }
- Py_RETURN_NONE;
- }
- static void
- objfpy_dealloc (PyObject *o)
- {
- objfile_object *self = (objfile_object *) o;
- Py_XDECREF (self->dict);
- Py_XDECREF (self->printers);
- Py_XDECREF (self->frame_filters);
- Py_XDECREF (self->type_printers);
- Py_XDECREF (self->xmethods);
- Py_TYPE (self)->tp_free (self);
- }
- static int
- objfpy_initialize (objfile_object *self)
- {
- self->objfile = NULL;
- self->dict = NULL;
- self->printers = PyList_New (0);
- if (self->printers == NULL)
- return 0;
- self->frame_filters = PyDict_New ();
- if (self->frame_filters == NULL)
- return 0;
- self->type_printers = PyList_New (0);
- if (self->type_printers == NULL)
- return 0;
- self->xmethods = PyList_New (0);
- if (self->xmethods == NULL)
- return 0;
- return 1;
- }
- static PyObject *
- objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
- {
- objfile_object *self = (objfile_object *) type->tp_alloc (type, 0);
- if (self)
- {
- if (!objfpy_initialize (self))
- {
- Py_DECREF (self);
- return NULL;
- }
- }
- return (PyObject *) self;
- }
- PyObject *
- objfpy_get_printers (PyObject *o, void *ignore)
- {
- objfile_object *self = (objfile_object *) o;
- Py_INCREF (self->printers);
- return self->printers;
- }
- static int
- objfpy_set_printers (PyObject *o, PyObject *value, void *ignore)
- {
- PyObject *tmp;
- objfile_object *self = (objfile_object *) o;
- if (! value)
- {
- PyErr_SetString (PyExc_TypeError,
- _("Cannot delete the pretty_printers attribute."));
- return -1;
- }
- if (! PyList_Check (value))
- {
- PyErr_SetString (PyExc_TypeError,
- _("The pretty_printers attribute must be a list."));
- return -1;
- }
-
- tmp = self->printers;
- Py_INCREF (value);
- self->printers = value;
- Py_XDECREF (tmp);
- return 0;
- }
- PyObject *
- objfpy_get_frame_filters (PyObject *o, void *ignore)
- {
- objfile_object *self = (objfile_object *) o;
- Py_INCREF (self->frame_filters);
- return self->frame_filters;
- }
- static int
- objfpy_set_frame_filters (PyObject *o, PyObject *filters, void *ignore)
- {
- PyObject *tmp;
- objfile_object *self = (objfile_object *) o;
- if (! filters)
- {
- PyErr_SetString (PyExc_TypeError,
- _("Cannot delete the frame filters attribute."));
- return -1;
- }
- if (! PyDict_Check (filters))
- {
- PyErr_SetString (PyExc_TypeError,
- _("The frame_filters attribute must be a dictionary."));
- return -1;
- }
-
- tmp = self->frame_filters;
- Py_INCREF (filters);
- self->frame_filters = filters;
- Py_XDECREF (tmp);
- return 0;
- }
- static PyObject *
- objfpy_get_type_printers (PyObject *o, void *ignore)
- {
- objfile_object *self = (objfile_object *) o;
- Py_INCREF (self->type_printers);
- return self->type_printers;
- }
- PyObject *
- objfpy_get_xmethods (PyObject *o, void *ignore)
- {
- objfile_object *self = (objfile_object *) o;
- Py_INCREF (self->xmethods);
- return self->xmethods;
- }
- static int
- objfpy_set_type_printers (PyObject *o, PyObject *value, void *ignore)
- {
- PyObject *tmp;
- objfile_object *self = (objfile_object *) o;
- if (! value)
- {
- PyErr_SetString (PyExc_TypeError,
- _("Cannot delete the type_printers attribute."));
- return -1;
- }
- if (! PyList_Check (value))
- {
- PyErr_SetString (PyExc_TypeError,
- _("The type_printers attribute must be a list."));
- return -1;
- }
-
- tmp = self->type_printers;
- Py_INCREF (value);
- self->type_printers = value;
- Py_XDECREF (tmp);
- return 0;
- }
- static PyObject *
- objfpy_is_valid (PyObject *self, PyObject *args)
- {
- objfile_object *obj = (objfile_object *) self;
- if (! obj->objfile)
- Py_RETURN_FALSE;
- Py_RETURN_TRUE;
- }
- static PyObject *
- objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
- {
- static char *keywords[] = { "file_name", NULL };
- objfile_object *obj = (objfile_object *) self;
- const char *file_name;
- int symfile_flags = 0;
- volatile struct gdb_exception except;
- OBJFPY_REQUIRE_VALID (obj);
- if (!PyArg_ParseTupleAndKeywords (args, kw, "s", keywords, &file_name))
- return NULL;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- bfd *abfd = symfile_bfd_open (file_name);
- symbol_file_add_separate (abfd, file_name, symfile_flags, obj->objfile);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
- Py_RETURN_NONE;
- }
- static int
- objfpy_build_id_ok (const char *string)
- {
- size_t i, n = strlen (string);
- if (n % 2 != 0)
- return 0;
- for (i = 0; i < n; ++i)
- {
- if (!isxdigit (string[i]))
- return 0;
- }
- return 1;
- }
- static int
- objfpy_build_id_matches (const struct elf_build_id *build_id,
- const char *string)
- {
- size_t i;
- if (strlen (string) != 2 * build_id->size)
- return 0;
- for (i = 0; i < build_id->size; ++i)
- {
- char c1 = string[i * 2], c2 = string[i * 2 + 1];
- int byte = (host_hex_value (c1) << 4) | host_hex_value (c2);
- if (byte != build_id->data[i])
- return 0;
- }
- return 1;
- }
- static struct objfile *
- objfpy_lookup_objfile_by_name (const char *name)
- {
- struct objfile *objfile;
- ALL_OBJFILES (objfile)
- {
- if ((objfile->flags & OBJF_NOT_FILENAME) != 0)
- continue;
-
- if (objfile->separate_debug_objfile_backlink != NULL)
- continue;
- if (compare_filenames_for_search (objfile_name (objfile), name))
- return objfile;
- }
- return NULL;
- }
- static struct objfile *
- objfpy_lookup_objfile_by_build_id (const char *build_id)
- {
- struct objfile *objfile;
- ALL_OBJFILES (objfile)
- {
- const struct elf_build_id *obfd_build_id;
- if (objfile->obfd == NULL)
- continue;
-
- if (objfile->separate_debug_objfile_backlink != NULL)
- continue;
- obfd_build_id = build_id_bfd_get (objfile->obfd);
- if (obfd_build_id == NULL)
- continue;
- if (objfpy_build_id_matches (obfd_build_id, build_id))
- return objfile;
- }
- return NULL;
- }
- PyObject *
- gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw)
- {
- static char *keywords[] = { "name", "by_build_id", NULL };
- const char *name;
- PyObject *by_build_id_obj = NULL;
- int by_build_id;
- struct objfile *objfile;
- if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!", keywords,
- &name, &PyBool_Type, &by_build_id_obj))
- return NULL;
- by_build_id = 0;
- if (by_build_id_obj != NULL)
- {
- int cmp = PyObject_IsTrue (by_build_id_obj);
- if (cmp < 0)
- return NULL;
- by_build_id = cmp;
- }
- if (by_build_id)
- {
- if (!objfpy_build_id_ok (name))
- {
- PyErr_SetString (PyExc_TypeError, _("Not a valid build id."));
- return NULL;
- }
- objfile = objfpy_lookup_objfile_by_build_id (name);
- }
- else
- objfile = objfpy_lookup_objfile_by_name (name);
- if (objfile != NULL)
- {
- PyObject *result = objfile_to_objfile_object (objfile);
- Py_XINCREF (result);
- return result;
- }
- PyErr_SetString (PyExc_ValueError, _("Objfile not found."));
- return NULL;
- }
- static void
- py_free_objfile (struct objfile *objfile, void *datum)
- {
- struct cleanup *cleanup;
- objfile_object *object = datum;
- cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
- object->objfile = NULL;
- Py_DECREF ((PyObject *) object);
- do_cleanups (cleanup);
- }
- PyObject *
- objfile_to_objfile_object (struct objfile *objfile)
- {
- objfile_object *object;
- object = objfile_data (objfile, objfpy_objfile_data_key);
- if (!object)
- {
- object = PyObject_New (objfile_object, &objfile_object_type);
- if (object)
- {
- if (!objfpy_initialize (object))
- {
- Py_DECREF (object);
- return NULL;
- }
- object->objfile = objfile;
- set_objfile_data (objfile, objfpy_objfile_data_key, object);
- }
- }
- return (PyObject *) object;
- }
- int
- gdbpy_initialize_objfile (void)
- {
- objfpy_objfile_data_key
- = register_objfile_data_with_cleanup (NULL, py_free_objfile);
- if (PyType_Ready (&objfile_object_type) < 0)
- return -1;
- return gdb_pymodule_addobject (gdb_module, "Objfile",
- (PyObject *) &objfile_object_type);
- }
- static PyMethodDef objfile_object_methods[] =
- {
- { "is_valid", objfpy_is_valid, METH_NOARGS,
- "is_valid () -> Boolean.\n\
- Return true if this object file is valid, false if not." },
- { "add_separate_debug_file", (PyCFunction) objfpy_add_separate_debug_file,
- METH_VARARGS | METH_KEYWORDS,
- "add_separate_debug_file (file_name).\n\
- Add FILE_NAME to the list of files containing debug info for the objfile." },
- { NULL }
- };
- static PyGetSetDef objfile_getset[] =
- {
- { "__dict__", gdb_py_generic_dict, NULL,
- "The __dict__ for this objfile.", &objfile_object_type },
- { "filename", objfpy_get_filename, NULL,
- "The objfile's filename, or None.", NULL },
- { "owner", objfpy_get_owner, NULL,
- "The objfile owner of separate debug info objfiles, or None.",
- NULL },
- { "build_id", objfpy_get_build_id, NULL,
- "The objfile's build id, or None.", NULL },
- { "progspace", objfpy_get_progspace, NULL,
- "The objfile's progspace, or None.", NULL },
- { "pretty_printers", objfpy_get_printers, objfpy_set_printers,
- "Pretty printers.", NULL },
- { "frame_filters", objfpy_get_frame_filters,
- objfpy_set_frame_filters, "Frame Filters.", NULL },
- { "type_printers", objfpy_get_type_printers, objfpy_set_type_printers,
- "Type printers.", NULL },
- { "xmethods", objfpy_get_xmethods, NULL,
- "Debug methods.", NULL },
- { NULL }
- };
- static PyTypeObject objfile_object_type =
- {
- PyVarObject_HEAD_INIT (NULL, 0)
- "gdb.Objfile",
- sizeof (objfile_object),
- 0,
- objfpy_dealloc,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- Py_TPFLAGS_DEFAULT,
- "GDB objfile object",
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- objfile_object_methods,
- 0,
- objfile_getset,
- 0,
- 0,
- 0,
- 0,
- offsetof (objfile_object, dict),
- 0,
- 0,
- objfpy_new,
- };