|
@@ -65,6 +65,18 @@
|
|
|
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
|
|
#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.
|
|
@@ -72,19 +84,22 @@
|
|
|
* -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))
|
|
|
|