From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id mc9pMhqnH2C0WgAAWB0awg (envelope-from ) for ; Sun, 07 Feb 2021 03:38:50 -0500 Received: by simark.ca (Postfix, from userid 112) id B6DA41EF84; Sun, 7 Feb 2021 03:38:50 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id E39DF1E939 for ; Sun, 7 Feb 2021 03:38:48 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0CBD73945C3F; Sun, 7 Feb 2021 08:38:48 +0000 (GMT) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 5EC743857802 for ; Sun, 7 Feb 2021 08:38:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 5EC743857802 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tdevries@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 6C2AFAC88; Sun, 7 Feb 2021 08:38:44 +0000 (UTC) Subject: Re: [PATCH][gdb/symtab] Fix element type modification in read_array_type To: Tom Tromey References: <20210205122814.GA19232@delia> <87k0rm4gvn.fsf@tromey.com> From: Tom de Vries Message-ID: <8b89b73a-205b-0da0-26fe-8d5e45a10886@suse.de> Date: Sun, 7 Feb 2021 09:38:43 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 MIME-Version: 1.0 In-Reply-To: <87k0rm4gvn.fsf@tromey.com> Content-Type: multipart/mixed; boundary="------------5B3D70A4939713F7DF1D4DF0" Content-Language: en-US X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: gdb-patches@sourceware.org Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" This is a multi-part message in MIME format. --------------5B3D70A4939713F7DF1D4DF0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit On 2/5/21 5:30 PM, Tom Tromey wrote: >>>>>> "Tom" == Tom de Vries writes: > > Tom> Fix this conservatively by bailing out in read_array_type when not being able > Tom> to construct an array type. > > Perhaps it should issue a complaint? > Indeed. I've added one. > It seems to me though that if gcc emits DW_TAG_generic_subrange, then > gdb ought to handle it. True, but that's not the issue I'm trying to handle here. I'm trying to fix the bug that the element type is modified, which could also happen f.i. when an array type without any subrange children is processed. I want to file an enhancement PR for supporting DW_TAG_generic_subrange, which I then can mention in the KFAIL I've also added. WDYT? Thanks, - Tom --------------5B3D70A4939713F7DF1D4DF0 Content-Type: text/x-patch; charset=UTF-8; name="0006-gdb-symtab-Fix-element-type-modification-in-read_array_type.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline; filename*0="0006-gdb-symtab-Fix-element-type-modification-in-read_array_"; filename*1="type.patch" [gdb/symtab] Fix element type modification in read_array_type When running test-case gdb.fortran/function-calls.exp with target board unix/gdb:debug_flags=3D-gdwarf-5, I run into: =2E.. (gdb) PASS: gdb.fortran/function-calls.exp: \ p derived_types_and_module_calls::pass_cart(c) p derived_types_and_module_calls::pass_cart_nd(c_nd)^M ^M Program received signal SIGSEGV, Segmentation fault.^M 0x0000000000400f73 in derived_types_and_module_calls::pass_cart_nd \ (c=3D) at = \ function-calls.f90:130^M 130 pass_cart_nd =3D ubound(c%d,1,4)^M The program being debugged was signaled while in a function called from G= DB.^M GDB has restored the context to what it was before the call.^M To change this behavior use "set unwindonsignal off".^M Evaluation of the expression containing the function^M (derived_types_and_module_calls::pass_cart_nd) will be abandoned.^M (gdb) FAIL: gdb.fortran/function-calls.exp: p =2E.. The problem originates in read_array_type, when reading a DW_TAG_array_ty= pe with a dwarf-5 DW_TAG_generic_subrange child. This is not supported, and= the fallout of this is that rather than constructing a new array type, the co= de proceeds to modify the element type. Fix this conservatively by issuing a complaint and bailing out in read_array_type when not being able to construct an array type, such that= we have: =2E.. (gdb) maint expand-symtabs function-calls.f90^M During symbol reading: unable to handle array child DIE \ DW_TAG_generic_subrange - DIE at 0xe1e [in module function-calls]^M During symbol reading: unable to handle array child DIE \ DW_TAG_generic_subrange - DIE at 0xe1e [in module function-calls]^M (gdb) KFAIL: gdb.fortran/function-calls.exp: no complaints in srcfile \ (PRMS: symtab/nnnnn) =2E.. Tested on x86_64-linux. gdb/ChangeLog: 2021-02-06 Tom de Vries PR symtab/27341 * dwarf2/read.c (read_array_type): Return NULL when not being able to construct an array type. Add assert to ensure that element_type is not being modified. 2021-02-06 Tom de Vries PR symtab/27341 * lib/gdb.exp (with_complaints): New proc, factored out of ... (gdb_load_no_complaints): ... here. * gdb.fortran/function-calls.exp: Add test-case. --- gdb/dwarf2/read.c | 11 +++++++ gdb/testsuite/gdb.fortran/function-calls.exp | 16 ++++++++++ gdb/testsuite/lib/gdb.exp | 46 ++++++++++++++++++++--= ------ 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index b0b37358866..2f8869bd11c 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -17246,6 +17246,15 @@ read_array_type (struct die_info *die, struct dw= arf2_cu *cu) range_types.push_back (child_type); } } + else + { + complaint (_("unable to handle array child DIE %s" + " - DIE at %s [in module %s]"), + dwarf_tag_name (child_die->tag), + sect_offset_str (die->sect_off), + objfile_name (cu->per_objfile->objfile)); + return NULL; + } child_die =3D child_die->sibling; } =20 @@ -17278,6 +17287,8 @@ read_array_type (struct die_info *die, struct dwa= rf2_cu *cu) } } =20 + gdb_assert (type !=3D element_type); + /* Understand Dwarf2 support for vector types (like they occur on the PowerPC w/ AltiVec). Gcc just adds another attribute to the array type. This is not part of the Dwarf2/3 standard yet, but a diff --git a/gdb/testsuite/gdb.fortran/function-calls.exp b/gdb/testsuite= /gdb.fortran/function-calls.exp index a14cfaeb08a..d1d781ff59f 100644 --- a/gdb/testsuite/gdb.fortran/function-calls.exp +++ b/gdb/testsuite/gdb.fortran/function-calls.exp @@ -24,6 +24,22 @@ if {[prepare_for_testing ${testfile}.exp ${testfile} $= {srcfile} {debug f90}]} { return -1 } =20 +with_complaints 5 { + set cmd "maint expand-symtabs $srcfile" + set cmd_regexp [string_to_regexp $cmd] + set re_kfail [concat "During symbol reading:" \ + " unable to handle array child" \ + " DIE DW_TAG_generic_subrange"] + gdb_test_multiple $cmd "no complaints in srcfile" { + -re -wrap "$re_kfail.*" { + kfail symtab/nnnnn $gdb_test_name + } + -re "^$cmd_regexp\r\n$gdb_prompt $" { + pass $gdb_test_name + } + } +} + if {![runto [gdb_get_line_number "post_init"]]} then { perror "couldn't run to breakpoint post_init" continue diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index dbbf239dab9..69a81353b05 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -5096,11 +5096,11 @@ proc gdb_load { arg } { } =20 # -# gdb_load_no_complaints -- As gdb_load, but in addition verifies that -# loading caused no symbol reading complaints. +# with_complaints -- Execute BODY and set complaints temporary to N for = the +# duration. # -proc gdb_load_no_complaints { arg } { - global gdb_prompt gdb_file_cmd_msg decimal +proc with_complaints { n body } { + global decimal =20 # Save current setting of complaints. set save "" @@ -5112,23 +5112,43 @@ proc gdb_load_no_complaints { arg } { } } =20 - # Fall back to regular gdb_load if we couldn't get the current setti= ng - # of complaints. if { $save =3D=3D "" } { - return gdb_load $arg + perror "Did not manage to set complaints" + } else { + # Set complaints. + gdb_test_no_output "set complaints $n" "" } =20 - # Temporarily set complaint to a small non-zero number. - gdb_test_no_output "set complaints 5" "" + set code [catch {uplevel 1 $body} result] + + # Restore saved setting of complaints. + if { $save !=3D "" } { + gdb_test_no_output "set complaints $save" "" + } + + if {$code =3D=3D 1} { + global errorInfo errorCode + return -code $code -errorinfo $errorInfo -errorcode $errorCode $result + } else { + return -code $code $result + } +} =20 - gdb_load $arg +# +# gdb_load_no_complaints -- As gdb_load, but in addition verifies that +# loading caused no symbol reading complaints. +# +proc gdb_load_no_complaints { arg } { + global gdb_prompt gdb_file_cmd_msg decimal + + # Temporarily set complaint to a small non-zero number. + with_complaints 5 { + gdb_load $arg + } =20 # Verify that there were no complaints. set re "\r\nDuring symbol reading: " gdb_assert {![regexp $re $gdb_file_cmd_msg]} "No complaints" - - # Restore saved setting of complaints. - gdb_test_no_output "set complaints $save" "" } =20 # gdb_reload -- load a file into the target. Called before "running", --------------5B3D70A4939713F7DF1D4DF0--