From 2b4fd423cf503beb6264590f0517d35f17a6ab8d Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Thu, 18 Sep 2014 10:09:12 -0700 Subject: [PATCH] New "producer" attribute of python gdb.Symtab. gdb/ChangeLog: * NEWS: Mention new "producer" attribute of gdb.Symtab. * python/py-symtab.c (stpy_get_producer): New function. (symtab_object_getset): Add "producer" attribute. gdb/doc/ChangeLog: * python.texi (Symbol Tables In Python): Document "producer" attribute of gdb.Symtab objects. gdb/testsuite/ChangeLog: * gdb.dwarf2/symtab-producer.exp: New file. --- gdb/ChangeLog | 6 ++ gdb/NEWS | 4 +- gdb/doc/ChangeLog | 5 + gdb/doc/python.texi | 8 ++ gdb/python/py-symtab.c | 21 ++++ gdb/testsuite/ChangeLog | 4 + gdb/testsuite/gdb.dwarf2/symtab-producer.exp | 103 +++++++++++++++++++ 7 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.dwarf2/symtab-producer.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9b456c04a2..3fbc13ec20 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2014-09-18 Doug Evans + + * NEWS: Mention new "producer" attribute of gdb.Symtab. + * python/py-symtab.c (stpy_get_producer): New function. + (symtab_object_getset): Add "producer" attribute. + 2014-09-17 Ulrich Weigand  PR gdb/17384 diff --git a/gdb/NEWS b/gdb/NEWS index 343ee49c0a..82ee57bd2b 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -6,7 +6,9 @@ * GDB now supports hardware watchpoints on x86 GNU Hurd. * Python Scripting - You can now access frame registers from Python scripts. + + ** You can now access frame registers from Python scripts. + ** New attribute 'producer' for gdb.Symtab objects. * New Python-based convenience functions: diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 053fd36d53..b5fac5a944 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2014-09-18 Doug Evans + + * python.texi (Symbol Tables In Python): Document "producer" + attribute of gdb.Symtab objects. + 2014-09-16 Pedro Alves * gdb.texinfo (Starting) : Don't mention VxWorks. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 9f44948ddc..81ec11bc6a 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -4043,6 +4043,14 @@ The symbol table's backing object file. @xref{Objfiles In Python}. This attribute is not writable. @end defvar +@defvar Symtab.producer +The name and possibly version number of the program that +compiled the code in the symbol table. +The contents of this string is up to the compiler. +If no producer information is available then @code{None} is returned. +This attribute is not writable. +@end defvar + A @code{gdb.Symtab} object has the following methods: @defun Symtab.is_valid () diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c index 8f4208d533..1065ba348a 100644 --- a/gdb/python/py-symtab.c +++ b/gdb/python/py-symtab.c @@ -126,6 +126,25 @@ stpy_get_objfile (PyObject *self, void *closure) return result; } +/* Getter function for symtab.producer. */ + +static PyObject * +stpy_get_producer (PyObject *self, void *closure) +{ + struct symtab *symtab = NULL; + + STPY_REQUIRE_VALID (self, symtab); + if (symtab->producer != NULL) + { + const char *producer = symtab->producer; + + return PyString_Decode (producer, strlen (producer), + host_charset (), NULL); + } + + Py_RETURN_NONE; +} + static PyObject * stpy_fullname (PyObject *self, PyObject *args) { @@ -530,6 +549,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 */ }; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 60cb2241b1..a4b03dc9f8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-09-18 Doug Evans + + * gdb.dwarf2/symtab-producer.exp: New file. + 2014-09-16 Sergio Durigan Junior * gdb.base/global-var-nested-by-dso-solib1.c: New file. diff --git a/gdb/testsuite/gdb.dwarf2/symtab-producer.exp b/gdb/testsuite/gdb.dwarf2/symtab-producer.exp new file mode 100644 index 0000000000..57cf04c390 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/symtab-producer.exp @@ -0,0 +1,103 @@ +# Copyright 2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib dwarf.exp +load_lib gdb-python.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +# This test can also only be run when we have python support in gdb, +# but that test can only be done after gdb has started, below. + +standard_testfile main.c symtab-producer-dw.S + +# Make some DWARF for the test. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + cu {} { + DW_TAG_compile_unit { + {DW_AT_producer "ACME Compiler Company"} + {DW_AT_language @DW_LANG_C} + {DW_AT_name symtab-producer-dw.c} + {DW_AT_comp_dir /tmp} + } { + declare_labels integer_label + + integer_label: DW_TAG_base_type { + {DW_AT_byte_size 4 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name integer} + } + + DW_TAG_variable { + {DW_AT_name with_producer} + {DW_AT_type :$integer_label} + {DW_AT_external 1 flag} + {DW_AT_const_value 42 DW_FORM_sdata} + } + } + } + cu {} { + DW_TAG_compile_unit { + {DW_AT_language @DW_LANG_C} + {DW_AT_name symtab-producer2-dw.c} + {DW_AT_comp_dir /tmp} + } { + declare_labels integer_label + + integer_label: DW_TAG_base_type { + {DW_AT_byte_size 4 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name integer} + } + + DW_TAG_variable { + {DW_AT_name without_producer} + {DW_AT_type :$integer_label} + {DW_AT_external 1 flag} + {DW_AT_const_value 43 DW_FORM_sdata} + } + } + } +} + +# We need --readnow because otherwise we never read in the CUs we +# created above. +set saved_gdbflags $GDBFLAGS +set GDBFLAGS "$GDBFLAGS -readnow" + +if { [prepare_for_testing ${testfile}.exp ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + set GDBFLAGS $saved_gdbflags + return -1 +} + +set GDBFLAGS $saved_gdbflags + +# Skip all tests if Python scripting is not enabled. +if { [skip_python_tests] } { continue } + +gdb_py_test_silent_cmd "python with_producer = gdb.lookup_global_symbol(\"with_producer\")" \ + "get with_producer symbol" 0 + +gdb_test "python print with_producer.symtab.producer" "ACME Compiler Company" + +gdb_py_test_silent_cmd "python without_producer = gdb.lookup_global_symbol(\"without_producer\")" \ + "get without_producer symbol" 0 + +gdb_test "python print without_producer.symtab.producer" "None"