From 01d8c27e4f77375c0e157d115266129b76ff6734 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 11 Jan 2016 22:27:15 +0100 Subject: [PATCH] testsuite: i386 regression for funcargs.exp 3ca22649a6dfeb71058c33be4d0542b98f1f0ff5 is the first bad commit commit 3ca22649a6dfeb71058c33be4d0542b98f1f0ff5 Author: Simon Marchi Date: Mon Dec 21 12:51:54 2015 -0500 Remove HP-UX references fom testsuite @@ -1013,13 +1013,6 @@ proc localvars_in_indirect_call { } { # gdb_test_multiple "finish" "finish from indirectly called function" { - -re "\\(\\*pointer_to_call0a\\) \\(c, s, i, l\\);.*First.*$gdb_prompt $" { - #On hppa2.0w-hp-hpux11.00, gdb finishes at one line earlier than - #hppa1.1-hp-hpux11.00. Therefore, an extra "step" is necessary - #to continue the test. - send_gdb "step\n" - exp_continue - } -re ".*\\(\\*pointer_to_call0a\\) \\(c, s, i, l\\);.*Second.*$gdb_prompt $" { pass "finish from indirectly called function" } -> finish^M Run till exit from #0 call0a (c=97 'a', s=1, i=2, l=3) at ./gdb.base/funcargs.c:82^M 0x0804a189 in main () at ./gdb.base/funcargs.c:583^M 583 (*pointer_to_call0a) (c, s, i, l); /* First step into call0a. */^M -(gdb) step^M -584 (*pointer_to_call0a) (c, s, i, l); /* Second step into call0a. */^M -(gdb) PASS: gdb.base/funcargs.exp: finish from indirectly called function +(gdb) FAIL: gdb.base/funcargs.exp: finish from indirectly called function step^M -call0a (c=97 'a', s=1, i=2, l=3) at ./gdb.base/funcargs.c:82^M -82 c = 'a';^M -(gdb) PASS: gdb.base/funcargs.exp: stepping into indirectly called function +584 (*pointer_to_call0a) (c, s, i, l); /* Second step into call0a. */^M +(gdb) FAIL: gdb.base/funcargs.exp: stepping into indirectly called function At least on x86_64 with testsuite in -m32 (expecting native i386 would be the same). Pedro Alves: The difference is that with newer GCC there's an extra instruction after the call which is still assigned to line 583: $ diff -up /tmp/4.8.3 /tmp/6.0.0 -U 1000 --- /tmp/4.8.3 2016-01-11 12:37:39.611089156 +0000 +++ /tmp/6.0.0 2016-01-11 13:21:00.021127976 +0000 @@ -1,27 +1,30 @@ 583 (*pointer_to_call0a) (c, s, i, l); /* First step into call0a. */ mov 0x804d060,%ebx mov 0x804d050,%ecx movzwl 0x804d040,%eax movswl %ax,%edx movzbl 0x804d030,%eax movsbl %al,%eax - mov %ebx,0xc(%esp) - mov %ecx,0x8(%esp) - mov %edx,0x4(%esp) - mov %eax,(%esp) - mov 0x7c(%esp),%eax + push %ebx + push %ecx + push %edx + push %eax + mov -0x1c(%ebp),%eax call *%eax + add $0x10,%esp 584 (*pointer_to_call0a) (c, s, i, l); /* Second step into call0a. */ mov 0x804d060,%ebx mov 0x804d050,%ecx movzwl 0x804d040,%eax movswl %ax,%edx movzbl 0x804d030,%eax movsbl %al,%eax - mov %ebx,0xc(%esp) - mov %ecx,0x8(%esp) - mov %edx,0x4(%esp) - mov %eax,(%esp) - mov 0x7c(%esp),%eax + push %ebx + push %ecx + push %edx + push %eax + mov -0x1c(%ebp),%eax call *%eax + add $0x10,%esp + I don't know why -m32 changed to push/add instead of mov while 64-bit hasn't. This is most likely needed on non-x86 ports as well. gdb/testsuite/ChangeLog 2016-01-11 Jan Kratochvil Pedro Alves * gdb.base/funcargs.exp (finish from indirectly called function): Reintroduce the case for 'First'. --- gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.base/funcargs.exp | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8b0425b1d47..c5cee45eaa8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-01-11 Jan Kratochvil + Pedro Alves + + * gdb.base/funcargs.exp (finish from indirectly called function): + Reintroduce the case for 'First'. + 2016-01-11 Jan Kratochvil Pedro Alves diff --git a/gdb/testsuite/gdb.base/funcargs.exp b/gdb/testsuite/gdb.base/funcargs.exp index e5b6ced2b52..792ca9efd21 100644 --- a/gdb/testsuite/gdb.base/funcargs.exp +++ b/gdb/testsuite/gdb.base/funcargs.exp @@ -1013,6 +1013,13 @@ proc localvars_in_indirect_call { } { # gdb_test_multiple "finish" "finish from indirectly called function" { + -re "\\(\\*pointer_to_call0a\\) \\(c, s, i, l\\);.*First.*$gdb_prompt $" { + # If the branch instruction is not the last instruction in the + # function call line, we'll stop at that line, and need an extra + # "step" to continue the test. + send_gdb "step\n" + exp_continue + } -re ".*\\(\\*pointer_to_call0a\\) \\(c, s, i, l\\);.*Second.*$gdb_prompt $" { pass "finish from indirectly called function" } -- 2.30.2