Use __gnu_inline__ for __extern_always_inline in g++-4.2
authorRichard Smith <richard@metafoo.co.uk>
Wed, 1 May 2013 10:32:38 +0000 (20:32 +1000)
committerAllan McRae <allan@archlinux.org>
Wed, 1 May 2013 11:59:01 +0000 (21:59 +1000)
Use the __gnu_inline__ attribute in _FORTIFY_SOURCE's __extern_always_inline
macro whenever the compiler supports it. Previously this macro only included
the __gnu_inline__ attribute in C++ mode for gcc >= 4.3. However,
__gnu_inline__ semantics are always desired for the __extern_always_inline
functions, and are available in g++ 4.2 (and some releases of g++ 4.1, and
also in Clang, which claims to be g++ 4.2).

This change stops g++-4.2 from emitting weak definitions for the fortify
wrapper functions if they can't be inlined, and also improves Clang
compatibility.

ChangeLog
misc/sys/cdefs.h

index b584840..f9a9bdc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2013-05-01  Richard Smith  <richard@metafoo.co.uk>
+
+       * misc/sys/cdefs.h (__extern_inline, __extern_always_inline)
+       [__GNUC__ && (__GNUC_STDC_INLINE__ || __GNUC_GNU_INLINE__)]:
+       Use __attribute__ ((__gnu_inline__)).
+       [__GNUC__ && !(__GNUC_STDC_INLINE__ || __GNUC_GNU_INLINE__)]:
+       Don't use __attribute__ ((__gnu_inline__)).
+
 2013-05-01  Joseph Myers  <joseph@codesourcery.com>
 
        [BZ #15423]
index f5f18e9..4aded9b 100644 (file)
 # define __attribute_artificial__ /* Ignore */
 #endif
 
-/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
-   inline semantics, unless -fgnu89-inline is used.  */
-#if (!defined __cplusplus || __GNUC_PREREQ (4,3)) && defined __GNUC__
-# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
+#ifdef __GNUC__
+/* One of these will be defined if the __gnu_inline__ attribute is
+   available.  In C++, __GNUC_GNU_INLINE__ will be defined even though
+   __inline does not use the GNU inlining rules.  If neither macro is
+   defined, this version of GCC only supports GNU inline semantics. */
+# if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
 #  define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
 #  define __extern_always_inline \
   extern __always_inline __attribute__ ((__gnu_inline__))
 #  define __extern_inline extern __inline
 #  define __extern_always_inline extern __always_inline
 # endif
-#elif defined __GNUC__ /* C++ and GCC <4.3.  */
-# define __extern_inline extern __inline
-# define __extern_always_inline \
-  extern __always_inline
 #else /* Not GCC.  */
 # define __extern_inline  /* Ignore */
 # define __extern_always_inline /* Ignore */