This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFC 2/4] - Update tests
- From: Pedro Alves <pedro at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Wed, 9 Apr 2008 15:55:55 +0100
- Subject: [RFC 2/4] - Update tests
This updates the tests from the previous series to the new behaviour
and adds some more.
--
Pedro Alves
2008-04-09 Pedro Alves <pedro@codesourcery.com>
* longjmp.c, longjmp.exp: Add tests to test ignoring inner
longjmp-resumes while stepping, and update current tests.
---
gdb/testsuite/gdb.base/longjmp.c | 87 +++++++++++++++++++++++++++++++++-
gdb/testsuite/gdb.base/longjmp.exp | 92 +++++++++++++++++++++++++++++++++++--
2 files changed, 172 insertions(+), 7 deletions(-)
Index: src/gdb/testsuite/gdb.base/longjmp.c
===================================================================
--- src.orig/gdb/testsuite/gdb.base/longjmp.c 2008-04-07 13:50:49.000000000 +0100
+++ src/gdb/testsuite/gdb.base/longjmp.c 2008-04-07 13:56:00.000000000 +0100
@@ -19,6 +19,7 @@
#include <setjmp.h>
jmp_buf env;
+jmp_buf env2;
volatile int longjmps = 0;
volatile int resumes = 0;
@@ -33,7 +34,7 @@ call_longjmp (jmp_buf *buf)
void
hidden_longjmp (void)
{
- if (setjmp (env) == 0) /* longjmp caught */
+ if (setjmp (env) == 0)
{
call_longjmp (&env);
}
@@ -41,6 +42,51 @@ hidden_longjmp (void)
resumes++;
}
+void
+hidden_longjmp_2 (void)
+{
+ if (setjmp (env) == 0)
+ {
+ if (setjmp (env2) == 0)
+ {
+ longjmps++;
+ longjmp (env2, 1);
+ }
+ else
+ {
+ resumes++;
+ longjmps++;
+ longjmp (env, 1);
+ }
+ }
+ else
+ {
+ resumes++;
+ }
+}
+
+void
+hidden_longjmp_3_1 (void)
+{
+ if (setjmp (env2) == 0)
+ {
+ longjmps++;
+ longjmp (env2, 1);
+ }
+ else
+ {
+ resumes++;
+ longjmps++;
+ longjmp (env, 1);
+ }
+}
+
+void
+hidden_longjmp_3 (void)
+{
+ hidden_longjmp_3_1 ();
+}
+
int
main ()
{
@@ -72,10 +118,43 @@ main ()
i = 2; /* miss_step_2 */
- /* Pattern 3 - setjmp/longjmp inside stepped-over function. */
- hidden_longjmp (); /* patt3 */
+ /* This tests if GDB chooses the longjmp-resume over the
+ step-resume breakpoint. If GDB chooses wrongly, a step over the
+ hidden_longjmp_3 function will resume the inferior and pass
+ straight the else clause without stopping to step. */
+ if (setjmp (env) == 0) /* patt3 */
+ hidden_longjmp_3 ();
+ else
+ resumes++;
+
+ i = 3; /* miss_step_3 */
+
+
+ /* Quite similar, but in this case, we step into hidden_longjmp_3
+ before next'ing over the longjmp. In this case, the step-resume
+ breakpoint will be set in an inner stack. Check if GDB still
+ detects that the longjmp-resume address is prefered. */
+ if (setjmp (env) == 0) /* patt4 */
+ hidden_longjmp_3 ();
+ else
+ resumes++;
+
+ i = 4; /* miss_step_4 */
+
+
+ /* Test that we don't miss-handle internal setjmp/longjmp
+ sequences. */
+
+ /* setjmp/longjmp handled completelly inside the function. A next
+ over this should not stop at the longjmp resume address. */
+ hidden_longjmp (); /* patt5 */
+
+ i = 5; /* patt_end5. */
+
+ /* Same, but with a nested setjmp/longjmp sequence. */
+ hidden_longjmp_2 (); /* patt6 */
- i = 3; /* patt_end3. */
+ i = 6; /* patt_end6. */
return 0;
}
Index: src/gdb/testsuite/gdb.base/longjmp.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/longjmp.exp 2008-04-07 13:55:46.000000000 +0100
+++ src/gdb/testsuite/gdb.base/longjmp.exp 2008-04-07 13:56:01.000000000 +0100
@@ -49,10 +49,15 @@ if ![runto_main] then {
set bp_miss_step_1 [gdb_get_line_number "miss_step_1"]
set bp_miss_step_2 [gdb_get_line_number "miss_step_2"]
+set bp_miss_step_3 [gdb_get_line_number "miss_step_3"]
+set bp_miss_step_4 [gdb_get_line_number "miss_step_4"]
set bp_start_test_1 [gdb_get_line_number "patt1"]
set bp_start_test_2 [gdb_get_line_number "patt2"]
set bp_start_test_3 [gdb_get_line_number "patt3"]
+set bp_start_test_4 [gdb_get_line_number "patt4"]
+set bp_start_test_5 [gdb_get_line_number "patt5"]
+set bp_start_test_6 [gdb_get_line_number "patt6"]
#
# Pattern 1 - simple longjmp.
@@ -117,7 +122,7 @@ gdb_test_multiple "next" $msg {
}
#
-# Pattern 3 - setjmp/longjmp inside stepped-over function.
+# Pattern 3 - prefer longjmp-resume
#
delete_breakpoints
@@ -125,6 +130,87 @@ delete_breakpoints
gdb_test "break $bp_start_test_3" \
"Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_3.*" \
"breakpoint at pattern 3 start"
-gdb_test "continue" "patt3.*" "continue to breakpoint at pattern 3 start"
+gdb_test "continue" "patt3.*" \
+ "continue to breakpoint at pattern 3 start"
+
+
+# set safe-net break
+gdb_test "break $bp_miss_step_3" \
+ "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_3.*" \
+ "breakpoint at miss_step_3"
+
+gdb_test "next" "hidden_longjmp_3 \\(\\).*" "next over setjmp (3)"
+
+set msg "next over hidden_longjmp_3 (3)"
+gdb_test_multiple "next" $msg {
+ -re "patt3.*" {
+ pass $msg
+
+ gdb_test "next" "resumes\\+\\+.*" "next into else block (3)"
+ gdb_test "next" "miss_step_3.*" "next into safety next (3)"
+ }
+ -re "miss_step_3" {
+ fail $msg
+ }
+}
+
+
+#
+# Pattern 4 - prefer longjmp-resume after step
+#
+
+delete_breakpoints
+
+gdb_test "break $bp_start_test_4" \
+ "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_4.*" \
+ "breakpoint at pattern 4 start"
+gdb_test "continue" "patt4.*" "continue to breakpoint at pattern 4 start"
+
+# set safe-net break
+gdb_test "break $bp_miss_step_4" \
+ "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_4.*" \
+ "breakpoint at miss_step_4"
+
+gdb_test "next" "hidden_longjmp_3 \\(\\).*" "next over setjmp (4)"
+gdb_test "step" "hidden_longjmp_3_1 \\(\\).*" "step into hidden_longjmp_3 (4)"
+
+set msg "next over hidden_longjmp_3_1 (4)"
+gdb_test_multiple "next" $msg {
+ -re "patt4.*" {
+ pass $msg
+
+ gdb_test "next" "resumes\\+\\+.*" "next into else block (4)"
+ gdb_test "next" "miss_step_4.*" "next safety next (4)"
+ }
+ -re "miss_step_4.*" {
+ fail $msg
+ }
+}
+
+#
+# Pattern 5 - setjmp/longjmp handled inside stepped-over function.
+#
+
+delete_breakpoints
+
+gdb_test "break $bp_start_test_5" \
+ "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_5.*" \
+ "breakpoint at pattern 5 start"
+gdb_test "continue" "patt5.*" "continue to breakpoint at pattern 5 start"
+
+gdb_test "next" "patt_end5.*" "next over patt5"
+
+#
+# Pattern 6 - nested setjmp/longjmp handled inside stepped-over
+# function.
+#
+
+delete_breakpoints
+
+gdb_test "break $bp_start_test_6" \
+ "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_6.*" \
+ "breakpoint at pattern 6 start"
+gdb_test "continue" "patt6.*" "continue to breakpoint at pattern 6 start"
+
+gdb_test "next" "patt_end6.*" "next over patt6"
-gdb_test "next" "longjmp caught.*" "next over patt3"