The Compiler Attributes series
This is an effort to disentangle the include/linux/compiler*.h headers and bring them up to date. The main idea behind the series is to use feature checking macros (i.e. __has_attribute) instead of compiler version checks (e.g. GCC_VERSION), which are compiler-agnostic (so they can be shared, reducing the size of compiler-specific headers) and version-agnostic. Other related improvements have been performed in the headers as well, which on top of the use of __has_attribute it has amounted to a significant simplification of these headers (e.g. GCC_VERSION is now only guarding a few non-attribute macros). This series should also help the efforts to support compiling the kernel with clang and icc. A fair amount of documentation and comments have also been added, clarified or removed; and the headers are now more readable, which should help kernel developers in general. The series was triggered due to the move to gcc >= 4.6. In turn, this series has also triggered Sparse to gain the ability to recognize __has_attribute on its own. Finally, the __nonstring variable attribute series has been also applied on top; plus two related patches from Nick Desaulniers for unreachable() that came a bit afterwards. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEPjU5OPd5QIZ9jqqOGXyLc2htIW0FAlvNpywACgkQGXyLc2ht IW1aiQ/+P8SJOa3GkiH37/nrIbk/wgMNytbs+gxE5YPaU1DP74Mn1prJ4XhQQic9 /mt8GnitZwzEHWdsGEUk+ZQwnIa7ZEAmpecbAF206AMRbNxa14T5YwBx4bqWFjZp sP4zPTHt3JCKL8TM+z26o152UbF2kc4WSxHjEjSFaqEnR2E5D0MwFeGPzc8fgWmS pNyn3CidzB0TS1UF008YXhiJO6HIhFNPyhPawlhwbbdsdlhZ4u0JmwfqP4EvjRFM kyzdQ9CDe+AgTTD9Y8HhtoUClaa7SJzFWNzpKIJMWt8jpKWYZQ/+WtwKg2cf+v3M uwktcs3RI1dYrjcITLz4VJ0oVaRFnyGgXvMP4yqWQx429hqnd09WXhMioXQ1htoI H0vpPIAPsK+dqVA9sP3JzMq4h6+dE7P364lkbThbVpYAGKZ52qaLt9ixT1mw1Q9f a683ji6o02IVOGUNZ/3KAb5MqdhewNEDdZILZYRfm4AL1Em3WW9QVtIosHPviLgc 16VjA02wKdxIcg+1LZMTNhfybztnSCf7SuQurpH1zEqFDGzrXwB7nYFplEY7DrrD cqhOA1fMQa++oQR+D40QDoY2ybqPOyvJG7z17pvtt+6jXep4yy2a3Bxf+ClK0nto 5yT7v9ikXJr84FOkk7OvktLlAWvcykvAdfvDepBZhpqhuX82tHY= =Y8WB -----END PGP SIGNATURE----- Merge tag 'compiler-attributes-for-linus-4.20-rc1' of https://github.com/ojeda/linux Pull compiler attribute updates from Miguel Ojeda: "This is an effort to disentangle the include/linux/compiler*.h headers and bring them up to date. The main idea behind the series is to use feature checking macros (i.e. __has_attribute) instead of compiler version checks (e.g. GCC_VERSION), which are compiler-agnostic (so they can be shared, reducing the size of compiler-specific headers) and version-agnostic. Other related improvements have been performed in the headers as well, which on top of the use of __has_attribute it has amounted to a significant simplification of these headers (e.g. GCC_VERSION is now only guarding a few non-attribute macros). This series should also help the efforts to support compiling the kernel with clang and icc. A fair amount of documentation and comments have also been added, clarified or removed; and the headers are now more readable, which should help kernel developers in general. The series was triggered due to the move to gcc >= 4.6. In turn, this series has also triggered Sparse to gain the ability to recognize __has_attribute on its own. Finally, the __nonstring variable attribute series has been also applied on top; plus two related patches from Nick Desaulniers for unreachable() that came a bit afterwards" * tag 'compiler-attributes-for-linus-4.20-rc1' of https://github.com/ojeda/linux: compiler-gcc: remove comment about gcc 4.5 from unreachable() compiler.h: update definition of unreachable() Compiler Attributes: ext4: remove local __nonstring definition Compiler Attributes: auxdisplay: panel: use __nonstring Compiler Attributes: enable -Wstringop-truncation on W=1 (gcc >= 8) Compiler Attributes: add support for __nonstring (gcc >= 8) Compiler Attributes: add MAINTAINERS entry Compiler Attributes: add Doc/process/programming-language.rst Compiler Attributes: remove uses of __attribute__ from compiler.h Compiler Attributes: KENTRY used twice the "used" attribute Compiler Attributes: use feature checks instead of version checks Compiler Attributes: add missing SPDX ID in compiler_types.h Compiler Attributes: remove unneeded sparse (__CHECKER__) tests Compiler Attributes: homogenize __must_be_array Compiler Attributes: remove unneeded tests Compiler Attributes: always use the extra-underscores syntax Compiler Attributes: remove unused attributes
This commit is contained in:
commit
e468f5c06b
|
@ -25,6 +25,7 @@ Below are the essential guides that every developer should read.
|
|||
code-of-conduct-interpretation
|
||||
development-process
|
||||
submitting-patches
|
||||
programming-language
|
||||
coding-style
|
||||
maintainer-pgp-guide
|
||||
email-clients
|
||||
|
|
45
Documentation/process/programming-language.rst
Normal file
45
Documentation/process/programming-language.rst
Normal file
|
@ -0,0 +1,45 @@
|
|||
.. _programming_language:
|
||||
|
||||
Programming Language
|
||||
====================
|
||||
|
||||
The kernel is written in the C programming language [c-language]_.
|
||||
More precisely, the kernel is typically compiled with ``gcc`` [gcc]_
|
||||
under ``-std=gnu89`` [gcc-c-dialect-options]_: the GNU dialect of ISO C90
|
||||
(including some C99 features).
|
||||
|
||||
This dialect contains many extensions to the language [gnu-extensions]_,
|
||||
and many of them are used within the kernel as a matter of course.
|
||||
|
||||
There is some support for compiling the kernel with ``clang`` [clang]_
|
||||
and ``icc`` [icc]_ for several of the architectures, although at the time
|
||||
of writing it is not completed, requiring third-party patches.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
|
||||
One of the common extensions used throughout the kernel are attributes
|
||||
[gcc-attribute-syntax]_. Attributes allow to introduce
|
||||
implementation-defined semantics to language entities (like variables,
|
||||
functions or types) without having to make significant syntactic changes
|
||||
to the language (e.g. adding a new keyword) [n2049]_.
|
||||
|
||||
In some cases, attributes are optional (i.e. a compiler not supporting them
|
||||
should still produce proper code, even if it is slower or does not perform
|
||||
as many compile-time checks/diagnostics).
|
||||
|
||||
The kernel defines pseudo-keywords (e.g. ``__pure``) instead of using
|
||||
directly the GNU attribute syntax (e.g. ``__attribute__((__pure__))``)
|
||||
in order to feature detect which ones can be used and/or to shorten the code.
|
||||
|
||||
Please refer to ``include/linux/compiler_attributes.h`` for more information.
|
||||
|
||||
.. [c-language] http://www.open-std.org/jtc1/sc22/wg14/www/standards
|
||||
.. [gcc] https://gcc.gnu.org
|
||||
.. [clang] https://clang.llvm.org
|
||||
.. [icc] https://software.intel.com/en-us/c-compilers
|
||||
.. [gcc-c-dialect-options] https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html
|
||||
.. [gnu-extensions] https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
|
||||
.. [gcc-attribute-syntax] https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html
|
||||
.. [n2049] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2049.pdf
|
||||
|
|
@ -3737,6 +3737,11 @@ L: platform-driver-x86@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/platform/x86/compal-laptop.c
|
||||
|
||||
COMPILER ATTRIBUTES
|
||||
M: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
||||
S: Maintained
|
||||
F: include/linux/compiler_attributes.h
|
||||
|
||||
CONEXANT ACCESSRUNNER USB DRIVER
|
||||
L: accessrunner-general@lists.sourceforge.net
|
||||
W: http://accessrunner.sourceforge.net/
|
||||
|
|
|
@ -155,10 +155,9 @@ struct logical_input {
|
|||
int release_data;
|
||||
} std;
|
||||
struct { /* valid when type == INPUT_TYPE_KBD */
|
||||
/* strings can be non null-terminated */
|
||||
char press_str[sizeof(void *) + sizeof(int)];
|
||||
char repeat_str[sizeof(void *) + sizeof(int)];
|
||||
char release_str[sizeof(void *) + sizeof(int)];
|
||||
char press_str[sizeof(void *) + sizeof(int)] __nonstring;
|
||||
char repeat_str[sizeof(void *) + sizeof(int)] __nonstring;
|
||||
char release_str[sizeof(void *) + sizeof(int)] __nonstring;
|
||||
} kbd;
|
||||
} u;
|
||||
};
|
||||
|
|
|
@ -45,15 +45,6 @@
|
|||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
/* Until this gets included into linux/compiler-gcc.h */
|
||||
#ifndef __nonstring
|
||||
#if defined(GCC_VERSION) && (GCC_VERSION >= 80000)
|
||||
#define __nonstring __attribute__((nonstring))
|
||||
#else
|
||||
#define __nonstring
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The fourth extended filesystem constants/structures
|
||||
*/
|
||||
|
|
|
@ -21,8 +21,6 @@
|
|||
#define __SANITIZE_ADDRESS__
|
||||
#endif
|
||||
|
||||
#define __no_sanitize_address __attribute__((no_sanitize("address")))
|
||||
|
||||
/*
|
||||
* Not all versions of clang implement the the type-generic versions
|
||||
* of the builtin overflow checkers. Fortunately, clang implements
|
||||
|
@ -41,6 +39,3 @@
|
|||
* compilers, like ICC.
|
||||
*/
|
||||
#define barrier() __asm__ __volatile__("" : : : "memory")
|
||||
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||
#define __assume_aligned(a, ...) \
|
||||
__attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
||||
|
|
|
@ -68,31 +68,20 @@
|
|||
*/
|
||||
#define uninitialized_var(x) x = x
|
||||
|
||||
#ifdef __CHECKER__
|
||||
#define __must_be_array(a) 0
|
||||
#else
|
||||
/* &a[0] degrades to a pointer: a different type from an array */
|
||||
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||
#endif
|
||||
|
||||
#ifdef RETPOLINE
|
||||
#define __noretpoline __attribute__((indirect_branch("keep")))
|
||||
#define __noretpoline __attribute__((__indirect_branch__("keep")))
|
||||
#endif
|
||||
|
||||
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||
|
||||
#define __optimize(level) __attribute__((__optimize__(level)))
|
||||
|
||||
#define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
||||
|
||||
#ifndef __CHECKER__
|
||||
#define __compiletime_warning(message) __attribute__((warning(message)))
|
||||
#define __compiletime_error(message) __attribute__((error(message)))
|
||||
#define __compiletime_warning(message) __attribute__((__warning__(message)))
|
||||
#define __compiletime_error(message) __attribute__((__error__(message)))
|
||||
|
||||
#ifdef LATENT_ENTROPY_PLUGIN
|
||||
#if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__)
|
||||
#define __latent_entropy __attribute__((latent_entropy))
|
||||
#endif
|
||||
#endif /* __CHECKER__ */
|
||||
|
||||
/*
|
||||
* calling noreturn functions, __builtin_unreachable() and __builtin_trap()
|
||||
|
@ -107,10 +96,6 @@
|
|||
* Mark a position in code as unreachable. This can be used to
|
||||
* suppress control flow warnings after asm blocks that transfer
|
||||
* control elsewhere.
|
||||
*
|
||||
* Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||
* this in the preprocessor, but we can live with this because they're
|
||||
* unreleased. Really, we need to have autoconf for the kernel.
|
||||
*/
|
||||
#define unreachable() \
|
||||
do { \
|
||||
|
@ -119,9 +104,6 @@
|
|||
__builtin_unreachable(); \
|
||||
} while (0)
|
||||
|
||||
/* Mark a function definition as prohibited from being cloned. */
|
||||
#define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
|
||||
|
||||
#if defined(RANDSTRUCT_PLUGIN) && !defined(__CHECKER__)
|
||||
#define __randomize_layout __attribute__((randomize_layout))
|
||||
#define __no_randomize_layout __attribute__((no_randomize_layout))
|
||||
|
@ -130,32 +112,6 @@
|
|||
#define randomized_struct_fields_end } __randomize_layout;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* When used with Link Time Optimization, gcc can optimize away C functions or
|
||||
* variables which are referenced only from assembly code. __visible tells the
|
||||
* optimizer that something else uses this function or variable, thus preventing
|
||||
* this.
|
||||
*/
|
||||
#define __visible __attribute__((externally_visible))
|
||||
|
||||
/* gcc version specific checks */
|
||||
|
||||
#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
|
||||
/*
|
||||
* __assume_aligned(n, k): Tell the optimizer that the returned
|
||||
* pointer can be assumed to be k modulo n. 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;').
|
||||
*/
|
||||
#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* GCC 'asm goto' miscompiles certain code sequences:
|
||||
*
|
||||
|
@ -187,39 +143,22 @@
|
|||
#define KASAN_ABI_VERSION 3
|
||||
#endif
|
||||
|
||||
#if GCC_VERSION >= 40902
|
||||
/*
|
||||
* Tell the compiler that address safety instrumentation (KASAN)
|
||||
* should not be applied to that function.
|
||||
* Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
|
||||
* Because __no_sanitize_address conflicts with inlining:
|
||||
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
|
||||
* we do one or the other.
|
||||
*/
|
||||
#define __no_sanitize_address __attribute__((no_sanitize_address))
|
||||
#ifdef CONFIG_KASAN
|
||||
#define __no_sanitize_address_or_inline \
|
||||
__no_sanitize_address __maybe_unused notrace
|
||||
#else
|
||||
#define __no_sanitize_address_or_inline inline
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if GCC_VERSION >= 50100
|
||||
/*
|
||||
* Mark structures as requiring designated initializers.
|
||||
* https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
|
||||
*/
|
||||
#define __designated_init __attribute__((designated_init))
|
||||
#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
|
||||
#endif
|
||||
|
||||
#if !defined(__noclone)
|
||||
#define __noclone /* not needed */
|
||||
#endif
|
||||
|
||||
#if !defined(__no_sanitize_address)
|
||||
#define __no_sanitize_address
|
||||
#define __no_sanitize_address_or_inline inline
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Turn individual warnings and errors on and off locally, depending
|
||||
* on version.
|
||||
|
|
|
@ -29,17 +29,8 @@
|
|||
*/
|
||||
#define OPTIMIZER_HIDE_VAR(var) barrier()
|
||||
|
||||
/* Intel ECC compiler doesn't support __builtin_types_compatible_p() */
|
||||
#define __must_be_array(a) 0
|
||||
|
||||
#endif
|
||||
|
||||
/* icc has this, but it's called _bswap16 */
|
||||
#define __HAVE_BUILTIN_BSWAP16__
|
||||
#define __builtin_bswap16 _bswap16
|
||||
|
||||
/* The following are for compatibility with GCC, from compiler-gcc.h,
|
||||
* and may be redefined here because they should not be shared with other
|
||||
* compilers, like clang.
|
||||
*/
|
||||
#define __visible __attribute__((externally_visible))
|
||||
|
|
|
@ -23,8 +23,8 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
|
|||
#define __branch_check__(x, expect, is_constant) ({ \
|
||||
long ______r; \
|
||||
static struct ftrace_likely_data \
|
||||
__attribute__((__aligned__(4))) \
|
||||
__attribute__((section("_ftrace_annotated_branch"))) \
|
||||
__aligned(4) \
|
||||
__section("_ftrace_annotated_branch") \
|
||||
______f = { \
|
||||
.data.func = __func__, \
|
||||
.data.file = __FILE__, \
|
||||
|
@ -59,8 +59,8 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
|
|||
({ \
|
||||
int ______r; \
|
||||
static struct ftrace_branch_data \
|
||||
__attribute__((__aligned__(4))) \
|
||||
__attribute__((section("_ftrace_branch"))) \
|
||||
__aligned(4) \
|
||||
__section("_ftrace_branch") \
|
||||
______f = { \
|
||||
.func = __func__, \
|
||||
.file = __FILE__, \
|
||||
|
@ -115,7 +115,10 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
|
|||
# define ASM_UNREACHABLE
|
||||
#endif
|
||||
#ifndef unreachable
|
||||
# define unreachable() do { annotate_reachable(); do { } while (1); } while (0)
|
||||
# define unreachable() do { \
|
||||
annotate_unreachable(); \
|
||||
__builtin_unreachable(); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -137,7 +140,7 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
|
|||
extern typeof(sym) sym; \
|
||||
static const unsigned long __kentry_##sym \
|
||||
__used \
|
||||
__attribute__((section("___kentry" "+" #sym ), used)) \
|
||||
__section("___kentry" "+" #sym ) \
|
||||
= (unsigned long)&sym;
|
||||
#endif
|
||||
|
||||
|
@ -278,7 +281,7 @@ unsigned long read_word_at_a_time(const void *addr)
|
|||
* visible to the compiler.
|
||||
*/
|
||||
#define __ADDRESSABLE(sym) \
|
||||
static void * __attribute__((section(".discard.addressable"), used)) \
|
||||
static void * __section(".discard.addressable") __used \
|
||||
__PASTE(__addressable_##sym, __LINE__) = (void *)&sym;
|
||||
|
||||
/**
|
||||
|
@ -331,10 +334,6 @@ static inline void *offset_to_ptr(const int *off)
|
|||
#endif /* __KERNEL__ */
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#ifndef __optimize
|
||||
# define __optimize(level)
|
||||
#endif
|
||||
|
||||
/* Compile time object size, -1 for unknown */
|
||||
#ifndef __compiletime_object_size
|
||||
# define __compiletime_object_size(obj) -1
|
||||
|
@ -376,4 +375,7 @@ static inline void *offset_to_ptr(const int *off)
|
|||
compiletime_assert(__native_word(t), \
|
||||
"Need native word sized stores/loads for atomicity.")
|
||||
|
||||
/* &a[0] degrades to a pointer: a different type from an array */
|
||||
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||
|
||||
#endif /* __LINUX_COMPILER_H */
|
||||
|
|
258
include/linux/compiler_attributes.h
Normal file
258
include/linux/compiler_attributes.h
Normal file
|
@ -0,0 +1,258 @@
|
|||
/* 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
|
||||
# define __GCC4_has_attribute___nonstring__ 0
|
||||
# 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__))
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
/*
|
||||
* 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 */
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __LINUX_COMPILER_TYPES_H
|
||||
#define __LINUX_COMPILER_TYPES_H
|
||||
|
||||
|
@ -54,6 +55,9 @@ extern void __chk_io_ptr(const volatile void __iomem *);
|
|||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/* Attributes */
|
||||
#include <linux/compiler_attributes.h>
|
||||
|
||||
/* Compiler specific macros. */
|
||||
#ifdef __clang__
|
||||
#include <linux/compiler-clang.h>
|
||||
|
@ -78,12 +82,6 @@ extern void __chk_io_ptr(const volatile void __iomem *);
|
|||
#include <asm/compiler.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Generic compiler-independent macros required for kernel
|
||||
* build go below this comment. Actual compiler/compiler version
|
||||
* specific implementations come from the above header files
|
||||
*/
|
||||
|
||||
struct ftrace_branch_data {
|
||||
const char *func;
|
||||
const char *file;
|
||||
|
@ -106,10 +104,6 @@ struct ftrace_likely_data {
|
|||
unsigned long constant;
|
||||
};
|
||||
|
||||
/* Don't. Just don't. */
|
||||
#define __deprecated
|
||||
#define __deprecated_for_modules
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
@ -119,10 +113,6 @@ struct ftrace_likely_data {
|
|||
* compilers. We don't consider that to be an error, so set them to nothing.
|
||||
* For example, some of them are for compiler specific plugins.
|
||||
*/
|
||||
#ifndef __designated_init
|
||||
# define __designated_init
|
||||
#endif
|
||||
|
||||
#ifndef __latent_entropy
|
||||
# define __latent_entropy
|
||||
#endif
|
||||
|
@ -140,17 +130,6 @@ struct ftrace_likely_data {
|
|||
# define randomized_struct_fields_end
|
||||
#endif
|
||||
|
||||
#ifndef __visible
|
||||
#define __visible
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Assume alignment of return value.
|
||||
*/
|
||||
#ifndef __assume_aligned
|
||||
#define __assume_aligned(a, ...)
|
||||
#endif
|
||||
|
||||
/* Are two types/vars the same type (ignoring qualifiers)? */
|
||||
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
|
||||
|
||||
|
@ -159,14 +138,6 @@ struct ftrace_likely_data {
|
|||
(sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
|
||||
sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
|
||||
|
||||
#ifndef __attribute_const__
|
||||
#define __attribute_const__ __attribute__((__const__))
|
||||
#endif
|
||||
|
||||
#ifndef __noclone
|
||||
#define __noclone
|
||||
#endif
|
||||
|
||||
/* Helpers for emitting diagnostics in pragmas. */
|
||||
#ifndef __diag
|
||||
#define __diag(string)
|
||||
|
@ -186,43 +157,16 @@ struct ftrace_likely_data {
|
|||
#define __diag_error(compiler, version, option, comment) \
|
||||
__diag_ ## compiler(version, error, option)
|
||||
|
||||
/*
|
||||
* From the GCC manual:
|
||||
*
|
||||
* Many functions have no effects except the return value and their
|
||||
* return value depends only on the parameters and/or global
|
||||
* variables. Such a function can be subject to common subexpression
|
||||
* elimination and loop optimization just as an arithmetic operator
|
||||
* would be.
|
||||
* [...]
|
||||
*/
|
||||
#define __pure __attribute__((pure))
|
||||
#define __aligned(x) __attribute__((aligned(x)))
|
||||
#define __printf(a, b) __attribute__((format(printf, a, b)))
|
||||
#define __scanf(a, b) __attribute__((format(scanf, a, b)))
|
||||
#define __maybe_unused __attribute__((unused))
|
||||
#define __always_unused __attribute__((unused))
|
||||
#define __mode(x) __attribute__((mode(x)))
|
||||
#define __malloc __attribute__((__malloc__))
|
||||
#define __used __attribute__((__used__))
|
||||
#define __noreturn __attribute__((noreturn))
|
||||
#define __packed __attribute__((packed))
|
||||
#define __weak __attribute__((weak))
|
||||
#define __alias(symbol) __attribute__((alias(#symbol)))
|
||||
#define __cold __attribute__((cold))
|
||||
#define __section(S) __attribute__((__section__(#S)))
|
||||
|
||||
|
||||
#ifdef CONFIG_ENABLE_MUST_CHECK
|
||||
#define __must_check __attribute__((warn_unused_result))
|
||||
#define __must_check __attribute__((__warn_unused_result__))
|
||||
#else
|
||||
#define __must_check
|
||||
#endif
|
||||
|
||||
#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__)
|
||||
#if defined(CC_USING_HOTPATCH)
|
||||
#define notrace __attribute__((hotpatch(0, 0)))
|
||||
#else
|
||||
#define notrace __attribute__((no_instrument_function))
|
||||
#define notrace __attribute__((__no_instrument_function__))
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -231,22 +175,10 @@ struct ftrace_likely_data {
|
|||
* stack and frame pointer being set up and there is no chance to
|
||||
* restore the lr register to the value before mcount was called.
|
||||
*/
|
||||
#define __naked __attribute__((naked)) notrace
|
||||
#define __naked __attribute__((__naked__)) notrace
|
||||
|
||||
#define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
|
||||
|
||||
/*
|
||||
* Feature detection for gnu_inline (gnu89 extern inline semantics). Either
|
||||
* __GNUC_STDC_INLINE__ is defined (not using gnu89 extern inline semantics,
|
||||
* and we opt in to the gnu89 semantics), or __GNUC_STDC_INLINE__ is not
|
||||
* defined so the gnu89 semantics are the default.
|
||||
*/
|
||||
#ifdef __GNUC_STDC_INLINE__
|
||||
# define __gnu_inline __attribute__((gnu_inline))
|
||||
#else
|
||||
# define __gnu_inline
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Force always-inline if the user requests it so via the .config.
|
||||
* GCC does not warn about unused static inline functions for
|
||||
|
@ -258,22 +190,20 @@ struct ftrace_likely_data {
|
|||
* semantics rather than c99. This prevents multiple symbol definition errors
|
||||
* of extern inline functions at link time.
|
||||
* A lot of inline functions can cause havoc with function tracing.
|
||||
* Do not use __always_inline here, since currently it expands to inline again
|
||||
* (which would break users of __always_inline).
|
||||
*/
|
||||
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
|
||||
!defined(CONFIG_OPTIMIZE_INLINING)
|
||||
#define inline \
|
||||
inline __attribute__((always_inline, unused)) notrace __gnu_inline
|
||||
#define inline inline __attribute__((__always_inline__)) __gnu_inline \
|
||||
__maybe_unused notrace
|
||||
#else
|
||||
#define inline inline __attribute__((unused)) notrace __gnu_inline
|
||||
#define inline inline __gnu_inline \
|
||||
__maybe_unused notrace
|
||||
#endif
|
||||
|
||||
#define __inline__ inline
|
||||
#define __inline inline
|
||||
#define noinline __attribute__((noinline))
|
||||
|
||||
#ifndef __always_inline
|
||||
#define __always_inline inline __attribute__((always_inline))
|
||||
#endif
|
||||
#define __inline inline
|
||||
|
||||
/*
|
||||
* Rather then using noinline to prevent stack consumption, use
|
||||
|
|
|
@ -29,6 +29,7 @@ warning-1 += $(call cc-option, -Wmissing-include-dirs)
|
|||
warning-1 += $(call cc-option, -Wunused-but-set-variable)
|
||||
warning-1 += $(call cc-option, -Wunused-const-variable)
|
||||
warning-1 += $(call cc-option, -Wpacked-not-aligned)
|
||||
warning-1 += $(call cc-option, -Wstringop-truncation)
|
||||
warning-1 += $(call cc-disable-warning, missing-field-initializers)
|
||||
warning-1 += $(call cc-disable-warning, sign-compare)
|
||||
|
||||
|
|
Loading…
Reference in a new issue