diff options
Diffstat (limited to 'gl/cdefs.h')
-rw-r--r-- | gl/cdefs.h | 46 |
1 files changed, 27 insertions, 19 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright (C) 1992-2023 Free Software Foundation, Inc. | 1 | /* Copyright (C) 1992-2024 Free Software Foundation, Inc. |
2 | Copyright The GNU Toolchain Authors. | 2 | Copyright The GNU Toolchain Authors. |
3 | This file is part of the GNU C Library. | 3 | This file is part of the GNU C Library. |
4 | 4 | ||
@@ -42,8 +42,8 @@ | |||
42 | #if (defined __has_attribute \ | 42 | #if (defined __has_attribute \ |
43 | && (!defined __clang_minor__ \ | 43 | && (!defined __clang_minor__ \ |
44 | || (defined __apple_build_version__ \ | 44 | || (defined __apple_build_version__ \ |
45 | ? 6000000 <= __apple_build_version__ \ | 45 | ? 7000000 <= __apple_build_version__ \ |
46 | : 3 < __clang_major__ + (5 <= __clang_minor__)))) | 46 | : 5 <= __clang_major__))) |
47 | # define __glibc_has_attribute(attr) __has_attribute (attr) | 47 | # define __glibc_has_attribute(attr) __has_attribute (attr) |
48 | #else | 48 | #else |
49 | # define __glibc_has_attribute(attr) 0 | 49 | # define __glibc_has_attribute(attr) 0 |
@@ -140,32 +140,37 @@ | |||
140 | #endif | 140 | #endif |
141 | 141 | ||
142 | 142 | ||
143 | /* Gnulib avoids these definitions, as they don't work on non-glibc platforms. | ||
144 | In particular, __bos and __bos0 are defined differently in the Android libc. | ||
145 | */ | ||
146 | #ifndef __GNULIB_CDEFS | ||
147 | |||
143 | /* Fortify support. */ | 148 | /* Fortify support. */ |
144 | #define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1) | 149 | # define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1) |
145 | #define __bos0(ptr) __builtin_object_size (ptr, 0) | 150 | # define __bos0(ptr) __builtin_object_size (ptr, 0) |
146 | 151 | ||
147 | /* Use __builtin_dynamic_object_size at _FORTIFY_SOURCE=3 when available. */ | 152 | /* Use __builtin_dynamic_object_size at _FORTIFY_SOURCE=3 when available. */ |
148 | #if __USE_FORTIFY_LEVEL == 3 && (__glibc_clang_prereq (9, 0) \ | 153 | # if __USE_FORTIFY_LEVEL == 3 && (__glibc_clang_prereq (9, 0) \ |
149 | || __GNUC_PREREQ (12, 0)) | 154 | || __GNUC_PREREQ (12, 0)) |
150 | # define __glibc_objsize0(__o) __builtin_dynamic_object_size (__o, 0) | 155 | # define __glibc_objsize0(__o) __builtin_dynamic_object_size (__o, 0) |
151 | # define __glibc_objsize(__o) __builtin_dynamic_object_size (__o, 1) | 156 | # define __glibc_objsize(__o) __builtin_dynamic_object_size (__o, 1) |
152 | #else | 157 | # else |
153 | # define __glibc_objsize0(__o) __bos0 (__o) | 158 | # define __glibc_objsize0(__o) __bos0 (__o) |
154 | # define __glibc_objsize(__o) __bos (__o) | 159 | # define __glibc_objsize(__o) __bos (__o) |
155 | #endif | 160 | # endif |
156 | 161 | ||
157 | /* Compile time conditions to choose between the regular, _chk and _chk_warn | 162 | /* Compile time conditions to choose between the regular, _chk and _chk_warn |
158 | variants. These conditions should get evaluated to constant and optimized | 163 | variants. These conditions should get evaluated to constant and optimized |
159 | away. */ | 164 | away. */ |
160 | 165 | ||
161 | #define __glibc_safe_len_cond(__l, __s, __osz) ((__l) <= (__osz) / (__s)) | 166 | # define __glibc_safe_len_cond(__l, __s, __osz) ((__l) <= (__osz) / (__s)) |
162 | #define __glibc_unsigned_or_positive(__l) \ | 167 | # define __glibc_unsigned_or_positive(__l) \ |
163 | ((__typeof (__l)) 0 < (__typeof (__l)) -1 \ | 168 | ((__typeof (__l)) 0 < (__typeof (__l)) -1 \ |
164 | || (__builtin_constant_p (__l) && (__l) > 0)) | 169 | || (__builtin_constant_p (__l) && (__l) > 0)) |
165 | 170 | ||
166 | /* Length is known to be safe at compile time if the __L * __S <= __OBJSZ | 171 | /* Length is known to be safe at compile time if the __L * __S <= __OBJSZ |
167 | condition can be folded to a constant and if it is true, or unknown (-1) */ | 172 | condition can be folded to a constant and if it is true, or unknown (-1) */ |
168 | #define __glibc_safe_or_unknown_len(__l, __s, __osz) \ | 173 | # define __glibc_safe_or_unknown_len(__l, __s, __osz) \ |
169 | ((__osz) == (__SIZE_TYPE__) -1 \ | 174 | ((__osz) == (__SIZE_TYPE__) -1 \ |
170 | || (__glibc_unsigned_or_positive (__l) \ | 175 | || (__glibc_unsigned_or_positive (__l) \ |
171 | && __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \ | 176 | && __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \ |
@@ -175,7 +180,7 @@ | |||
175 | /* Conversely, we know at compile time that the length is unsafe if the | 180 | /* Conversely, we know at compile time that the length is unsafe if the |
176 | __L * __S <= __OBJSZ condition can be folded to a constant and if it is | 181 | __L * __S <= __OBJSZ condition can be folded to a constant and if it is |
177 | false. */ | 182 | false. */ |
178 | #define __glibc_unsafe_len(__l, __s, __osz) \ | 183 | # define __glibc_unsafe_len(__l, __s, __osz) \ |
179 | (__glibc_unsigned_or_positive (__l) \ | 184 | (__glibc_unsigned_or_positive (__l) \ |
180 | && __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \ | 185 | && __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \ |
181 | __s, __osz)) \ | 186 | __s, __osz)) \ |
@@ -184,7 +189,7 @@ | |||
184 | /* Fortify function f. __f_alias, __f_chk and __f_chk_warn must be | 189 | /* Fortify function f. __f_alias, __f_chk and __f_chk_warn must be |
185 | declared. */ | 190 | declared. */ |
186 | 191 | ||
187 | #define __glibc_fortify(f, __l, __s, __osz, ...) \ | 192 | # define __glibc_fortify(f, __l, __s, __osz, ...) \ |
188 | (__glibc_safe_or_unknown_len (__l, __s, __osz) \ | 193 | (__glibc_safe_or_unknown_len (__l, __s, __osz) \ |
189 | ? __ ## f ## _alias (__VA_ARGS__) \ | 194 | ? __ ## f ## _alias (__VA_ARGS__) \ |
190 | : (__glibc_unsafe_len (__l, __s, __osz) \ | 195 | : (__glibc_unsafe_len (__l, __s, __osz) \ |
@@ -194,13 +199,16 @@ | |||
194 | /* Fortify function f, where object size argument passed to f is the number of | 199 | /* Fortify function f, where object size argument passed to f is the number of |
195 | elements and not total size. */ | 200 | elements and not total size. */ |
196 | 201 | ||
197 | #define __glibc_fortify_n(f, __l, __s, __osz, ...) \ | 202 | # define __glibc_fortify_n(f, __l, __s, __osz, ...) \ |
198 | (__glibc_safe_or_unknown_len (__l, __s, __osz) \ | 203 | (__glibc_safe_or_unknown_len (__l, __s, __osz) \ |
199 | ? __ ## f ## _alias (__VA_ARGS__) \ | 204 | ? __ ## f ## _alias (__VA_ARGS__) \ |
200 | : (__glibc_unsafe_len (__l, __s, __osz) \ | 205 | : (__glibc_unsafe_len (__l, __s, __osz) \ |
201 | ? __ ## f ## _chk_warn (__VA_ARGS__, (__osz) / (__s)) \ | 206 | ? __ ## f ## _chk_warn (__VA_ARGS__, (__osz) / (__s)) \ |
202 | : __ ## f ## _chk (__VA_ARGS__, (__osz) / (__s)))) \ | 207 | : __ ## f ## _chk (__VA_ARGS__, (__osz) / (__s)))) \ |
203 | 208 | ||
209 | #endif | ||
210 | |||
211 | |||
204 | #if __GNUC_PREREQ (4,3) | 212 | #if __GNUC_PREREQ (4,3) |
205 | # define __warnattr(msg) __attribute__((__warning__ (msg))) | 213 | # define __warnattr(msg) __attribute__((__warning__ (msg))) |
206 | # define __errordecl(name, msg) \ | 214 | # define __errordecl(name, msg) \ |