X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-symtab.c;h=9fdb42f393cf62cd77c8674fd1e862b8b52ebd03;hb=7780f18678aeb553778633aeb50f41694f55bf27;hp=94c05be90a2a6170e6ce1f0867fd3de1273d871d;hpb=62eec1a534a27c721360713b21e14fb800e21e36;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c index 94c05be90a..9fdb42f393 100644 --- a/gdb/python/py-symtab.c +++ b/gdb/python/py-symtab.c @@ -1,6 +1,6 @@ /* Python interface to symbol tables. - Copyright (C) 2008-2013 Free Software Foundation, Inc. + Copyright (C) 2008-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -37,7 +37,7 @@ typedef struct stpy_symtab_object { struct stpy_symtab_object *next; } symtab_object; -static PyTypeObject symtab_object_type +extern PyTypeObject symtab_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("symtab_object"); static const struct objfile_data *stpy_objfile_data_key; @@ -68,7 +68,7 @@ typedef struct salpy_sal_object { struct salpy_sal_object *next; } sal_object; -static PyTypeObject sal_object_type +extern PyTypeObject sal_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("sal_object"); static const struct objfile_data *salpy_objfile_data_key; @@ -108,8 +108,7 @@ stpy_get_filename (PyObject *self, void *closure) STPY_REQUIRE_VALID (self, symtab); filename = symtab_to_filename_for_display (symtab); - str_obj = PyString_Decode (filename, strlen (filename), - host_charset (), NULL); + str_obj = host_string_to_python_string (filename); return str_obj; } @@ -121,11 +120,31 @@ stpy_get_objfile (PyObject *self, void *closure) STPY_REQUIRE_VALID (self, symtab); - result = objfile_to_objfile_object (symtab->objfile); + result = objfile_to_objfile_object (SYMTAB_OBJFILE (symtab)); Py_XINCREF (result); return result; } +/* Getter function for symtab.producer. */ + +static PyObject * +stpy_get_producer (PyObject *self, void *closure) +{ + struct symtab *symtab = NULL; + struct compunit_symtab *cust; + + STPY_REQUIRE_VALID (self, symtab); + cust = SYMTAB_COMPUNIT (symtab); + if (COMPUNIT_PRODUCER (cust) != NULL) + { + const char *producer = COMPUNIT_PRODUCER (cust); + + return host_string_to_python_string (producer); + } + + Py_RETURN_NONE; +} + static PyObject * stpy_fullname (PyObject *self, PyObject *args) { @@ -136,7 +155,7 @@ stpy_fullname (PyObject *self, PyObject *args) fullname = symtab_to_fullname (symtab); - return PyString_Decode (fullname, strlen (fullname), host_charset (), NULL); + return host_string_to_python_string (fullname); } /* Implementation of gdb.Symtab.is_valid (self) -> Boolean. @@ -161,13 +180,13 @@ stpy_global_block (PyObject *self, PyObject *args) { struct symtab *symtab = NULL; struct block *block = NULL; - struct blockvector *blockvector; + const struct blockvector *blockvector; STPY_REQUIRE_VALID (self, symtab); - blockvector = BLOCKVECTOR (symtab); + blockvector = SYMTAB_BLOCKVECTOR (symtab); block = BLOCKVECTOR_BLOCK (blockvector, GLOBAL_BLOCK); - return block_to_block_object (block, symtab->objfile); + return block_to_block_object (block, SYMTAB_OBJFILE (symtab)); } /* Return the STATIC_BLOCK of the underlying symtab. */ @@ -177,13 +196,27 @@ stpy_static_block (PyObject *self, PyObject *args) { struct symtab *symtab = NULL; struct block *block = NULL; - struct blockvector *blockvector; + const struct blockvector *blockvector; STPY_REQUIRE_VALID (self, symtab); - blockvector = BLOCKVECTOR (symtab); + blockvector = SYMTAB_BLOCKVECTOR (symtab); block = BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK); - return block_to_block_object (block, symtab->objfile); + return block_to_block_object (block, SYMTAB_OBJFILE (symtab)); +} + +/* Implementation of gdb.Symtab.linetable (self) -> gdb.LineTable. + Returns a gdb.LineTable object corresponding to this symbol + table. */ + +static PyObject * +stpy_get_linetable (PyObject *self, PyObject *args) +{ + struct symtab *symtab = NULL; + + STPY_REQUIRE_VALID (self, symtab); + + return symtab_to_linetable_object (self); } static PyObject * @@ -219,7 +252,7 @@ stpy_dealloc (PyObject *obj) symtab->prev->next = symtab->next; else if (symtab->symtab) { - set_objfile_data (symtab->symtab->objfile, + set_objfile_data (SYMTAB_OBJFILE (symtab->symtab), stpy_objfile_data_key, symtab->next); } if (symtab->next) @@ -300,7 +333,7 @@ salpy_dealloc (PyObject *self) if (self_sal->prev) self_sal->prev->next = self_sal->next; else if (self_sal->symtab != (symtab_object * ) Py_None) - set_objfile_data (self_sal->symtab->symtab->objfile, + set_objfile_data (SYMTAB_OBJFILE (self_sal->symtab->symtab), salpy_objfile_data_key, self_sal->next); if (self_sal->next) @@ -315,9 +348,8 @@ salpy_dealloc (PyObject *self) and initialized, populate the sal_object with the struct sal data. Also, register the sal_object life-cycle with the life-cycle of the object file associated with this sal, if needed. If a failure - occurs during the sal population, this function will return - NULL. */ -static int + occurs during the sal population, this function will return -1. */ +static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION set_sal (sal_object *sal_obj, struct symtab_and_line sal) { symtab_object *symtab_obj; @@ -328,7 +360,7 @@ set_sal (sal_object *sal_obj, struct symtab_and_line sal) /* If a symtab existed in the sal, but it cannot be duplicated, we exit. */ if (symtab_obj == NULL) - return 0; + return -1; } else { @@ -336,8 +368,9 @@ set_sal (sal_object *sal_obj, struct symtab_and_line sal) Py_INCREF (Py_None); } - sal_obj->sal = xmemdup (&sal, sizeof (struct symtab_and_line), - sizeof (struct symtab_and_line)); + sal_obj->sal = ((struct symtab_and_line *) + xmemdup (&sal, sizeof (struct symtab_and_line), + sizeof (struct symtab_and_line))); sal_obj->symtab = symtab_obj; sal_obj->prev = NULL; @@ -345,18 +378,20 @@ set_sal (sal_object *sal_obj, struct symtab_and_line sal) objfile cleanup observer linked list. */ if (sal_obj->symtab != (symtab_object *)Py_None) { - sal_obj->next = objfile_data (sal_obj->symtab->symtab->objfile, - salpy_objfile_data_key); + sal_obj->next + = ((struct salpy_sal_object *) + objfile_data (SYMTAB_OBJFILE (sal_obj->symtab->symtab), + salpy_objfile_data_key)); if (sal_obj->next) sal_obj->next->prev = sal_obj; - set_objfile_data (sal_obj->symtab->symtab->objfile, + set_objfile_data (SYMTAB_OBJFILE (sal_obj->symtab->symtab), salpy_objfile_data_key, sal_obj); } else sal_obj->next = NULL; - return 1; + return 0; } /* Given a symtab, and a symtab_object that has previously been @@ -371,10 +406,12 @@ set_symtab (symtab_object *obj, struct symtab *symtab) obj->prev = NULL; if (symtab) { - obj->next = objfile_data (symtab->objfile, stpy_objfile_data_key); + obj->next + = ((struct stpy_symtab_object *) + objfile_data (SYMTAB_OBJFILE (symtab), stpy_objfile_data_key)); if (obj->next) obj->next->prev = obj; - set_objfile_data (symtab->objfile, stpy_objfile_data_key, obj); + set_objfile_data (SYMTAB_OBJFILE (symtab), stpy_objfile_data_key, obj); } else obj->next = NULL; @@ -398,16 +435,13 @@ symtab_to_symtab_object (struct symtab *symtab) that encapsulates the symtab_and_line structure from GDB. */ PyObject * symtab_and_line_to_sal_object (struct symtab_and_line sal) - { sal_object *sal_obj; - int success = 0; sal_obj = PyObject_New (sal_object, &sal_object_type); if (sal_obj) { - success = set_sal (sal_obj, sal); - if (!success) + if (set_sal (sal_obj, sal) < 0) { Py_DECREF (sal_obj); return NULL; @@ -444,7 +478,7 @@ symtab_object_to_symtab (PyObject *obj) static void del_objfile_symtab (struct objfile *objfile, void *datum) { - symtab_object *obj = datum; + symtab_object *obj = (symtab_object *) datum; while (obj) { @@ -465,7 +499,7 @@ del_objfile_symtab (struct objfile *objfile, void *datum) static void del_objfile_sal (struct objfile *objfile, void *datum) { - sal_object *obj = datum; + sal_object *obj = (sal_object *) datum; while (obj) { @@ -484,16 +518,16 @@ del_objfile_sal (struct objfile *objfile, void *datum) } } -void +int gdbpy_initialize_symtabs (void) { symtab_object_type.tp_new = PyType_GenericNew; if (PyType_Ready (&symtab_object_type) < 0) - return; + return -1; sal_object_type.tp_new = PyType_GenericNew; if (PyType_Ready (&sal_object_type) < 0) - return; + return -1; /* Register an objfile "free" callback so we can properly invalidate symbol tables, and symbol table and line data @@ -504,13 +538,12 @@ gdbpy_initialize_symtabs (void) salpy_objfile_data_key = register_objfile_data_with_cleanup (NULL, del_objfile_sal); - Py_INCREF (&symtab_object_type); - PyModule_AddObject (gdb_module, "Symtab", - (PyObject *) &symtab_object_type); + if (gdb_pymodule_addobject (gdb_module, "Symtab", + (PyObject *) &symtab_object_type) < 0) + return -1; - Py_INCREF (&sal_object_type); - PyModule_AddObject (gdb_module, "Symtab_and_line", - (PyObject *) &sal_object_type); + return gdb_pymodule_addobject (gdb_module, "Symtab_and_line", + (PyObject *) &sal_object_type); } @@ -520,6 +553,8 @@ static PyGetSetDef symtab_object_getset[] = { "The symbol table's source filename.", NULL }, { "objfile", stpy_get_objfile, NULL, "The symtab's objfile.", NULL }, + { "producer", stpy_get_producer, NULL, + "The name/version of the program that compiled this symtab.", NULL }, {NULL} /* Sentinel */ }; @@ -536,10 +571,13 @@ Return the global block of the symbol table." }, { "static_block", stpy_static_block, METH_NOARGS, "static_block () -> gdb.Block.\n\ Return the static block of the symbol table." }, + { "linetable", stpy_get_linetable, METH_NOARGS, + "linetable () -> gdb.LineTable.\n\ +Return the LineTable associated with this symbol table" }, {NULL} /* Sentinel */ }; -static PyTypeObject symtab_object_type = { +PyTypeObject symtab_object_type = { PyVarObject_HEAD_INIT (NULL, 0) "gdb.Symtab", /*tp_name*/ sizeof (symtab_object), /*tp_basicsize*/ @@ -589,7 +627,7 @@ Return true if this symbol table and line is valid, false if not." }, {NULL} /* Sentinel */ }; -static PyTypeObject sal_object_type = { +PyTypeObject sal_object_type = { PyVarObject_HEAD_INIT (NULL, 0) "gdb.Symtab_and_line", /*tp_name*/ sizeof (sal_object), /*tp_basicsize*/