This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] New "producer" attribute for gdb.Symtab objects


Pedro Alves writes:
 > On 09/17/2014 12:30 AM, Doug Evans wrote:
 > > +# We can't do much to test the producer string (compiler name+version).
 > 
 > Sounds like a job for the testsuite's dwarf compiler.
 > 
 > > +# But we do have support for knowing whether gcc was used, so we can at
 > > +# least use that.
 > > +if { $gcc_compiled } {
 > > +    set producer_regexp "GNU.*"
 > > +} else {
 > > +    set producer_regexp ""
 > > +}

Indeed.

2014-09-16  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.

	doc/
	* python.texi (Symbol Tables In Python): Document "producer"
	attribute of gdb.Symtab objects.

	testsuite/
	* gdb.dwarf2/symtab-producer.exp: Add test for symtab.producer.

diff --git a/gdb/NEWS b/gdb/NEWS
index 3bb1c74..e01ed71 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -4,7 +4,9 @@
 *** Changes since GDB 7.8
 
 * 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/python.texi b/gdb/doc/python.texi
index 9f44948..81ec11b 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 8f4208d..1065ba3 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/gdb.dwarf2/symtab-producer.exp b/gdb/testsuite/gdb.dwarf2/symtab-producer.exp
new file mode 100644
index 0000000..b1dda3e
--- /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 <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 CU 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"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]