From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id 41AF3385841E for ; Tue, 22 Nov 2022 16:53:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 41AF3385841E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=us.ibm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=us.ibm.com Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 2AMGET8O029532 for ; Tue, 22 Nov 2022 16:53:22 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=message-id : from : to : cc : date : in-reply-to : references : content-type : mime-version : content-transfer-encoding : subject; s=pp1; bh=oT5MDqpzZ4g/6b4hZ1ztY3fDeuj+jM10txVEDUjJCYk=; b=fCnNua4/Bcbaer/ii4023vKfK4gHaq9B0WjS0lOXO+aqK5mqlrppb5CUjXpa0CJVGgDx ahZnaN4rrM+k5TrwO3nhJqrJd02oCY/KbsaM4nGKf+hQyw5T9VyYpkriKFLP+tvazGEH slyfUO89pJKU8Qn6A3sErvOvRO/R6i9elOOz+DZXd+MqY+FYbz45IKinIbQ1zRmeEM4d 3v/9GLVkPE9r8vO5oxJ9Wyh2e6c21jhFXoMyr3imEciXtxBzlIbWvuRuJY/YYJMJnhBx jU6JzqgcTmLDPjlUDKZIyXM46+fpbw830DrmNjoNOBK5qVubKgrs+zz1H+7stENye5rp yQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3m100s493t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 22 Nov 2022 16:53:22 +0000 Received: from m0098416.ppops.net (m0098416.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 2AMGrMtC011942 for ; Tue, 22 Nov 2022 16:53:22 GMT Received: from ppma05wdc.us.ibm.com (1b.90.2fa9.ip4.static.sl-reverse.com [169.47.144.27]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3m100s493m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 22 Nov 2022 16:53:22 +0000 Received: from pps.filterd (ppma05wdc.us.ibm.com [127.0.0.1]) by ppma05wdc.us.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 2AMGpGfr010734; Tue, 22 Nov 2022 16:53:21 GMT Received: from b03cxnp08025.gho.boulder.ibm.com (b03cxnp08025.gho.boulder.ibm.com [9.17.130.17]) by ppma05wdc.us.ibm.com with ESMTP id 3kxpsa5a38-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 22 Nov 2022 16:53:21 +0000 Received: from smtpav06.dal12v.mail.ibm.com ([9.208.128.130]) by b03cxnp08025.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 2AMGrHq416908946 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Nov 2022 16:53:18 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3D32D58043; Tue, 22 Nov 2022 16:53:20 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BC74C58063; Tue, 22 Nov 2022 16:53:19 +0000 (GMT) Received: from li-e362e14c-2378-11b2-a85c-87d605f3c641.ibm.com (unknown [9.163.52.7]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Tue, 22 Nov 2022 16:53:19 +0000 (GMT) Message-ID: From: Carl Love To: Bruno Larsen , "gdb-patches@sourceware.org" , cel@us.ibm.com Cc: Ulrich Weigand , Will Schmidt Date: Tue, 22 Nov 2022 08:53:19 -0800 In-Reply-To: References: <69b2451b-1baf-8bd4-25dd-a1b46963981f@redhat.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5 (3.28.5-18.el8) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 X-Proofpoint-GUID: n_DPs9VmDwvg-1RjHRAAX7Nz-BAMUqFR X-Proofpoint-ORIG-GUID: 4yzFQEBaZlZFLb0dGLJ33tEgYB1nsIQd Subject: RE: [PATCH] PowerPC, fix gdb.reverse/finish-reverse-bkpt.exp and gdb.reverse/next-reverse-bkpt-over-sr.exp X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.895,Hydra:6.0.545,FMLib:17.11.122.1 definitions=2022-11-22_11,2022-11-18_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 suspectscore=0 mlxlogscore=999 adultscore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 spamscore=0 clxscore=1015 bulkscore=0 malwarescore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2210170000 definitions=main-2211220126 X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: GDB maintainers, Bruno: On Tue, 2022-11-22 at 10:42 +0100, Bruno Larsen wrote: > On 14/11/2022 22:05, Carl Love wrote: > > Bruno, GDB maintainers: > > > > > > > > Patch tested on PowerPC and Intel X86-64 with no regressions. > > Hi Carl, > > This was a great approach to solve the problem, but the location of > the > funcp() call in step-reverse.c is generating regressions on my > machine. > > Currently, GDB can't record memset calls in x86_64 (at least using > gcc-12.2.1), due to the instruction 0xc5. OK, my x86_64 box has gcc version 11.3.0 which would explain why I didn't see an issue. > > Moving the funcp and callee calls above the block that contains > memset > fixes the regression and should still fix the PowerPC issue. I moved the calls up as described. So, the latest version should now work on your system. > > Also, style nits inlined. Fixed the three nits. > I have updated the patch, below. If you could take a quick look and make sure it works on your system that would be great. Assuming it is OK, hopefully we can get a maintainer to bless it and we will get the patch committed. Thanks. Carl ---------------------------------------------------------------------- PowerPC, fix gdb.reverse/finish-reverse-bkpt.exp and gdb.reverse/next-reverse-bkpt-over-sr.exp The tests set a break point with the command break *func. This sets a breakpoint on the first instruction of the function. PowerPC uses Global Entry Points (GEP) and Local Entry Points (LEP). The first instruction in the function is the GEP. The GEP sets up register r2 before reaching the LEP. When the function is called with func() the function is entered via the LEP and the test fails because GDB does not see the breakpoint on the GEP. However, if the function is called via a function pointer, execution begins at the GEP as the test expects. The tests were modified to call the function with a function pointer so the test will work correctly on both PowerPC with a GEP and LEP as well as on other systems. The GEP is the same as the LEP on non PowerPC systems. This patch fixes two PowerPC test failures in each of the tests gdb.reverse/finish-reverse-bkpt.exp and gdb.reverse/next-reverse-bkpt-over-sr.exp. Patch tested on PowerPC and Intel X86-64 with no regressions. --- .../gdb.reverse/finish-reverse-bkpt.exp | 30 +++++++++++++++++++ gdb/testsuite/gdb.reverse/finish-reverse.c | 4 +++ .../gdb.reverse/next-reverse-bkpt-over-sr.exp | 29 ++++++++++++++++-- gdb/testsuite/gdb.reverse/step-precsave.exp | 1 + gdb/testsuite/gdb.reverse/step-reverse.c | 9 ++++++ gdb/testsuite/gdb.reverse/step-reverse.exp | 1 + 6 files changed, 71 insertions(+), 3 deletions(-) diff --git a/gdb/testsuite/gdb.reverse/finish-reverse-bkpt.exp b/gdb/testsuite/gdb.reverse/finish-reverse-bkpt.exp index 2a204748d98..94bcf41dc67 100644 --- a/gdb/testsuite/gdb.reverse/finish-reverse-bkpt.exp +++ b/gdb/testsuite/gdb.reverse/finish-reverse-bkpt.exp @@ -19,6 +19,27 @@ # the functions entry would be ignored. Make sure the bug doesn't # reappear. +# The test sets a breakpoint with the command break *void_func to set a +# breakpoint on the first instruction of the function. The issue is on +# PowerPC it uses Global Entry Points (GEP) and Local Entry Points (LEP). +# The GEP is the first instruction in the function. It sets up register +# r2 and then reaches the LEP. +# +# : +# lis r2,4098 <- GEP +# addi r2,r2,32512 +# mflr r0 <- LEP +# std r0,16(r1) +# .... + +# +# The command break *void_func sets the breakpoint on the GEP. Calling +# the function with void_func() will enter the function via the LEP. So, +# this test needs to use a function pointer to call void_func() so the +# function will be entered via the GEP to work as designed on PowerPC in +# addition to non-PowerPC systems. On non-PowerPC systems, the GEP and LEP +# are the same. + if ![supports_reverse] { return } @@ -38,6 +59,15 @@ if [supports_process_record] { gdb_test_no_output "record" "turn on process record" } +# Move to the function pointer call to void_func so we will use the GEP +# to enter void_func and break. +set breakloc [gdb_get_line_number "FUNCTION PTR" "$srcfile"] +gdb_test "break $breakloc" \ + "Breakpoint $decimal at .*$srcfile, line $breakloc\." \ + "set breakpoint on funp" +gdb_continue_to_breakpoint "funp call" ".*$srcfile:$breakloc.*" + +# Start the test set breakloc [gdb_get_line_number "VOID FUNC" "$srcfile"] gdb_test "tbreak void_func" \ "Temporary breakpoint $decimal at .*$srcfile, line $breakloc\." \ diff --git a/gdb/testsuite/gdb.reverse/finish-reverse.c b/gdb/testsuite/gdb.reverse/finish-reverse.c index 316d6f6aa7e..163a028f394 100644 --- a/gdb/testsuite/gdb.reverse/finish-reverse.c +++ b/gdb/testsuite/gdb.reverse/finish-reverse.c @@ -89,6 +89,7 @@ int main (int argc, char **argv) float float_resultval; double double_resultval; int i; + void (*funp) (void) = void_func; /* A "test load" that will insure that the function really returns a ${type} (as opposed to just a truncated or part of a ${type}). */ @@ -123,6 +124,9 @@ int main (int argc, char **argv) testval.double_testval = 3.14159265358979323846; /* float_checkpoint */ double_resultval = double_func (); main_test = 1; /* double_checkpoint */ + + /* This call is used with finish-reverse-bkpt.exp. */ + funp (); /* FUNCTION PTR call to void_func */ return 0; } /* end of main */ diff --git a/gdb/testsuite/gdb.reverse/next-reverse-bkpt-over-sr.exp b/gdb/testsuite/gdb.reverse/next-reverse-bkpt-over-sr.exp index 6ef56d30e7b..d78c6ac490e 100644 --- a/gdb/testsuite/gdb.reverse/next-reverse-bkpt-over-sr.exp +++ b/gdb/testsuite/gdb.reverse/next-reverse-bkpt-over-sr.exp @@ -22,6 +22,25 @@ # to get at the callee's caller. Test that a user breakpoint set at # the same location as the step-resume breakpoint isn't ignored. # +# The test sets a breakpoint with the command break *callee to set a +# breakpoint on the first instruction of the function. The issue is on +# PowerPC it uses Global Entry Points (GEP) and Local Entry Points (LEP). +# The GEP is the first instruction in the function. It sets up register +# r2 and then reaches the LEP. +# +# : +# lis r2,4098 <- GEP +# addi r2,r2,32512 +# mflr r0 <- LEP +# std r0,16(r1) + +# +# The command break *callee sets the breakpoint on the GEP. Calling +# the function with callee() will enter the function via the LEP. So, +# this test needs to use a function pointer to call callee() so the +# function will be entered via the GEP to work as designed on PowerPC in +# addition to non-PowerPC systems. On non-PowerPC systems, the GEP and LEP +# are the same. if ![supports_reverse] { return @@ -42,8 +61,12 @@ if [supports_process_record] { gdb_test_no_output "record" "turn on process record" } -set lineno [gdb_get_line_number "STEP INTO THIS CALL"] -gdb_test "advance $lineno" ".*STEP INTO THIS CALL.*" "get past callee call" +# Move to the function pointer call to the callee call after the function +# pointer call to callee to begin the test. The function pointer call to +# callee will use the Global Entry Point on Power. +set lineno [gdb_get_line_number "STEP INTO CALL AFTER FUNP CALL"] +gdb_test "advance $lineno" ".*STEP INTO CALL AFTER FUNP CALL.*" \ + "get past callee call" gdb_test "b \*callee" "" "set breakpoint at callee's entry" @@ -53,5 +76,5 @@ gdb_test "reverse-next" \ "reverse-next over call trips user breakpoint at function entry" gdb_test "up" \ - ".*NEXT OVER THIS CALL.*" \ + ".*FUNCTION PTR CALL TO CALLEE.*" \ "stopped at the right callee call" diff --git a/gdb/testsuite/gdb.reverse/step-precsave.exp b/gdb/testsuite/gdb.reverse/step-precsave.exp index 3279b6ce879..602dd7e6976 100644 --- a/gdb/testsuite/gdb.reverse/step-precsave.exp +++ b/gdb/testsuite/gdb.reverse/step-precsave.exp @@ -76,6 +76,7 @@ gdb_test "record restore $precsave" \ # plain vanilla step/next (no count) +gdb_test "next" ".*BREAK AT MAIN.*" "next past funp declaration" gdb_test "next" ".*NEXT TEST 1.*" "next test 1" gdb_test "step" ".*STEP TEST 1.*" "step test 1" diff --git a/gdb/testsuite/gdb.reverse/step-reverse.c b/gdb/testsuite/gdb.reverse/step-reverse.c index 809c7d16dc9..83704b42b6b 100644 --- a/gdb/testsuite/gdb.reverse/step-reverse.c +++ b/gdb/testsuite/gdb.reverse/step-reverse.c @@ -54,6 +54,7 @@ large_struct_by_value (struct rhomboidal r) int main () { int w,x,y,z; int a[10], b[10]; + int (*funp) (void) = callee; /* Test "next" and "step" */ w = 0; /* BREAK AT MAIN */ @@ -83,6 +84,14 @@ int main () { y = w + z; + /* Test next-reverse-bkpt-over-sr.exp needs to call function callee using + a function pointer to work correctly on PowerPC. See comments in + next-reverse-bkpt-over-sr.exp. */ + funp (); /* FUNCTION PTR CALL TO CALLEE */ + + /* Test that "step" doesn't */ + callee (); /* STEP INTO CALL AFTER FUNP CALL */ + { struct rhomboidal r; memset (r.rather_large, 0, sizeof (r.rather_large)); diff --git a/gdb/testsuite/gdb.reverse/step-reverse.exp b/gdb/testsuite/gdb.reverse/step-reverse.exp index d2975cffb5c..bce137a97ad 100644 --- a/gdb/testsuite/gdb.reverse/step-reverse.exp +++ b/gdb/testsuite/gdb.reverse/step-reverse.exp @@ -40,6 +40,7 @@ if [supports_process_record] { # plain vanilla step/next (no count) +gdb_test "next" ".*BREAK AT MAIN.*" "next past funp declaration" gdb_test "next" ".*NEXT TEST 1.*" "next test 1" gdb_test "step" ".*STEP TEST 1.*" "step test 1" -- 2.37.2