Compiler Attributes: use feature checks instead of version checks
Instead of using version checks per-compiler to define (or not)
each attribute, use __has_attribute to test for them, following
the cleanup started with commit 815f0ddb346c
("include/linux/compiler*.h: make compiler-*.h mutually exclusive"),
which is supported on gcc >= 5, clang >= 2.9 and icc >= 17.
In the meantime, to support 4.6 <= gcc < 5, we implement
__has_attribute by hand.
All the attributes that can be unconditionally defined and directly
map to compiler attribute(s) (even if optional) have been moved
to a new file include/linux/compiler_attributes.h
In an effort to make the file as regular as possible, comments
stating the purpose of attributes have been removed. Instead,
links to the compiler docs have been added (i.e. to gcc and,
if available, to clang as well). In addition, they have been sorted.
Finally, if an attribute is optional (i.e. if it is guarded
by __has_attribute), the reason has been stated for future reference.
Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # on top of v4.19-rc5, clang 7
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
2018-08-31 01:36:59 +07:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef __LINUX_COMPILER_ATTRIBUTES_H
|
|
|
|
#define __LINUX_COMPILER_ATTRIBUTES_H
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The attributes in this file are unconditionally defined and they directly
|
|
|
|
* map to compiler attribute(s) -- except those that are optional.
|
|
|
|
*
|
|
|
|
* Any other "attributes" (i.e. those that depend on a configuration option,
|
|
|
|
* on a compiler, on an architecture, on plugins, on other attributes...)
|
|
|
|
* should be defined elsewhere (e.g. compiler_types.h or compiler-*.h).
|
|
|
|
*
|
|
|
|
* This file is meant to be sorted (by actual attribute name,
|
|
|
|
* not by #define identifier). Use the __attribute__((__name__)) syntax
|
|
|
|
* (i.e. with underscores) to avoid future collisions with other macros.
|
|
|
|
* If an attribute is optional, state the reason in the comment.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* To check for optional attributes, we use __has_attribute, which is supported
|
|
|
|
* on gcc >= 5, clang >= 2.9 and icc >= 17. In the meantime, to support
|
|
|
|
* 4.6 <= gcc < 5, we implement __has_attribute by hand.
|
|
|
|
*
|
|
|
|
* sparse does not support __has_attribute (yet) and defines __GNUC_MINOR__
|
|
|
|
* depending on the compiler used to build it; however, these attributes have
|
|
|
|
* no semantic effects for sparse, so it does not matter. Also note that,
|
|
|
|
* in order to avoid sparse's warnings, even the unsupported ones must be
|
|
|
|
* defined to 0.
|
|
|
|
*/
|
|
|
|
#ifndef __has_attribute
|
|
|
|
# define __has_attribute(x) __GCC4_has_attribute_##x
|
|
|
|
# define __GCC4_has_attribute___assume_aligned__ (__GNUC_MINOR__ >= 9)
|
|
|
|
# define __GCC4_has_attribute___designated_init__ 0
|
|
|
|
# define __GCC4_has_attribute___externally_visible__ 1
|
|
|
|
# define __GCC4_has_attribute___noclone__ 1
|
|
|
|
# define __GCC4_has_attribute___optimize__ 1
|
Compiler Attributes: add support for __nonstring (gcc >= 8)
From the GCC manual:
nonstring
The nonstring variable attribute specifies that an object or member
declaration with type array of char, signed char, or unsigned char,
or pointer to such a type is intended to store character arrays that
do not necessarily contain a terminating NUL. This is useful in detecting
uses of such arrays or pointers with functions that expect NUL-terminated
strings, and to avoid warnings when such an array or pointer is used as
an argument to a bounded string manipulation function such as strncpy.
https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
This attribute can be used for documentation purposes (i.e. replacing
comments), but it is most helpful when the following warnings are enabled:
-Wstringop-overflow
Warn for calls to string manipulation functions such as memcpy and
strcpy that are determined to overflow the destination buffer.
[...]
-Wstringop-truncation
Warn for calls to bounded string manipulation functions such as
strncat, strncpy, and stpncpy that may either truncate the copied
string or leave the destination unchanged.
[...]
In situations where a character array is intended to store a sequence
of bytes with no terminating NUL such an array may be annotated with
attribute nonstring to avoid this warning. Such arrays, however,
are not suitable arguments to functions that expect NUL-terminated
strings. To help detect accidental misuses of such arrays GCC issues
warnings unless it can prove that the use is safe.
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # on top of v4.19-rc5, clang 7
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
2018-09-19 06:06:24 +07:00
|
|
|
# define __GCC4_has_attribute___nonstring__ 0
|
Compiler Attributes: use feature checks instead of version checks
Instead of using version checks per-compiler to define (or not)
each attribute, use __has_attribute to test for them, following
the cleanup started with commit 815f0ddb346c
("include/linux/compiler*.h: make compiler-*.h mutually exclusive"),
which is supported on gcc >= 5, clang >= 2.9 and icc >= 17.
In the meantime, to support 4.6 <= gcc < 5, we implement
__has_attribute by hand.
All the attributes that can be unconditionally defined and directly
map to compiler attribute(s) (even if optional) have been moved
to a new file include/linux/compiler_attributes.h
In an effort to make the file as regular as possible, comments
stating the purpose of attributes have been removed. Instead,
links to the compiler docs have been added (i.e. to gcc and,
if available, to clang as well). In addition, they have been sorted.
Finally, if an attribute is optional (i.e. if it is guarded
by __has_attribute), the reason has been stated for future reference.
Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # on top of v4.19-rc5, clang 7
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
2018-08-31 01:36:59 +07:00
|
|
|
# define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-alias-function-attribute
|
|
|
|
*/
|
|
|
|
#define __alias(symbol) __attribute__((__alias__(#symbol)))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-aligned-function-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-aligned-type-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-aligned-variable-attribute
|
|
|
|
*/
|
|
|
|
#define __aligned(x) __attribute__((__aligned__(x)))
|
|
|
|
#define __aligned_largest __attribute__((__aligned__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Note: users of __always_inline currently do not write "inline" themselves,
|
|
|
|
* which seems to be required by gcc to apply the attribute according
|
|
|
|
* to its docs (and also "warning: always_inline function might not be
|
|
|
|
* inlinable [-Wattributes]" is emitted).
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-always_005finline-function-attribute
|
|
|
|
* clang: mentioned
|
|
|
|
*/
|
|
|
|
#define __always_inline inline __attribute__((__always_inline__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The second argument is optional (default 0), so we use a variadic macro
|
|
|
|
* to make the shorthand.
|
|
|
|
*
|
|
|
|
* Beware: Do not apply this to functions which may return
|
|
|
|
* ERR_PTRs. Also, it is probably unwise to apply it to functions
|
|
|
|
* returning extra information in the low bits (but in that case the
|
|
|
|
* compiler should see some alignment anyway, when the return value is
|
|
|
|
* massaged by 'flags = ptr & 3; ptr &= ~3;').
|
|
|
|
*
|
|
|
|
* Optional: only supported since gcc >= 4.9
|
|
|
|
* Optional: not supported by icc
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-assume_005faligned-function-attribute
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#assume-aligned
|
|
|
|
*/
|
|
|
|
#if __has_attribute(__assume_aligned__)
|
|
|
|
# define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
|
|
|
#else
|
|
|
|
# define __assume_aligned(a, ...)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-cold-function-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-cold-label-attribute
|
|
|
|
*/
|
|
|
|
#define __cold __attribute__((__cold__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Note the long name.
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-const-function-attribute
|
|
|
|
*/
|
|
|
|
#define __attribute_const__ __attribute__((__const__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Don't. Just don't. See commit 771c035372a0 ("deprecate the '__deprecated'
|
|
|
|
* attribute warnings entirely and for good") for more information.
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-deprecated-function-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-deprecated-type-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-deprecated-variable-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Enumerator-Attributes.html#index-deprecated-enumerator-attribute
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#deprecated
|
|
|
|
*/
|
|
|
|
#define __deprecated
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Optional: only supported since gcc >= 5.1
|
|
|
|
* Optional: not supported by clang
|
|
|
|
* Optional: not supported by icc
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-designated_005finit-type-attribute
|
|
|
|
*/
|
|
|
|
#if __has_attribute(__designated_init__)
|
|
|
|
# define __designated_init __attribute__((__designated_init__))
|
|
|
|
#else
|
|
|
|
# define __designated_init
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Optional: not supported by clang
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-externally_005fvisible-function-attribute
|
|
|
|
*/
|
|
|
|
#if __has_attribute(__externally_visible__)
|
|
|
|
# define __visible __attribute__((__externally_visible__))
|
|
|
|
#else
|
|
|
|
# define __visible
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-format-function-attribute
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#format
|
|
|
|
*/
|
|
|
|
#define __printf(a, b) __attribute__((__format__(printf, a, b)))
|
|
|
|
#define __scanf(a, b) __attribute__((__format__(scanf, a, b)))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-gnu_005finline-function-attribute
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#gnu-inline
|
|
|
|
*/
|
|
|
|
#define __gnu_inline __attribute__((__gnu_inline__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute
|
|
|
|
*/
|
|
|
|
#define __malloc __attribute__((__malloc__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-mode-type-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-mode-variable-attribute
|
|
|
|
*/
|
|
|
|
#define __mode(x) __attribute__((__mode__(x)))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Optional: not supported by clang
|
|
|
|
* Note: icc does not recognize gcc's no-tracer
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noclone-function-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-optimize-function-attribute
|
|
|
|
*/
|
|
|
|
#if __has_attribute(__noclone__)
|
|
|
|
# if __has_attribute(__optimize__)
|
|
|
|
# define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
|
|
|
|
# else
|
|
|
|
# define __noclone __attribute__((__noclone__))
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# define __noclone
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Note the missing underscores.
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noinline-function-attribute
|
|
|
|
* clang: mentioned
|
|
|
|
*/
|
|
|
|
#define noinline __attribute__((__noinline__))
|
|
|
|
|
Compiler Attributes: add support for __nonstring (gcc >= 8)
From the GCC manual:
nonstring
The nonstring variable attribute specifies that an object or member
declaration with type array of char, signed char, or unsigned char,
or pointer to such a type is intended to store character arrays that
do not necessarily contain a terminating NUL. This is useful in detecting
uses of such arrays or pointers with functions that expect NUL-terminated
strings, and to avoid warnings when such an array or pointer is used as
an argument to a bounded string manipulation function such as strncpy.
https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
This attribute can be used for documentation purposes (i.e. replacing
comments), but it is most helpful when the following warnings are enabled:
-Wstringop-overflow
Warn for calls to string manipulation functions such as memcpy and
strcpy that are determined to overflow the destination buffer.
[...]
-Wstringop-truncation
Warn for calls to bounded string manipulation functions such as
strncat, strncpy, and stpncpy that may either truncate the copied
string or leave the destination unchanged.
[...]
In situations where a character array is intended to store a sequence
of bytes with no terminating NUL such an array may be annotated with
attribute nonstring to avoid this warning. Such arrays, however,
are not suitable arguments to functions that expect NUL-terminated
strings. To help detect accidental misuses of such arrays GCC issues
warnings unless it can prove that the use is safe.
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # on top of v4.19-rc5, clang 7
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
2018-09-19 06:06:24 +07:00
|
|
|
/*
|
|
|
|
* Optional: only supported since gcc >= 8
|
|
|
|
* Optional: not supported by clang
|
|
|
|
* Optional: not supported by icc
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-nonstring-variable-attribute
|
|
|
|
*/
|
|
|
|
#if __has_attribute(__nonstring__)
|
|
|
|
# define __nonstring __attribute__((__nonstring__))
|
|
|
|
#else
|
|
|
|
# define __nonstring
|
|
|
|
#endif
|
|
|
|
|
Compiler Attributes: use feature checks instead of version checks
Instead of using version checks per-compiler to define (or not)
each attribute, use __has_attribute to test for them, following
the cleanup started with commit 815f0ddb346c
("include/linux/compiler*.h: make compiler-*.h mutually exclusive"),
which is supported on gcc >= 5, clang >= 2.9 and icc >= 17.
In the meantime, to support 4.6 <= gcc < 5, we implement
__has_attribute by hand.
All the attributes that can be unconditionally defined and directly
map to compiler attribute(s) (even if optional) have been moved
to a new file include/linux/compiler_attributes.h
In an effort to make the file as regular as possible, comments
stating the purpose of attributes have been removed. Instead,
links to the compiler docs have been added (i.e. to gcc and,
if available, to clang as well). In addition, they have been sorted.
Finally, if an attribute is optional (i.e. if it is guarded
by __has_attribute), the reason has been stated for future reference.
Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # on top of v4.19-rc5, clang 7
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
2018-08-31 01:36:59 +07:00
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noreturn-function-attribute
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#noreturn
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#id1
|
|
|
|
*/
|
|
|
|
#define __noreturn __attribute__((__noreturn__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Optional: only supported since gcc >= 4.8
|
|
|
|
* Optional: not supported by icc
|
|
|
|
*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005fsanitize_005faddress-function-attribute
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#no-sanitize-address-no-address-safety-analysis
|
|
|
|
*/
|
|
|
|
#if __has_attribute(__no_sanitize_address__)
|
|
|
|
# define __no_sanitize_address __attribute__((__no_sanitize_address__))
|
|
|
|
#else
|
|
|
|
# define __no_sanitize_address
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-packed-type-attribute
|
|
|
|
* clang: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-packed-variable-attribute
|
|
|
|
*/
|
|
|
|
#define __packed __attribute__((__packed__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute
|
|
|
|
*/
|
|
|
|
#define __pure __attribute__((__pure__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-section-function-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-section-variable-attribute
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#section-declspec-allocate
|
|
|
|
*/
|
|
|
|
#define __section(S) __attribute__((__section__(#S)))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-unused-function-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-unused-type-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-unused-variable-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-unused-label-attribute
|
|
|
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#maybe-unused-unused
|
|
|
|
*/
|
|
|
|
#define __always_unused __attribute__((__unused__))
|
|
|
|
#define __maybe_unused __attribute__((__unused__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-used-function-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-used-variable-attribute
|
|
|
|
*/
|
|
|
|
#define __used __attribute__((__used__))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-weak-function-attribute
|
|
|
|
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-weak-variable-attribute
|
|
|
|
*/
|
|
|
|
#define __weak __attribute__((__weak__))
|
|
|
|
|
|
|
|
#endif /* __LINUX_COMPILER_ATTRIBUTES_H */
|