From: Carl Love <cel@us.ibm.com>
To: Bruno Larsen <blarsen@redhat.com>,
"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Cc: Ulrich Weigand <Ulrich.Weigand@de.ibm.com>,
Will Schmidt <will_schmidt@vnet.ibm.com>
Subject: [PING] Re: [PATCH] PowerPC, fix gdb.reverse/finish-reverse-bkpt.exp and gdb.reverse/next-reverse-bkpt-over-sr.exp
Date: Mon, 21 Nov 2022 08:36:55 -0800 [thread overview]
Message-ID: <977af6a5c429256411322ea4fb418a86407b3114.camel@us.ibm.com> (raw)
In-Reply-To: <cc38f22ba8674b6c64041d52d0481977b4d9d587.camel@us.ibm.com>
Bruno:
When you have a chance, could you take a look at the new version of the
test and see if you agree this does not break the test like my initial
fix did. Thanks.
Carl Love
On Mon, 2022-11-14 at 13:05 -0800, Carl Love wrote:
> Bruno, GDB maintainers:
>
> The first attempt to fix test next-reverse-bkpt-over-sr.exp basically
> breaks the test per the comments from Bruno in the thread with the
> subject [PATCH] Fix test next-reverse-bkpt-over-sr.exp.
>
> The following is a second, new approach to fixing the issue.
>
> PowerPC uses a Global Entry Point (GEP) and a Local Entry Point
> (LEP).
> The GEP is located on the first instruction of the function. It sets
> up register r2 before the LEP.
>
> <callee>:
> lis r2,4098 <- GEP
> addi r2,r2,32512
> mflr r0 <- LEP
> std r0,16(r1)
> ...
>
> The issue is the gdb command break *callee sets the breakpoint on the
> first instruction in the function. The call to function callee
> enters
> the function at the LEP. Thus gdb never "sees" the breakpoint at the
> GEP resulting in the test failing on PowerPC. If the function is
> called using a function pointer, then the linker will setup the call
> to
> use the GEP rather instead of the LEP and the test then works as
> expected on PowerPC.
>
> A new function pointer call to callee afollowed by a normal call to
> callee is added for test next-reverse-bkpt-over-sr.exp at the end of
> the main so as to not change the test behavior of step-reverse.exp.
> Note, the source file step-reverse.c is used by both test next-
> reverse-
> bkpt-over-sr.exp and test step-reverse.exp. Test next-reverse-bkpt-
> over-sr.exp starts at the new call to callee at the end of the main
> program. The rest of the test runs without changes. By entering via
> the GEP on PowerPC, the breakpoint is seen and the test passes as
> expected.
>
> Note, on non PowerPC systems the GEP and LEP are the same. Calling
> function callee normally or with a function pointer has the same
> behavior on non-PowerPC systems. This was specifically verified on
> Intel X86-64.
>
> Test gdb.reverse/finish-reverse-bkpt.exp also fails on PowerPC for
> the
> same reasons as discussed above. Again, this test is modified by
> adding a function pointer call to void_func at the end of main. The
> source code is used for both test finish-reverse-bkpt.exp and finish-
> reverse.exp so the a breakpoint is added to finish-reverse-bkpt.exp
> to
> stop before the function pointer call to void_func where the test
> then
> starts.
>
> The addition of the function pointer declarations in the two source
> files require an additional next statement to tests step-precsave.exp
> and step-reverse.exp to keep the keep things lined up.
>
> Hopefully, this approach to fixing the failing tests on PowerPC is
> acceptable without changing the behavior on non-PowerPC platforms.
>
> The patch has been tested on both PowerPC and X86-64 with no
> regressions.
>
> Please let me know if this patch is acceptable. Thanks.
>
> Carl Love
>
> --------------------------------
> 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.
> +#
> +# <void_func>:
> +# 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..676d960ca9c 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.
> +#
> +# <callee>:
> +# 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..984fd336510 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 */
> @@ -90,6 +91,14 @@ int main () {
> large_struct_by_value (r); /* step-test.exp: large struct by
> value */
> }
>
> + /* 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 */
> +
> exit (0); /* end of main */
> }
>
> 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"
>
next prev parent reply other threads:[~2022-11-21 16:37 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-27 16:14 [PATCH] Fix test next-reverse-bkpt-over-sr.exp Carl Love
2022-09-28 7:35 ` Bruno Larsen
2022-11-14 21:05 ` [PATCH] PowerPC, fix gdb.reverse/finish-reverse-bkpt.exp and gdb.reverse/next-reverse-bkpt-over-sr.exp Carl Love
2022-11-21 16:36 ` Carl Love [this message]
2022-11-22 9:42 ` Bruno Larsen
2022-11-22 16:53 ` Carl Love
2022-11-23 8:44 ` Bruno Larsen
2022-11-23 17:56 ` Ulrich Weigand
2022-11-23 23:33 ` Carl Love
2022-11-28 18:52 ` Carl Love
2022-11-29 8:52 ` Bruno Larsen
2022-11-29 16:50 ` Carl Love
2022-11-29 16:57 ` [PATCH V4] " Carl Love
2022-11-30 11:30 ` Ulrich Weigand
2022-12-01 1:33 ` Carl Love
2022-12-01 15:50 ` [PATCH V5] " Carl Love
2022-12-01 16:02 ` Ulrich Weigand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=977af6a5c429256411322ea4fb418a86407b3114.camel@us.ibm.com \
--to=cel@us.ibm.com \
--cc=Ulrich.Weigand@de.ibm.com \
--cc=blarsen@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=will_schmidt@vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).