1 /* { dg-do run { target i?86-*-linux* i?86-*-gnu* x86_64-*-linux* } } */
2
3 #include <setjmp.h>
4 #include <signal.h>
5
6 #ifndef NULL
7 #define NULL ((void *)0)
8 #endif
9 static jmp_buf segv_jmpbuf;
10
segv_handler(int seg)11 static void segv_handler(int seg)
12 {
13 __builtin_longjmp(segv_jmpbuf, 1);
14 }
15
is_addressable(void * p,size_t size)16 static int is_addressable(void *p, size_t size)
17 {
18 volatile char * volatile cp = (volatile char *)p;
19 volatile int ret;
20 struct sigaction sa, origsa;
21 sigset_t mask;
22
23 sa.sa_handler = segv_handler;
24 sa.sa_flags = 0;
25 sigfillset(&sa.sa_mask);
26 sigaction(SIGSEGV, &sa, &origsa);
27 sigprocmask(SIG_SETMASK, NULL, &mask);
28
29 if (__builtin_setjmp(segv_jmpbuf) == 0) {
30 while(size--)
31 *cp++;
32 ret = 1;
33 } else
34 ret = 0;
35
36 sigaction(SIGSEGV, &origsa, NULL);
37 sigprocmask(SIG_SETMASK, &mask, NULL);
38
39 return ret;
40 }
41
main(int argc,char ** argv)42 int main(int argc, char **argv)
43 {
44 is_addressable(0x0, 1);
45 return 0;
46 }
47