From patchwork Mon Nov 14 19:40:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 17478 Received: (qmail 76017 invoked by alias); 14 Nov 2016 19:41:09 -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 76001 invoked by uid 89); 14 Nov 2016 19:41:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS, URIBL_RED autolearn=no version=3.3.2 spammy=Temporary X-HELO: gproxy9-pub.mail.unifiedlayer.com Received: from gproxy9-pub.mail.unifiedlayer.com (HELO gproxy9-pub.mail.unifiedlayer.com) (69.89.20.122) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Mon, 14 Nov 2016 19:40:58 +0000 Received: (qmail 27350 invoked by uid 0); 14 Nov 2016 19:40:56 -0000 Received: from unknown (HELO cmgw3) (10.0.90.84) by gproxy9.mail.unifiedlayer.com with SMTP; 14 Nov 2016 19:40:56 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by cmgw3 with id 7vgt1u00E2f2jeq01vgwlD; Mon, 14 Nov 2016 12:40:56 -0700 X-Authority-Analysis: v=2.1 cv=K/+xQUmI c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=L24OOQBejmoA:10 a=zstS-IiYAAAA:8 a=lzDhS8hmAAAA:8 a=mDV3o1hIAAAA:8 a=wRb6tCHyArCVLSicM3kA:9 a=JpZFji5mUmC4leWb:21 a=W4mmUhOo-vAaq-vc:21 a=4G6NA9xxw8l3yy4pmD5M:22 a=rigQk1bY_8VmChEzA3fK:22 a=_FVE-zBwftR9WsbkzFJk:22 Received: from 174-16-143-211.hlrn.qwest.net ([174.16.143.211]:50088 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1c6N7c-0004tH-HT; Mon, 14 Nov 2016 12:40:52 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA] PR symtab/16264 - support DW_AT_main_subprogram Date: Mon, 14 Nov 2016 12:40:46 -0700 Message-Id: <1479152446-329-1-git-send-email-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1c6N7c-0004tH-HT X-Source-Sender: 174-16-143-211.hlrn.qwest.net (bapiya.Home) [174.16.143.211]:50088 X-Source-Auth: tom+tromey.com X-Email-Count: 2 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== This patch adds support for DW_AT_main_subprogram. This is PR symtab/16264. DW_AT_main_subprogram is used to mark a program's entry point. GCC can emit this, and I hope to change the Rust compiler to emit it as well. GDB already supports an older, pre-DWARF 4 convention adopted by FORTRAN compilers, namely to emit DW_AT_calling_convention for the "main" function. However, I think this support in GDB had a small bug, in that it seems to rely on the DW_AT_name being read before DW_AT_calling_convention. This patch fixes this as well. Built and regtested on x86-64 Fedora 24 and the buildbot. New test case included. 2016-11-14 Tom Tromey PR symtab/16264: * dwarf2read.c (struct partial_die_info) : New member. (add_partial_symbol): Call set_objfile_main_name. (read_partial_die): Handle DW_AT_main_subprogram. : don't call set_objfile_main_name, but set main_subprogram flag. 2016-11-14 Tom Tromey * gdb.dwarf2/main-subprogram.c: New file. * gdb.dwarf2/main-subprogram.exp: New file. --- gdb/ChangeLog | 10 ++++ gdb/dwarf2read.c | 33 ++++++++----- gdb/testsuite/ChangeLog | 5 ++ gdb/testsuite/gdb.dwarf2/main-subprogram.c | 29 +++++++++++ gdb/testsuite/gdb.dwarf2/main-subprogram.exp | 73 ++++++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/main-subprogram.c create mode 100644 gdb/testsuite/gdb.dwarf2/main-subprogram.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b4398f6..fafeea9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2016-11-14 Tom Tromey + + PR symtab/16264: + * dwarf2read.c (struct partial_die_info) : New + member. + (add_partial_symbol): Call set_objfile_main_name. + (read_partial_die): Handle DW_AT_main_subprogram. + : don't call set_objfile_main_name, but + set main_subprogram flag. + 2016-11-12 Tom Tromey * rust-exp.y (super_name): Use std::vector. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 1ad6b00..ced7f72 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1105,6 +1105,9 @@ struct partial_die_info unsigned int has_pc_info : 1; unsigned int may_be_inlined : 1; + /* This DIE has been marked DW_AT_main_subprogram. */ + unsigned int main_subprogram : 1; + /* Flag set if the SCOPE field of this structure has been computed. */ unsigned int scope_set : 1; @@ -6930,6 +6933,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) &objfile->static_psymbols, addr, cu->language, objfile); } + + if (pdi->main_subprogram && actual_name != NULL) + set_objfile_main_name (objfile, actual_name, cu->language); break; case DW_TAG_constant: { @@ -15945,19 +15951,18 @@ read_partial_die (const struct die_reader_specs *reader, to describe functions' calling conventions. However, because it's a necessary piece of information in - Fortran, and because DW_CC_program is the only piece of debugging - information whose definition refers to a 'main program' at all, - several compilers have begun marking Fortran main programs with - DW_CC_program --- even when those functions use the standard - calling conventions. - - So until DWARF specifies a way to provide this information and - compilers pick up the new representation, we'll support this - practice. */ + Fortran, and before DWARF 4 DW_CC_program was the only + piece of debugging information whose definition refers to + a 'main program' at all, several compilers marked Fortran + main programs with DW_CC_program --- even when those + functions use the standard calling conventions. + + Although DWARF now specifies a way to provide this + information, we support this practice for backward + compatibility. */ if (DW_UNSND (&attr) == DW_CC_program - && cu->language == language_fortran - && part_die->name != NULL) - set_objfile_main_name (objfile, part_die->name, language_fortran); + && cu->language == language_fortran) + part_die->main_subprogram = 1; break; case DW_AT_inline: if (DW_UNSND (&attr) == DW_INL_inlined @@ -15974,6 +15979,10 @@ read_partial_die (const struct die_reader_specs *reader, } break; + case DW_AT_main_subprogram: + part_die->main_subprogram = DW_UNSND (&attr); + break; + default: break; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 054629f..d971347 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-14 Tom Tromey + + * gdb.dwarf2/main-subprogram.c: New file. + * gdb.dwarf2/main-subprogram.exp: New file. + 2016-11-11 Catherine Moore * gdb.base/dump.exp: Identify verilog format dump tests as such. diff --git a/gdb/testsuite/gdb.dwarf2/main-subprogram.c b/gdb/testsuite/gdb.dwarf2/main-subprogram.c new file mode 100644 index 0000000..97ca22e --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/main-subprogram.c @@ -0,0 +1,29 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2016 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 . */ + +int +mymain () +{ + asm ("mymain_label: .globl mymain_label"); + return 0; +} + +int +main() +{ + return mymain (); +} diff --git a/gdb/testsuite/gdb.dwarf2/main-subprogram.exp b/gdb/testsuite/gdb.dwarf2/main-subprogram.exp new file mode 100644 index 0000000..8adb801 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/main-subprogram.exp @@ -0,0 +1,73 @@ +# Copyright 2016 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 + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +standard_testfile main-subprogram.c enum-type-dw.S + +# Make some DWARF for the test. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + global srcdir subdir srcfile + + set range [function_range mymain ${srcdir}/${subdir}/${srcfile}] + set mymain_start [lindex $range 0] + set mymain_length [lindex $range 1] + + cu {} { + DW_TAG_compile_unit { + {DW_AT_language @DW_LANG_C} + {DW_AT_name main-subprogram.c} + {DW_AT_comp_dir /tmp} + } { + declare_labels type + + type: DW_TAG_base_type { + {DW_AT_byte_size 4 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name int} + } + + DW_TAG_subprogram { + {name mymain} + {low_pc $mymain_start addr} + {high_pc "$mymain_start + $mymain_length" addr} + {type :$type} + {DW_AT_main_subprogram 1 flag} + } { + } + } + } +} + +if {[prepare_for_testing ${testfile}.exp ${testfile} \ + [list $srcfile $asm_file] {nodebug}]} { + return -1 +} + +# Test that the "start" command stops in the "mymain" function. +# This should happen because we used DW_AT_main_subprogram to tell gdb +# that this was the real "main". + +if {[gdb_start_cmd] < 0} { + untested ${testfile} + return -1 +} + +gdb_test "" "Temporary breakpoint .* mymain.*" "start"