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