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