OLD | NEW |
1 /* This testcase is part of GDB, the GNU debugger. | 1 /* This testcase is part of GDB, the GNU debugger. |
2 | 2 |
3 Copyright 2004, 2007-2012 Free Software Foundation, Inc. | 3 Copyright 2012 Free Software Foundation, Inc. |
4 | 4 |
5 This program is free software; you can redistribute it and/or modify | 5 This program is free software; you can redistribute it and/or modify |
6 it under the terms of the GNU General Public License as published by | 6 it under the terms of the GNU General Public License as published by |
7 the Free Software Foundation; either version 3 of the License, or | 7 the Free Software Foundation; either version 3 of the License, or |
8 (at your option) any later version. | 8 (at your option) any later version. |
9 | 9 |
10 This program is distributed in the hope that it will be useful, | 10 This program is distributed in the hope that it will be useful, |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 GNU General Public License for more details. | 13 GNU General Public License for more details. |
14 | 14 |
15 You should have received a copy of the GNU General Public License | 15 You should have received a copy of the GNU General Public License |
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
17 | 17 |
18 #include <signal.h> | 18 #include <setjmp.h> |
| 19 #include <string.h> |
19 #include <stdlib.h> | 20 #include <stdlib.h> |
20 #include <string.h> | |
21 | 21 |
22 extern void | 22 #define BUFSIZE 0x1000 |
23 keeper (int sig) | 23 |
| 24 static jmp_buf jmp; |
| 25 |
| 26 void |
| 27 infcall (void) |
24 { | 28 { |
| 29 longjmp (jmp, 1); /* test-next */ |
25 } | 30 } |
26 | 31 |
27 volatile long v1 = 0; | 32 static void |
28 volatile long v2 = 0; | 33 run1 (void) |
29 volatile long v3 = 0; | 34 { |
| 35 char buf[BUFSIZE / 2]; |
| 36 int dummy = 0; |
30 | 37 |
31 extern long | 38 dummy++; /* break-run1 */ |
32 bowler (void) | 39 } |
| 40 |
| 41 static char buf_zero[BUFSIZE]; |
| 42 |
| 43 static void |
| 44 run2 (void) |
33 { | 45 { |
34 /* Try to read address zero. Do it in a slightly convoluted way so | 46 char buf[BUFSIZE]; |
35 that more than one instruction is used. */ | 47 |
36 return *(char *) (v1 + v2 + v3); | 48 memset (buf, 0, sizeof (buf)); |
| 49 |
| 50 if (memcmp (buf, buf_zero, sizeof (buf)) != 0) /* break-run2 */ |
| 51 abort (); /* break-fail */ |
37 } | 52 } |
38 | 53 |
39 int | 54 int |
40 main () | 55 main () |
41 { | 56 { |
42 static volatile int i; | 57 if (setjmp (jmp) == 0) /* test-pass */ |
| 58 infcall (); |
43 | 59 |
44 struct sigaction act; | 60 if (setjmp (jmp) == 0) /* test-fail */ |
45 memset (&act, 0, sizeof act); | 61 run1 (); |
46 act.sa_handler = keeper; | 62 else |
47 sigaction (SIGSEGV, &act, NULL); | 63 run2 (); |
48 sigaction (SIGBUS, &act, NULL); | |
49 | 64 |
50 bowler (); | 65 return 0; /* break-exit */ |
51 return 0; | |
52 } | 66 } |
OLD | NEW |