From patchwork Thu Sep 18 17:15:42 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Evans X-Patchwork-Id: 2909 Received: (qmail 26370 invoked by alias); 18 Sep 2014 17:15:50 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 26354 invoked by uid 89); 18 Sep 2014 17:15:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.7 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-oa0-f74.google.com Received: from mail-oa0-f74.google.com (HELO mail-oa0-f74.google.com) (209.85.219.74) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 18 Sep 2014 17:15:45 +0000 Received: by mail-oa0-f74.google.com with SMTP id m1so92339oag.3 for ; Thu, 18 Sep 2014 10:15:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:content-type :content-transfer-encoding:message-id:date:to:cc:subject:in-reply-to :references; bh=wGD5YnAExc6gHuZyNWSUHDC68x4jJoWoLRt3KgbsRpA=; b=fYRY51Kq/9GZTlfCCXftNgIBnEmegBZHkOB1L8nrZzf/FpyQlsRVOtVSHzeFAJSC3A 0gIolfkGhGTma2/RZgatLIGSPH8GFWLHXt5vAF+OVOaSrNab0Mt2qeFywqYFpedwy00K eMRl9n7SG0T76DzyY5+WDKycpcOSJxAy7od2v7OskcrhjwFz3n1F6OayeYqeOIlyY0G5 n0v5SFnByhCT6acpH7zrMkssheLdiH91FCPg2Ir7JDNiXYOI7DWyrs0oKHyl0Ua1Hc2O RSunFsqrL92aaITITzZY35f7yYtR8hetBEqMRL1AVUpDAADb6GNDMO2MmYZkANx+5HaD zstw== X-Gm-Message-State: ALoCoQkk/St6brguu2jFlRH+g+wxDHaJsetEWeXhbPhRxnZInoa67rhLfdKFXi9cyA3/s+1+Qt0B X-Received: by 10.43.47.135 with SMTP id us7mr5833837icb.32.1411060543724; Thu, 18 Sep 2014 10:15:43 -0700 (PDT) Received: from corpmail-nozzle1-2.hot.corp.google.com ([100.108.1.103]) by gmr-mx.google.com with ESMTPS id n63si987544yho.5.2014.09.18.10.15.42 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Sep 2014 10:15:43 -0700 (PDT) Received: from ruffy2.mtv.corp.google.com ([172.17.128.107]) by corpmail-nozzle1-2.hot.corp.google.com with ESMTP id e7WH2w5B.1; Thu, 18 Sep 2014 10:15:43 -0700 From: Doug Evans MIME-Version: 1.0 Message-ID: <21531.4926.381758.160927@ruffy2.mtv.corp.google.com> Date: Thu, 18 Sep 2014 10:15:42 -0700 To: Pedro Alves , Phil Muldoon Cc: gdb-patches@sourceware.org, eliz@gnu.org Subject: Re: [PATCH] New "producer" attribute for gdb.Symtab objects In-Reply-To: <541AA831.6000509@redhat.com> References: <5418D665.5090309@redhat.com> <21530.11079.11868.273521@ruffy2.mtv.corp.google.com> <541AA831.6000509@redhat.com> X-IsSubscribed: yes Here is what I pushed. Phil: dwarf2read.c checks the producer string to detect several compilers, so more than just gcc use it. 2014-09-16 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. doc/ * python.texi (Symbol Tables In Python): Document "producer" attribute of gdb.Symtab objects. testsuite/ * gdb.dwarf2/symtab-producer.exp: New file. 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..57cf04c --- /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"