brintos

brintos / linux-shallow public Read only

0
0
Text · 16.3 KiB · 32284cd Raw
426 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __LINUX_COMPILER_ATTRIBUTES_H3#define __LINUX_COMPILER_ATTRIBUTES_H4 5/*6 * The attributes in this file are unconditionally defined and they directly7 * map to compiler attribute(s), unless one of the compilers does not support8 * the attribute. In that case, __has_attribute is used to check for support9 * and the reason is stated in its comment ("Optional: ...").10 *11 * Any other "attributes" (i.e. those that depend on a configuration option,12 * on a compiler, on an architecture, on plugins, on other attributes...)13 * should be defined elsewhere (e.g. compiler_types.h or compiler-*.h).14 * The intention is to keep this file as simple as possible, as well as15 * compiler- and version-agnostic (e.g. avoiding GCC_VERSION checks).16 *17 * This file is meant to be sorted (by actual attribute name,18 * not by #define identifier). Use the __attribute__((__name__)) syntax19 * (i.e. with underscores) to avoid future collisions with other macros.20 * Provide links to the documentation of each supported compiler, if it exists.21 */22 23/*24 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-alias-function-attribute25 */26#define __alias(symbol)                 __attribute__((__alias__(#symbol)))27 28/*29 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-aligned-function-attribute30 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-aligned-type-attribute31 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-aligned-variable-attribute32 */33#define __aligned(x)                    __attribute__((__aligned__(x)))34#define __aligned_largest               __attribute__((__aligned__))35 36/*37 * Note: do not use this directly. Instead, use __alloc_size() since it is conditionally38 * available and includes other attributes. For GCC < 9.1, __alloc_size__ gets undefined39 * in compiler-gcc.h, due to misbehaviors.40 *41 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-alloc_005fsize-function-attribute42 * clang: https://clang.llvm.org/docs/AttributeReference.html#alloc-size43 */44#define __alloc_size__(x, ...)		__attribute__((__alloc_size__(x, ## __VA_ARGS__)))45 46/*47 * Note: users of __always_inline currently do not write "inline" themselves,48 * which seems to be required by gcc to apply the attribute according49 * to its docs (and also "warning: always_inline function might not be50 * inlinable [-Wattributes]" is emitted).51 *52 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-always_005finline-function-attribute53 * clang: mentioned54 */55#define __always_inline                 inline __attribute__((__always_inline__))56 57/*58 * The second argument is optional (default 0), so we use a variadic macro59 * to make the shorthand.60 *61 * Beware: Do not apply this to functions which may return62 * ERR_PTRs. Also, it is probably unwise to apply it to functions63 * returning extra information in the low bits (but in that case the64 * compiler should see some alignment anyway, when the return value is65 * massaged by 'flags = ptr & 3; ptr &= ~3;').66 *67 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-assume_005faligned-function-attribute68 * clang: https://clang.llvm.org/docs/AttributeReference.html#assume-aligned69 */70#define __assume_aligned(a, ...)        __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))71 72/*73 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-cleanup-variable-attribute74 * clang: https://clang.llvm.org/docs/AttributeReference.html#cleanup75 */76#define __cleanup(func)			__attribute__((__cleanup__(func)))77 78/*79 * Note the long name.80 *81 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-const-function-attribute82 */83#define __attribute_const__             __attribute__((__const__))84 85/*86 * Optional: only supported since gcc >= 987 * Optional: not supported by clang88 *89 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-copy-function-attribute90 */91#if __has_attribute(__copy__)92# define __copy(symbol)                 __attribute__((__copy__(symbol)))93#else94# define __copy(symbol)95#endif96 97/*98 * Optional: only supported since gcc >= 1599 * Optional: only supported since clang >= 18100 *101 *   gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896102 * clang: https://github.com/llvm/llvm-project/pull/76348103 */104#if __has_attribute(__counted_by__)105# define __counted_by(member)		__attribute__((__counted_by__(member)))106#else107# define __counted_by(member)108#endif109 110/*111 * Optional: not supported by gcc112 * Optional: only supported since clang >= 14.0113 *114 * clang: https://clang.llvm.org/docs/AttributeReference.html#diagnose_as_builtin115 */116#if __has_attribute(__diagnose_as_builtin__)117# define __diagnose_as(builtin...)	__attribute__((__diagnose_as_builtin__(builtin)))118#else119# define __diagnose_as(builtin...)120#endif121 122/*123 * Don't. Just don't. See commit 771c035372a0 ("deprecate the '__deprecated'124 * attribute warnings entirely and for good") for more information.125 *126 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-deprecated-function-attribute127 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-deprecated-type-attribute128 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-deprecated-variable-attribute129 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Enumerator-Attributes.html#index-deprecated-enumerator-attribute130 * clang: https://clang.llvm.org/docs/AttributeReference.html#deprecated131 */132#define __deprecated133 134/*135 * Optional: not supported by clang136 *137 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-designated_005finit-type-attribute138 */139#if __has_attribute(__designated_init__)140# define __designated_init              __attribute__((__designated_init__))141#else142# define __designated_init143#endif144 145/*146 * Optional: only supported since clang >= 14.0147 *148 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-error-function-attribute149 */150#if __has_attribute(__error__)151# define __compiletime_error(msg)       __attribute__((__error__(msg)))152#else153# define __compiletime_error(msg)154#endif155 156/*157 * Optional: not supported by clang158 *159 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-externally_005fvisible-function-attribute160 */161#if __has_attribute(__externally_visible__)162# define __visible                      __attribute__((__externally_visible__))163#else164# define __visible165#endif166 167/*168 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-format-function-attribute169 * clang: https://clang.llvm.org/docs/AttributeReference.html#format170 */171#define __printf(a, b)                  __attribute__((__format__(printf, a, b)))172#define __scanf(a, b)                   __attribute__((__format__(scanf, a, b)))173 174/*175 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-gnu_005finline-function-attribute176 * clang: https://clang.llvm.org/docs/AttributeReference.html#gnu-inline177 */178#define __gnu_inline                    __attribute__((__gnu_inline__))179 180/*181 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute182 * clang: https://clang.llvm.org/docs/AttributeReference.html#malloc183 */184#define __malloc                        __attribute__((__malloc__))185 186/*187 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-mode-type-attribute188 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-mode-variable-attribute189 */190#define __mode(x)                       __attribute__((__mode__(x)))191 192/*193 * Optional: only supported since gcc >= 7194 *195 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/x86-Function-Attributes.html#index-no_005fcaller_005fsaved_005fregisters-function-attribute_002c-x86196 * clang: https://clang.llvm.org/docs/AttributeReference.html#no-caller-saved-registers197 */198#if __has_attribute(__no_caller_saved_registers__)199# define __no_caller_saved_registers	__attribute__((__no_caller_saved_registers__))200#else201# define __no_caller_saved_registers202#endif203 204/*205 * Optional: not supported by clang206 *207 *  gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noclone-function-attribute208 */209#if __has_attribute(__noclone__)210# define __noclone                      __attribute__((__noclone__))211#else212# define __noclone213#endif214 215/*216 * Add the pseudo keyword 'fallthrough' so case statement blocks217 * must end with any of these keywords:218 *   break;219 *   fallthrough;220 *   continue;221 *   goto <label>;222 *   return [expression];223 *224 *  gcc: https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html#Statement-Attributes225 */226#if __has_attribute(__fallthrough__)227# define fallthrough                    __attribute__((__fallthrough__))228#else229# define fallthrough                    do {} while (0)  /* fallthrough */230#endif231 232/*233 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes234 * clang: https://clang.llvm.org/docs/AttributeReference.html#flatten235 */236# define __flatten			__attribute__((flatten))237 238/*239 * Note the missing underscores.240 *241 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noinline-function-attribute242 * clang: mentioned243 */244#define   noinline                      __attribute__((__noinline__))245 246/*247 * Optional: only supported since gcc >= 8248 * Optional: not supported by clang249 *250 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-nonstring-variable-attribute251 */252#if __has_attribute(__nonstring__)253# define __nonstring                    __attribute__((__nonstring__))254#else255# define __nonstring256#endif257 258/*259 * Optional: only supported since GCC >= 7.1, clang >= 13.0.260 *261 *      gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005fprofile_005finstrument_005ffunction-function-attribute262 *    clang: https://clang.llvm.org/docs/AttributeReference.html#no-profile-instrument-function263 */264#if __has_attribute(__no_profile_instrument_function__)265# define __no_profile                  __attribute__((__no_profile_instrument_function__))266#else267# define __no_profile268#endif269 270/*271 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noreturn-function-attribute272 * clang: https://clang.llvm.org/docs/AttributeReference.html#noreturn273 * clang: https://clang.llvm.org/docs/AttributeReference.html#id1274 */275#define __noreturn                      __attribute__((__noreturn__))276 277/*278 * Optional: only supported since GCC >= 11.1, clang >= 7.0.279 *280 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005fstack_005fprotector-function-attribute281 *   clang: https://clang.llvm.org/docs/AttributeReference.html#no-stack-protector-safebuffers282 */283#if __has_attribute(__no_stack_protector__)284# define __no_stack_protector		__attribute__((__no_stack_protector__))285#else286# define __no_stack_protector287#endif288 289/*290 * Optional: not supported by gcc.291 *292 * clang: https://clang.llvm.org/docs/AttributeReference.html#overloadable293 */294#if __has_attribute(__overloadable__)295# define __overloadable			__attribute__((__overloadable__))296#else297# define __overloadable298#endif299 300/*301 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-packed-type-attribute302 * clang: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-packed-variable-attribute303 */304#define __packed                        __attribute__((__packed__))305 306/*307 * Note: the "type" argument should match any __builtin_object_size(p, type) usage.308 *309 * Optional: not supported by gcc.310 *311 * clang: https://clang.llvm.org/docs/AttributeReference.html#pass-object-size-pass-dynamic-object-size312 */313#if __has_attribute(__pass_dynamic_object_size__)314# define __pass_dynamic_object_size(type)	__attribute__((__pass_dynamic_object_size__(type)))315#else316# define __pass_dynamic_object_size(type)317#endif318#if __has_attribute(__pass_object_size__)319# define __pass_object_size(type)	__attribute__((__pass_object_size__(type)))320#else321# define __pass_object_size(type)322#endif323 324/*325 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute326 */327#define __pure                          __attribute__((__pure__))328 329/*330 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-section-function-attribute331 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-section-variable-attribute332 * clang: https://clang.llvm.org/docs/AttributeReference.html#section-declspec-allocate333 */334#define __section(section)              __attribute__((__section__(section)))335 336/*337 * Optional: only supported since gcc >= 12338 *339 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-uninitialized-variable-attribute340 * clang: https://clang.llvm.org/docs/AttributeReference.html#uninitialized341 */342#if __has_attribute(__uninitialized__)343# define __uninitialized		__attribute__((__uninitialized__))344#else345# define __uninitialized346#endif347 348/*349 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-unused-function-attribute350 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-unused-type-attribute351 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-unused-variable-attribute352 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-unused-label-attribute353 * clang: https://clang.llvm.org/docs/AttributeReference.html#maybe-unused-unused354 */355#define __always_unused                 __attribute__((__unused__))356#define __maybe_unused                  __attribute__((__unused__))357 358/*359 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-used-function-attribute360 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-used-variable-attribute361 */362#define __used                          __attribute__((__used__))363 364/*365 * The __used attribute guarantees that the attributed variable will be366 * always emitted by a compiler. It doesn't prevent the compiler from367 * throwing 'unused' warnings when it can't detect how the variable is368 * actually used. It's a compiler implementation details either emit369 * the warning in that case or not.370 *371 * The combination of both 'used' and 'unused' attributes ensures that372 * the variable would be emitted, and will not trigger 'unused' warnings.373 * The attribute is applicable for functions, static and global variables.374 */375#define __always_used			__used __maybe_unused376 377/*378 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-warn_005funused_005fresult-function-attribute379 * clang: https://clang.llvm.org/docs/AttributeReference.html#nodiscard-warn-unused-result380 */381#define __must_check                    __attribute__((__warn_unused_result__))382 383/*384 * Optional: only supported since clang >= 14.0385 *386 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-warning-function-attribute387 */388#if __has_attribute(__warning__)389# define __compiletime_warning(msg)     __attribute__((__warning__(msg)))390#else391# define __compiletime_warning(msg)392#endif393 394/*395 * Optional: only supported since clang >= 14.0396 *397 * clang: https://clang.llvm.org/docs/AttributeReference.html#disable-sanitizer-instrumentation398 *399 * disable_sanitizer_instrumentation is not always similar to400 * no_sanitize((<sanitizer-name>)): the latter may still let specific sanitizers401 * insert code into functions to prevent false positives. Unlike that,402 * disable_sanitizer_instrumentation prevents all kinds of instrumentation to403 * functions with the attribute.404 */405#if __has_attribute(disable_sanitizer_instrumentation)406# define __disable_sanitizer_instrumentation \407	 __attribute__((disable_sanitizer_instrumentation))408#else409# define __disable_sanitizer_instrumentation410#endif411 412/*413 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-weak-function-attribute414 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-weak-variable-attribute415 */416#define __weak                          __attribute__((__weak__))417 418/*419 * Used by functions that use '__builtin_return_address'. These function420 * don't want to be splited or made inline, which can make421 * the '__builtin_return_address' get unexpected address.422 */423#define __fix_address noinline __noclone424 425#endif /* __LINUX_COMPILER_ATTRIBUTES_H */426