This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
add probe for __builtin_{add,sub,mul}_overflow
[metaconfig.git] / U / perl / d_builtin_overflow.U
1 ?RCS: Copyright (c) 2017, Lukas Mai
2 ?RCS:
3 ?RCS: You may distribute this file under the terms of either
4 ?RCS:     a) the "Artistic License" which comes with Perl, or
5 ?RCS:     b) the "Artistic License" which comes with dist, or
6 ?RCS:     c) the GNU General Public License as published by the Free
7 ?RCS:     Software Foundation; either version 1, or (at your option) any
8 ?RCS:     later version (see the file "Copying" that comes with the
9 ?RCS:     Perl distribution).
10 ?RCS: Which one to use is your choice.
11 ?RCS: See the U/README file.
12 ?MAKE:d_builtin_add_overflow d_builtin_sub_overflow d_builtin_mul_overflow : Compile Setvar cat run rm_try
13 ?MAKE:  -pick add $@ %<
14 ?S:d_builtin_add_overflow:
15 ?S:     This variable conditionally defines HAS_BUILTIN_ADD_OVERFLOW, which
16 ?S:     indicates that the compiler supports __builtin_add_overflow(x,y,&z)
17 ?S:     for safely adding x and y into z while checking for overflow.
18 ?S:.
19 ?S:d_builtin_sub_overflow:
20 ?S:     This variable conditionally defines HAS_BUILTIN_SUB_OVERFLOW, which
21 ?S:     indicates that the compiler supports __builtin_sub_overflow(x,y,&z)
22 ?S:     for safely subtracting y from x into z while checking for overflow.
23 ?S:.
24 ?S:d_builtin_mul_overflow:
25 ?S:     This variable conditionally defines HAS_BUILTIN_MUL_OVERFLOW, which
26 ?S:     indicates that the compiler supports __builtin_mul_overflow(x,y,&z)
27 ?S:     for safely multiplying x and y into z while checking for overflow.
28 ?S:.
29 ?C:HAS_BUILTIN_ADD_OVERFLOW:
30 ?C:     This symbol, if defined, indicates that the compiler supports
31 ?C:     __builtin_add_overflow for adding integers with overflow checks.
32 ?C:.
33 ?C:HAS_BUILTIN_SUB_OVERFLOW:
34 ?C:     This symbol, if defined, indicates that the compiler supports
35 ?C:     __builtin_sub_overflow for subtracting integers with overflow checks.
36 ?C:.
37 ?C:HAS_BUILTIN_MUL_OVERFLOW:
38 ?C:     This symbol, if defined, indicates that the compiler supports
39 ?C:     __builtin_mul_overflow for multiplying integers with overflow checks.
40 ?C:.
41 ?H:#$d_builtin_add_overflow HAS_BUILTIN_ADD_OVERFLOW    /**/
42 ?H:#$d_builtin_sub_overflow HAS_BUILTIN_SUB_OVERFLOW    /**/
43 ?H:#$d_builtin_mul_overflow HAS_BUILTIN_MUL_OVERFLOW    /**/
44 ?H:.
45 ?F:!try
46 ?LINT:set d_builtin_add_overflow d_builtin_sub_overflow d_builtin_mul_overflow
47 : Look for GCC-style __builtin_add_overflow
48 case "$d_builtin_add_overflow" in
49 '')
50     echo " "
51     echo "Checking whether your compiler can handle __builtin_add_overflow ..." >&4
52     $cat >try.c <<'EOCP'
53 int main(void) {
54     const unsigned int uint_max = ~0u;
55     int target_int = 0;
56     if (__builtin_add_overflow(1, 2, &target_int) || target_int != 3) {
57         return 1;
58     }
59     if (!__builtin_add_overflow((int)(uint_max >> 1), 1, &target_int)) {
60         return 1;
61     }
62     if (!__builtin_add_overflow(uint_max, -1, &target_int)) {
63         return 1;
64     }
65     return 0;
66 }
67 EOCP
68     set try
69     if eval $compile && $run ./try; then
70         echo "Your C compiler supports __builtin_add_overflow."
71         val="$define"
72     else
73         echo "Your C compiler doesn't seem to understand __builtin_add_overflow."
74         val="$undef"
75     fi
76     ;;
77 *) val="$d_builtin_add_overflow" ;;
78 esac
79
80 set d_builtin_add_overflow
81 eval $setvar
82 $rm_try
83
84 : Look for GCC-style __builtin_sub_overflow
85 case "$d_builtin_sub_overflow" in
86 '')
87     echo " "
88     echo "Checking whether your compiler can handle __builtin_sub_overflow ..." >&4
89     $cat >try.c <<'EOCP'
90 int main(void) {
91     const unsigned int uint_max = ~0u;
92     int target_int = 0;
93     if (__builtin_sub_overflow(1, -2, &target_int) || target_int != 3) {
94         return 1;
95     }
96     if (!__builtin_sub_overflow(-(int)(uint_max >> 1), 2, &target_int)) {
97         return 1;
98     }
99     if (!__builtin_sub_overflow(uint_max, 1, &target_int)) {
100         return 1;
101     }
102     return 0;
103 }
104 EOCP
105     set try
106     if eval $compile && $run ./try; then
107         echo "Your C compiler supports __builtin_sub_overflow."
108         val="$define"
109     else
110         echo "Your C compiler doesn't seem to understand __builtin_sub_overflow."
111         val="$undef"
112     fi
113     ;;
114 *) val="$d_builtin_sub_overflow" ;;
115 esac
116
117 set d_builtin_sub_overflow
118 eval $setvar
119 $rm_try
120
121 : Look for GCC-style __builtin_mul_overflow
122 case "$d_builtin_mul_overflow" in
123 '')
124     echo " "
125     echo "Checking whether your compiler can handle __builtin_mul_overflow ..." >&4
126     $cat >try.c <<'EOCP'
127 int main(void) {
128     const unsigned int uint_max = ~0u;
129     int target_int = 0;
130     if (__builtin_mul_overflow(2, 3, &target_int) || target_int != 6) {
131         return 1;
132     }
133     if (!__builtin_mul_overflow((int)(uint_max >> 1), 2, &target_int)) {
134         return 1;
135     }
136     if (!__builtin_mul_overflow(uint_max, 1, &target_int)) {
137         return 1;
138     }
139     return 0;
140 }
141 EOCP
142     set try
143     if eval $compile && $run ./try; then
144         echo "Your C compiler supports __builtin_mul_overflow."
145         val="$define"
146     else
147         echo "Your C compiler doesn't seem to understand __builtin_mul_overflow."
148         val="$undef"
149     fi
150     ;;
151 *) val="$d_builtin_mul_overflow" ;;
152 esac
153
154 set d_builtin_mul_overflow
155 eval $setvar
156 $rm_try
157