From patchwork Fri Feb 21 11:01:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 38266 Received: (qmail 103147 invoked by alias); 21 Feb 2020 11:02:00 -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 103120 invoked by uid 89); 21 Feb 2020 11:01:59 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy=re X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 21 Feb 2020 11:01:58 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B8451AC69 for ; Fri, 21 Feb 2020 11:01:55 +0000 (UTC) Date: Fri, 21 Feb 2020 12:01:54 +0100 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH][gdb/testsuite] Fix gdb.go/methods.exp Message-ID: <20200221110152.GA30305@delia> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-IsSubscribed: yes Hi, With gccgo-6/7, we have: ... FAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo XFAIL: gdb.go/methods.exp: going to first breakpoint \ (the program exited) FAIL: gdb.go/methods.exp: setting breakpoint at (*main.T).Bar XFAIL: gdb.go/methods.exp: going to second breakpoint \ (the program is no longer running) ... And with gccgo-8/9/10, we have: ... PASS: gdb.go/methods.exp: setting breakpoint 1 XFAIL: gdb.go/methods.exp: going to first breakpoint FAIL: gdb.go/methods.exp: setting breakpoint at (*main.T).Bar XFAIL: gdb.go/methods.exp: going to second breakpoint \ (the program exited) ... The first test passes and fails with different messages: ... FAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo ... or: ... PASS: gdb.go/methods.exp: setting breakpoint 1 ... Fix this by removing the explicit pass call and using the message argument for gdb_breakpoint, for both breakpoint locations. The setup of the xfails is non-specific: ... setup_xfail "*-*-*" ;# mangling issues IIRC ... so let's start with removing these. The first FAIL with gccgo-6: ... FAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo ... is due an incorrect DW_AT_name attribute: ... # <554> DW_AT_name : main.Foo.N6_main.T ... Fix this by recognizing the incorrect attribute, and xfailing the test. Furthermore, if setting the breakpoint fails, there's not much point in trying to continue to the breakpoint: ... FAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo FAIL: gdb.go/methods.exp: going to first breakpoint (the program exited) ... Fix this by skipping the second test if the first one fails, also for the second breakpoint. With gccgo-10, we manage to set the first breakpoint, but continuing to breakpoint test fails: ... PASS: gdb.go/methods.exp: setting breakpoint 1 XFAIL: gdb.go/methods.exp: going to first breakpoint ... This is due to an incorrect regexp, requiring a colon in front of the breakpoint location. Fix this for both breakpoints. Setting the second breakpoint fails: ... FAIL: gdb.go/methods.exp: setting breakpoint at (*main.T).Bar ... presumably because the breakpoint location "(*main.T).Bar" does not follow the naming convention explained at https://golang.org/doc/gdb#Naming. Fix this by updating the breakpoint location to "main.(*T).Bar". Still this test fails, for gccgo-6/7 because of an incorrect DW_AT_name attribute: ... # <529> DW_AT_name : main.Bar.pN6_main.T ... and for gccgo-8/9/10 because of incorrect DW_AT_name/DW_AT_linkage_name attributes (filed as gcc PR93866): ... # <6e5> DW_AT_name : main.Bar..1main.T # <6ec> DW_AT_linkage_name: main.T.Bar .. Add xfails for both of these. All in all, now we have with gccgo-6/7: ... XFAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo XFAIL: gdb.go/methods.exp: setting breakpoint at main.(*T).Bar ... and with gccgo-8/9/10, we have: ... PASS: gdb.go/methods.exp: setting breakpoint at main.T.Foo PASS: gdb.go/methods.exp: going to first breakpoint XFAIL: gdb.go/methods.exp: setting breakpoint at main.(*T).Bar ... Tested on x86_64-linux with gccgo-6/7/8/9/10. OK for trunk? Thanks, - Tom [gdb/testsuite] Fix gdb.go/methods.exp gdb/testsuite/ChangeLog: 2020-02-21 Tom de Vries PR go/18926 * lib/gdb.exp (exec_contains_debug_info_string): New proc. * lib/gdb.exp (bp_location2/bp_location2_regexp): Fix. Remove blanket xfails. Use message argument for gdb_breakpoint. Make continuing to breakpoint test conditional on setting breakpoint. Fix continuing to breakpoint regexp. Add xfails for gccgo-6/7 DW_AT_name attribute. Add xfail for GCC PR93866. --- gdb/testsuite/gdb.go/methods.exp | 55 ++++++++++++++++++++++++++++++++-------- gdb/testsuite/lib/gdb.exp | 12 +++++++++ 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/gdb/testsuite/gdb.go/methods.exp b/gdb/testsuite/gdb.go/methods.exp index e698cf378f..3b4b56ccc4 100644 --- a/gdb/testsuite/gdb.go/methods.exp +++ b/gdb/testsuite/gdb.go/methods.exp @@ -29,22 +29,57 @@ if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} {debug go}] } set bp_location1 {main.T.Foo} -set bp_location2 {(*main.T).Bar} -set bp_location2_regexp {\(*main.T\).Bar} +set bp_location2 {main.(*T).Bar} +set bp_location2_regexp {main.\(\*T\).Bar} if { [go_runto_main] < 0 } { untested "could not run to main" return -1 } -if { [gdb_breakpoint ${bp_location1}] } { - pass "setting breakpoint 1" +if { [exec_contains_debug_info_string $binfile \ + "DW_AT_name.*: main.Foo.N6_main.T"] } { + # We have with gccgo-6/7: + # <1><553>: Abbrev Number: 21 (DW_TAG_subprogram) + # <554> DW_AT_name : main.Foo.N6_main.T + setup_xfail "*-*-*" +} else { + # We have with gccgo-8/9/10: + # <1><1e24>: Abbrev Number: 40 (DW_TAG_subprogram) + # <1e25> DW_AT_name : main.Foo.main.T + # <1e2c> DW_AT_linkage_name: main.T.Foo + + # For reference: with go1.11.13: + # <1><6c46b>: Abbrev Number: 2 (DW_TAG_subprogram) + # <6c46c> DW_AT_name : main.T.Foo +} + +if { [gdb_breakpoint ${bp_location1} message]} { + gdb_test "cont" "Breakpoint .*, ${bp_location1}.*" \ + "going to first breakpoint" } -setup_xfail "*-*-*" ;# mangling issues IIRC -gdb_test "cont" "Breakpoint .*:${bp_location1}.*" "going to first breakpoint" -if { [gdb_breakpoint ${bp_location2}] } { - pass "setting breakpoint 2" +if { [exec_contains_debug_info_string $binfile \ + "DW_AT_name.*: main.Bar.pN6_main.T"] } { + # We have with gccgo-6/7: + # <1><528>: Abbrev Number: 19 (DW_TAG_subprogram) + # <529> DW_AT_name : main.Bar.pN6_main.T + setup_xfail "*-*-*" +} elseif { [exec_contains_debug_info_string $binfile \ + "DW_AT_linkage_name.*: main.T.Bar"] } { + # We have with gccgo-8/9/10: + # <1><6e4>: Abbrev Number: 24 (DW_TAG_subprogram) + # <6e5> DW_AT_name : main.Bar..1main.T + # <6ec> DW_AT_linkage_name: main.T.Bar + # xfail for GCC PR93866 + setup_xfail "*-*-*" +} else { + # For reference: with go1.11.13: + # <1><6c49a>: Abbrev Number: 2 (DW_TAG_subprogram) + # <6c49b> DW_AT_name : main.(*T).Bar + } + +if { [gdb_breakpoint ${bp_location2} message] } { + gdb_test "cont" "Breakpoint .*, ${bp_location2_regexp}.*" \ + "going to second breakpoint" } -setup_xfail "*-*-*" ;# mangling issues IIRC -gdb_test "cont" "Breakpoint .*:${bp_location2_regexp}.*" "going to second breakpoint" diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 81518b9646..d64e9d2ce8 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -5381,6 +5381,18 @@ proc exec_has_index_section { executable } { return 0 } +# Return 1 if the .debug_info section in EXECUTABLE matches regexp RE. + +proc exec_contains_debug_info_string { executable re } { + set readelf_program [gdb_find_readelf] + set res [catch {exec $readelf_program -wi $executable \ + | grep -E "$re" }] + if { $res == 0 } { + return 1 + } + return 0 +} + # Return list with major and minor version of readelf, or an empty list. gdb_caching_proc readelf_version { set readelf_program [gdb_find_readelf]