1/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */ 2/* { dg-require-effective-target sync_long_long_runtime } */ 3/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ 4 5/* Verify that the builtin functions are correctly marked as trapping 6 when using -fnon-call-exceptions. */ 7 8#include <stdlib.h> 9#include <signal.h> 10 11typedef int ditype __attribute__ ((mode (DI))); 12 13#define FN(IDX, RET, CALL) \ 14static RET f ## IDX (void *p) __attribute__ ((noinline)); \ 15static RET \ 16f ## IDX (void *p) \ 17{ \ 18 return CALL; \ 19} \ 20static void \ 21t ## IDX () \ 22{ \ 23 try \ 24 { \ 25 f ## IDX(0); \ 26 } \ 27 catch (...) \ 28 { \ 29 return; \ 30 } \ 31 abort(); \ 32} 33 34FN(1, ditype, (__sync_fetch_and_add((ditype*)p, 1))) 35FN(2, ditype, (__sync_fetch_and_sub((ditype*)p, 1))) 36FN(3, ditype, (__sync_fetch_and_or((ditype*)p, 1))) 37FN(4, ditype, (__sync_fetch_and_and((ditype*)p, 1))) 38FN(5, ditype, (__sync_fetch_and_xor((ditype*)p, 1))) 39FN(6, ditype, (__sync_fetch_and_nand((ditype*)p, 1))) 40 41FN( 7, ditype, (__sync_add_and_fetch((ditype*)p, 1))) 42FN( 8, ditype, (__sync_sub_and_fetch((ditype*)p, 1))) 43FN( 9, ditype, (__sync_or_and_fetch((ditype*)p, 1))) 44FN(10, ditype, (__sync_and_and_fetch((ditype*)p, 1))) 45FN(11, ditype, (__sync_xor_and_fetch((ditype*)p, 1))) 46FN(12, ditype, (__sync_nand_and_fetch((ditype*)p, 1))) 47 48FN(13, bool, (__sync_bool_compare_and_swap((ditype*)p, 1, 2))) 49FN(14, ditype, (__sync_val_compare_and_swap((ditype*)p, 1, 2))) 50 51FN(15, ditype, (__sync_lock_test_and_set((ditype*)p, 1))) 52FN(16, void, (__sync_lock_release((ditype*)p))) 53 54FN(17, bool, (__atomic_test_and_set((ditype*)p, __ATOMIC_SEQ_CST))) 55FN(18, void, (__atomic_clear((ditype*)p, __ATOMIC_SEQ_CST))) 56 57FN(19, void, (__atomic_exchange((ditype*)p, (ditype*)0, (ditype*)0, __ATOMIC_SEQ_CST))) 58FN(20, ditype, (__atomic_exchange_n((ditype*)p, 1, 2))) 59 60FN(21, void, (__atomic_load((ditype*)p, (ditype*)0, __ATOMIC_SEQ_CST))) 61FN(22, ditype, (__atomic_load_n((ditype*)p, __ATOMIC_SEQ_CST))) 62 63FN(23, bool, (__atomic_compare_exchange((ditype*)p, (ditype*)0, (ditype*)0, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))) 64FN(24, bool, (__atomic_compare_exchange_n((ditype*)p, (ditype*)0, 1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))) 65 66FN(25, void, (__atomic_store((ditype*)p, (ditype*)0, __ATOMIC_SEQ_CST))) 67FN(26, void, (__atomic_store_n((ditype*)p, 1, __ATOMIC_SEQ_CST))) 68 69FN(27, ditype, (__atomic_add_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) 70FN(28, ditype, (__atomic_sub_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) 71FN(29, ditype, (__atomic_and_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) 72FN(30, ditype, (__atomic_nand_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) 73FN(31, ditype, (__atomic_xor_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) 74FN(32, ditype, (__atomic_or_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) 75 76FN(33, ditype, (__atomic_fetch_add((ditype*)p, 1, __ATOMIC_SEQ_CST))) 77FN(34, ditype, (__atomic_fetch_sub((ditype*)p, 1, __ATOMIC_SEQ_CST))) 78FN(35, ditype, (__atomic_fetch_and((ditype*)p, 1, __ATOMIC_SEQ_CST))) 79FN(36, ditype, (__atomic_fetch_nand((ditype*)p, 1, __ATOMIC_SEQ_CST))) 80FN(37, ditype, (__atomic_fetch_xor((ditype*)p, 1, __ATOMIC_SEQ_CST))) 81FN(38, ditype, (__atomic_fetch_or((ditype*)p, 1, __ATOMIC_SEQ_CST))) 82 83static void 84handler(int) 85{ 86 sigset_t clear; 87 88 sigfillset (&clear); 89 sigprocmask (SIG_UNBLOCK, &clear, NULL); 90 throw 0; 91} 92 93int 94main () 95{ 96 signal (SIGSEGV, handler); 97 signal (SIGBUS, handler); 98 99 t1(); 100 t2(); 101 t3(); 102 t4(); 103 t5(); 104 t6(); 105 t7(); 106 t8(); 107 t9(); 108 t10(); 109 t11(); 110 t12(); 111 t13(); 112 t14(); 113 t15(); 114 t16(); 115 t17(); 116 t18(); 117 t19(); 118 t20(); 119 120 exit(0); 121} 122