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 9static jmp_buf segv_jmpbuf; 10 11static void segv_handler(int seg) 12{ 13 __builtin_longjmp(segv_jmpbuf, 1); 14} 15 16static 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 42int main(int argc, char **argv) 43{ 44 is_addressable(0x0, 1); 45 return 0; 46} 47