1 #define SCHAR_MAX __SCHAR_MAX__
2 #define SCHAR_MIN (-__SCHAR_MAX__ - 1)
3 #define SHRT_MAX __SHRT_MAX__
4 #define SHRT_MIN (-__SHRT_MAX__ - 1)
5 #define INT_MAX __INT_MAX__
6 #define INT_MIN (-__INT_MAX__ - 1)
7 #define LONG_MAX __LONG_MAX__
8 #define LONG_MIN (-__LONG_MAX__ - 1)
9 #define LLONG_MAX __LONG_LONG_MAX__
10 #define LLONG_MIN (-__LONG_LONG_MAX__ - 1)
11 
12 int v;
13 
14 __attribute__((noinline, noclone)) void
bar(void)15 bar (void)
16 {
17   v++;
18 }
19 
20 #define T(n, t1, t2, tr, v1, v2, vr, b, o) \
21 __attribute__((noinline, noclone)) tr		\
22 t##n##_1##b (t1 x, t2 y)			\
23 {						\
24   tr r;						\
25   if (__builtin_##b##_overflow (x, y, &r))	\
26     bar ();					\
27   return r;					\
28 }						\
29 						\
30 __attribute__((noinline, noclone)) tr		\
31 t##n##_2##b (t2 y)				\
32 {						\
33   t1 x = (v1);					\
34   tr r;						\
35   if (__builtin_##b##_overflow (x, y, &r))	\
36     bar ();					\
37   return r;					\
38 }						\
39 						\
40 __attribute__((noinline, noclone)) tr		\
41 t##n##_3##b (t2 y)				\
42 {						\
43   tr r;						\
44   if (__builtin_##b##_overflow ((t1) (v1), y,	\
45 				&r))		\
46     bar ();					\
47   return r;					\
48 }						\
49 						\
50 __attribute__((noinline, noclone)) tr		\
51 t##n##_4##b (t1 x)				\
52 {						\
53   t2 y = (v2);					\
54   tr r;						\
55   if (__builtin_##b##_overflow (x, y, &r))	\
56     bar ();					\
57   return r;					\
58 }						\
59 						\
60 __attribute__((noinline, noclone)) tr		\
61 t##n##_5##b (t1 x)				\
62 {						\
63   tr r;						\
64   if (__builtin_##b##_overflow (x, (t2) (v2),	\
65 				&r))		\
66     bar ();					\
67   return r;					\
68 }						\
69 						\
70 __attribute__((noinline, noclone)) void		\
71 t##n##b (void)					\
72 {						\
73   t1 x = (v1);					\
74   t2 y = (v2);					\
75   tr r1, r2;					\
76   v = 0;					\
77   if (t##n##_1##b (x, y) != (tr) (vr)		\
78       || t##n##_2##b (y) != (tr) (vr)		\
79       || t##n##_3##b (y) != (tr) (vr)		\
80       || t##n##_4##b (x) != (tr) (vr)		\
81       || t##n##_5##b (x) != (tr) (vr))		\
82     __builtin_abort ();				\
83   if (__builtin_##b##_overflow (x, y, &r1))	\
84     bar ();					\
85   if (r1 != (tr) (vr))				\
86     __builtin_abort ();				\
87   if (__builtin_##b##_overflow ((t1) (v1),	\
88 				(t2) (v2), &r2))\
89     bar ();					\
90   if (r2 != (tr) (vr) || v != 7 * o)		\
91     __builtin_abort ();				\
92 }
93 #define TP(n, t1, t2, er, v1, v2, b, o) \
94 __attribute__((noinline, noclone)) void		\
95 t##n##_1##b (t1 x, t2 y)			\
96 {						\
97   if (__builtin_##b##_overflow_p (x, y, er))	\
98     bar ();					\
99 }						\
100 						\
101 __attribute__((noinline, noclone)) void		\
102 t##n##_2##b (t2 y)				\
103 {						\
104   t1 x = (v1);					\
105   if (__builtin_##b##_overflow_p (x, y, er))	\
106     bar ();					\
107 }						\
108 						\
109 __attribute__((noinline, noclone)) void		\
110 t##n##_3##b (t2 y)				\
111 {						\
112   if (__builtin_##b##_overflow_p ((t1) (v1), y,	\
113 				  er))		\
114     bar ();					\
115 }						\
116 						\
117 __attribute__((noinline, noclone)) void		\
118 t##n##_4##b (t1 x)				\
119 {						\
120   t2 y = (v2);					\
121   if (__builtin_##b##_overflow_p (x, y, er))	\
122     bar ();					\
123 }						\
124 						\
125 __attribute__((noinline, noclone)) void		\
126 t##n##_5##b (t1 x)				\
127 {						\
128   if (__builtin_##b##_overflow_p (x, (t2) (v2),	\
129 				  er))		\
130     bar ();					\
131 }						\
132 						\
133 __attribute__((noinline, noclone)) void		\
134 t##n##b (void)					\
135 {						\
136   t1 x = (v1);					\
137   t2 y = (v2);					\
138   v = 0;					\
139   t##n##_1##b (x, y);				\
140   t##n##_2##b (y);				\
141   t##n##_3##b (y);				\
142   t##n##_4##b (x);				\
143   t##n##_5##b (x);				\
144   if (__builtin_##b##_overflow_p (x, y, er))	\
145     bar ();					\
146   if (__builtin_##b##_overflow_p ((t1) (v1),	\
147 				  (t2) (v2),	\
148 				  er))		\
149     bar ();					\
150   if (v != 7 * o)				\
151     __builtin_abort ();				\
152 }
153 #ifdef OVFP
154 #undef T
155 #define T(n, t1, t2, tr, v1, v2, vr, b, o) \
156 TP(n, t1, t2, (tr) 0, v1, v2, b, o)
157 #endif
158 #define ST(n, t, v1, v2, vr, b, o) \
159 T (n, t, t, t, v1, v2, vr, b, o)
160