aboutsummaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorRichard Smith <richard@metafoo.co.uk>2013-05-01 20:32:38 +1000
committerAllan McRae <allan@archlinux.org>2013-05-01 21:59:01 +1000
commit0695940b8ab4b7e69492e8ea071d19fc17dda092 (patch)
treedadb4df1e2b53a9193f0b3b002902923663f8be9 /misc
parent10de07f5fdd9eaf3a808d4461401f5b661095614 (diff)
downloadglibc-0695940b8ab4b7e69492e8ea071d19fc17dda092.tar
glibc-0695940b8ab4b7e69492e8ea071d19fc17dda092.tar.gz
glibc-0695940b8ab4b7e69492e8ea071d19fc17dda092.tar.bz2
glibc-0695940b8ab4b7e69492e8ea071d19fc17dda092.zip
Use __gnu_inline__ for __extern_always_inline in g++-4.2
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.
Diffstat (limited to 'misc')
-rw-r--r--misc/sys/cdefs.h14
1 files changed, 6 insertions, 8 deletions
diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index f5f18e914c..4aded9bbbd 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -318,10 +318,12 @@
# 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__))
@@ -329,10 +331,6 @@
# 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 */