New "producer" attribute of python gdb.Symtab.
authorDoug Evans <dje@google.com>
Thu, 18 Sep 2014 17:09:12 +0000 (10:09 -0700)
committerDoug Evans <dje@google.com>
Thu, 18 Sep 2014 17:09:12 +0000 (10:09 -0700)
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
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/python.texi
gdb/python/py-symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/symtab-producer.exp [new file with mode: 0644]

index 9b456c04a2f472a25ae947ef567a62165b02742e..3fbc13ec200984658e074c7a2064849a4f6db941 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-18  Doug Evans  <dje@google.com>
+
+       * 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  <uweigand@de.ibm.com>
 
        PR gdb/17384
index 343ee49c0a1c566bae63cdda291a8762afb68a4b..82ee57bd2b7c115d1957bf83753692c6272dab05 100644 (file)
--- 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:
 
index 053fd36d5365c3967ef309adfa2a12b74a7677bc..b5fac5a9441c1bcf051d650a9647c0eda018fba3 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-18  Doug Evans  <dje@google.com>
+
+       * python.texi (Symbol Tables In Python): Document "producer"
+       attribute of gdb.Symtab objects.
+
 2014-09-16  Pedro Alves  <palves@redhat.com>
 
        * gdb.texinfo (Starting) <run command>: Don't mention VxWorks.
index 9f44948ddcf5d5ced44b1ba2d172cd9aae018b28..81ec11bc6a162b19205ba51d8e3511fe8e7d1569 100644 (file)
@@ -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 ()
index 8f4208d533401d5cb83d84821ff57879f7e6786f..1065ba348a808bf3994535fac1713c0c190aa9a8 100644 (file)
@@ -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 */
 };
 
index 60cb2241b1d431072a78b12063db7126cb4e5f9d..a4b03dc9f810e038b02ffb58aec449feb93c2fcb 100644 (file)
@@ -1,3 +1,7 @@
+2014-09-18  Doug Evans  <dje@google.com>
+
+       * gdb.dwarf2/symtab-producer.exp: New file.
+
 2014-09-16  Sergio Durigan Junior  <sergiodj@redhat.com>
 
        * 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 (file)
index 0000000..57cf04c
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+
+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"