From patchwork Thu Sep 18 00:45:59 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Evans X-Patchwork-Id: 2902 Received: (qmail 8289 invoked by alias); 18 Sep 2014 00:46:05 -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 8280 invoked by uid 89); 18 Sep 2014 00:46:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.8 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-ig0-f202.google.com Received: from mail-ig0-f202.google.com (HELO mail-ig0-f202.google.com) (209.85.213.202) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 18 Sep 2014 00:46:02 +0000 Received: by mail-ig0-f202.google.com with SMTP id h15so78910igd.1 for ; Wed, 17 Sep 2014 17:46:00 -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=2uXkxpZrr/+i2ffNdx8Av/7pKZ0x5cbXgEnBrjChbkY=; b=Uzs3tkfikkunSnQA3th6p08uW4I9gUAL0PdO4qGKJ6KpkU43fCKes497MW91DblV03 6QqV/5NAmp5cVtMq1nw0S1VovCv5z/tr1OwPC+Ww2oMyhcrMETkliVMXQk4mafDblWqj e6TETd8sa8QpkBYF8jMUrFTUOJtVZO8bc6oULvmHHjSwGCPTWHwTl8J/UR29cr6J4GXQ H6bYItKiXZD9AeZ8i4nPTvWNY9SsmONSAdgMt4X5V+Ch67Rdk3CSI7GHrDIhKb1GiQR8 kHy0pIQG06sv3CcurWdG3pJ06AKDLKQKYKFF68EUu6DadQXa8uK/wyP2dNEDniT7LSkr pUIg== X-Gm-Message-State: ALoCoQlonziSgLImEx7NgZpLPwkpHQ2jVnvMNcuodyDoUxIYTPLVJLOPLrBjqxz1BWPb0XefY7Gy X-Received: by 10.182.199.4 with SMTP id jg4mr797143obc.43.1411001160354; Wed, 17 Sep 2014 17:46:00 -0700 (PDT) Received: from corpmail-nozzle1-2.hot.corp.google.com ([100.108.1.103]) by gmr-mx.google.com with ESMTPS id l45si908488yha.2.2014.09.17.17.45.59 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Sep 2014 17:46:00 -0700 (PDT) Received: from ruffy2.mtv.corp.google.com ([172.17.128.107]) by corpmail-nozzle1-2.hot.corp.google.com with ESMTP id hITnobst.1; Wed, 17 Sep 2014 17:46:00 -0700 From: Doug Evans MIME-Version: 1.0 Message-ID: <21530.11079.11868.273521@ruffy2.mtv.corp.google.com> Date: Wed, 17 Sep 2014 17:45:59 -0700 To: Pedro Alves Cc: gdb-patches@sourceware.org, eliz@gnu.org Subject: Re: [PATCH] New "producer" attribute for gdb.Symtab objects In-Reply-To: <5418D665.5090309@redhat.com> References: <5418D665.5090309@redhat.com> X-IsSubscribed: yes 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 * 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 . + +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"