diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/powerpc-aix-prologue.c | 131 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/powerpc-aix-prologue.exp | 7 |
3 files changed, 149 insertions, 1 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d28f725..4044b60 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,17 @@ 2008-09-08 Jerome Guitton <guitton@adacore.com> + * gdb.arch/powerpc-aix-prologue.c (stack_check_probe_1) + (stack_check_probe_2, stack_check_probe_loop_1) + (stack_check_probe_loop_2): New functions. + (main): Add call to these new functions. + * gdb.arch/powerpc-aix-prologue.exp: When breaking on these + functions, check that the breakpoint is inserted at the appropriate + location. + (insert_breakpoint): Slightly refine this procedure so that it can + be called several times in the test. + +2008-09-08 Jerome Guitton <guitton@adacore.com> + * gdb.base/stack-checking.c: New file. * gdb.base/stack-checking.exp: New file. diff --git a/gdb/testsuite/gdb.arch/powerpc-aix-prologue.c b/gdb/testsuite/gdb.arch/powerpc-aix-prologue.c index 284aa05..c0cdd83 100644 --- a/gdb/testsuite/gdb.arch/powerpc-aix-prologue.c +++ b/gdb/testsuite/gdb.arch/powerpc-aix-prologue.c @@ -17,10 +17,19 @@ void li_stw (void); +void stack_check_probe_1 (void); +void stack_check_probe_2 (void); +void stack_check_probe_loop_1 (void); +void stack_check_probe_loop_2 (void); + int main (void) { li_stw (); + stack_check_probe_1 (); + stack_check_probe_2 (); + stack_check_probe_loop_1 (); + stack_check_probe_loop_2 (); return 0; } @@ -51,3 +60,125 @@ asm (" .csect .text[PR]\n" " lwz 31,-4(1)\n" " blr\n"); +/* Asm for procedure stack_check_probe_1(). + + The purpose of this function is to verify that GDB can skip the stack + checking probing at the beginning of the prologue. */ + +asm (" .csect .text[PR]\n" + " .align 2\n" + " .globl stack_check_probe_1\n" + " .globl .stack_check_probe_1\n" + " .csect stack_check_probe_1[DS]\n" + "stack_check_probe_1:\n" + " .long .stack_check_probe_1, TOC[tc0], 0\n" + " .csect .text[PR]\n" + ".stack_check_probe_1:\n" + " stw 0,-12336(1)\n" + " stw 31,-4(1)\n" + " stwu 1,-48(1)\n" + " mr 31,1\n" + " lwz 1,0(1)\n" + " lwz 31,-4(1)\n" + " blr\n"); + +/* Asm for procedure stack_check_probe_2 (). + + Similar to stack_check_probe_1, but with a different probing sequence + (several probes). */ + +asm (" .csect .text[PR]\n" + " .align 2\n" + " .globl stack_check_probe_2\n" + " .globl .stack_check_probe_2\n" + " .csect stack_check_probe_2[DS]\n" + "stack_check_probe_2:\n" + " .long .stack_check_probe_2, TOC[tc0], 0\n" + " .csect .text[PR]\n" + ".stack_check_probe_2:\n" + " stw 0,-16384(1)\n" + " stw 0,-20480(1)\n" + " stw 0,-24576(1)\n" + " stw 0,-28672(1)\n" + " stw 0,-28752(1)\n" + " mflr 0\n" + " stw 31,-4(1)\n" + " stw 0,8(1)\n" + " stwu 1,-16464(1)\n" + " mr 31,1\n" + " lwz 1,0(1)\n" + " lwz 0,8(1)\n" + " mtlr 0\n" + " lwz 31,-4(1)\n" + " blr\n"); + +/* Asm for procedure stack_check_probe_loop_1() and stack_check_probe_loop_2(). + + Similar to stack_check_probe_1, but with a different probing sequence + (probing loop). */ + +asm (" .csect .text[PR]\n" + " .align 2\n" + " .globl stack_check_probe_loop_1\n" + " .globl .stack_check_probe_loop_1\n" + " .csect stack_check_probe_loop_1[DS]\n" + "stack_check_probe_loop_1:\n" + " .long .stack_check_probe_loop_1, TOC[tc0], 0\n" + " .csect .text[PR]\n" + ".stack_check_probe_loop_1:\n" + " addi 12,1,-12288\n" + " lis 0,-8\n" + " ori 0,0,4096\n" + " add 0,12,0\n" + "LPSRL1..0:\n" + " cmpw 0,12,0\n" + " beq 0,LPSRE1..0\n" + " addi 12,12,-4096\n" + " stw 0,0(12)\n" + " b LPSRL1..0\n" + "LPSRE1..0:\n" + " stw 0,-4080(12)\n" + " mflr 0\n" + " stw 31,-4(1)\n" + " stw 0,8(1)\n" + " lis 0,0xfff8\n" + " ori 0,0,16\n" + " stwux 1,1,0\n" + " mr 31,1\n" + " lwz 1,0(1)\n" + " lwz 0,8(1)\n" + " mtlr 0\n" + " lwz 31,-4(1)\n" + " blr\n"); + +asm (" .csect .text[PR]\n" + " .align 2\n" + " .globl stack_check_probe_loop_2\n" + " .globl .stack_check_probe_loop_2\n" + " .csect stack_check_probe_loop_2[DS]\n" + "stack_check_probe_loop_2:\n" + " .long .stack_check_probe_loop_2, TOC[tc0], 0\n" + " .csect .text[PR]\n" + ".stack_check_probe_loop_2:\n" + " addi 12,1,-12288\n" + " lis 0,-8\n" + " add 0,12,0\n" + "LPSRL2..0:\n" + " cmpw 0,12,0\n" + " beq 0,LPSRE2..0\n" + " addi 12,12,-4096\n" + " stw 0,0(12)\n" + " b LPSRL2..0\n" + "LPSRE2..0:\n" + " mflr 0\n" + " stw 31,-4(1)\n" + " stw 0,8(1)\n" + " lis 0,0xfff8\n" + " ori 0,0,16\n" + " stwux 1,1,0\n" + " mr 31,1\n" + " lwz 1,0(1)\n" + " lwz 0,8(1)\n" + " mtlr 0\n" + " lwz 31,-4(1)\n" + " blr\n"); diff --git a/gdb/testsuite/gdb.arch/powerpc-aix-prologue.exp b/gdb/testsuite/gdb.arch/powerpc-aix-prologue.exp index 49f6ab0..0103451 100644 --- a/gdb/testsuite/gdb.arch/powerpc-aix-prologue.exp +++ b/gdb/testsuite/gdb.arch/powerpc-aix-prologue.exp @@ -55,7 +55,7 @@ proc insert_breakpoint {function expected_location} { # Insert a breakpoint using the given function name, and extract # the breakpoint address for the output. gdb_test_multiple "break $function" "set breakpoint in $function" { - -re "Breakpoint 1 at ($hex).*$gdb_prompt $" { + -re "Breakpoint .* at ($hex).*$gdb_prompt $" { set address $expect_out(1,string) } default { @@ -79,3 +79,8 @@ proc insert_breakpoint {function expected_location} { } insert_breakpoint "li_stw" 12 +insert_breakpoint "stack_check_probe_1" 16 +insert_breakpoint "stack_check_probe_2" 40 +insert_breakpoint "stack_check_probe_loop_1" 68 +insert_breakpoint "stack_check_probe_loop_2" 60 + |