diff options
Diffstat (limited to 'include/linux/compiler-gcc.h')
| -rw-r--r-- | include/linux/compiler-gcc.h | 29 | 
1 files changed, 22 insertions, 7 deletions
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index fd282c7d3e5e..573f5a7d42d4 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -66,25 +66,40 @@  #endif  /* + * 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,   * or if gcc is too old.   * GCC does not warn about unused static inline functions for   * -Wunused-function.  This turns out to avoid the need for complex #ifdef   * directives.  Suppress the warning in clang as well by using "unused"   * function attribute, which is redundant but not harmful for gcc. + * Prefer gnu_inline, so that extern inline functions do not emit an + * externally visible function. This makes extern inline behave as per gnu89 + * 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.   */  #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) ||		\      !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) -#define inline inline		__attribute__((always_inline,unused)) notrace -#define __inline__ __inline__	__attribute__((always_inline,unused)) notrace -#define __inline __inline	__attribute__((always_inline,unused)) notrace +#define inline \ +	inline __attribute__((always_inline, unused)) notrace __gnu_inline  #else -/* A lot of inline functions can cause havoc with function tracing */ -#define inline inline		__attribute__((unused)) notrace -#define __inline__ __inline__	__attribute__((unused)) notrace -#define __inline __inline	__attribute__((unused)) notrace +#define inline inline		__attribute__((unused)) notrace __gnu_inline  #endif +#define __inline__ inline +#define __inline inline  #define __always_inline	inline __attribute__((always_inline))  #define  noinline	__attribute__((noinline))  |