This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] testsuite: i386 regression for funcargs.exp


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=01d8c27e4f77375c0e157d115266129b76ff6734

commit 01d8c27e4f77375c0e157d115266129b76ff6734
Author: Jan Kratochvil <jan.kratochvil@redhat.com>
Date:   Mon Jan 11 22:27:15 2016 +0100

    testsuite: i386 regression for funcargs.exp
    
    3ca22649a6dfeb71058c33be4d0542b98f1f0ff5 is the first bad commit
    commit 3ca22649a6dfeb71058c33be4d0542b98f1f0ff5
    Author: Simon Marchi <simon.marchi@polymtl.ca>
    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  <jan.kratochvil@redhat.com>
    	    Pedro Alves  <palves@redhat.com>
    
    	* gdb.base/funcargs.exp (finish from indirectly called function):
    	Reintroduce the case for 'First'.

Diff:
---
 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 8b0425b..c5cee45 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,6 +1,12 @@
 2016-01-11  Jan Kratochvil  <jan.kratochvil@redhat.com>
 	    Pedro Alves  <palves@redhat.com>
 
+	* gdb.base/funcargs.exp (finish from indirectly called function):
+	Reintroduce the case for 'First'.
+
+2016-01-11  Jan Kratochvil  <jan.kratochvil@redhat.com>
+	    Pedro Alves  <palves@redhat.com>
+
 	* gdb.base/foll-vfork.exp (tcatch_vfork_then_parent_follow)
 	(tcatch_vfork_then_child_follow_exec)
 	(tcatch_vfork_then_child_follow_exit): Revert back DWARF vfork
diff --git a/gdb/testsuite/gdb.base/funcargs.exp b/gdb/testsuite/gdb.base/funcargs.exp
index e5b6ced..792ca9e 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"
 	}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]