diff options
author | Richard Smith <richard@metafoo.co.uk> | 2013-05-01 20:32:38 +1000 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2013-05-01 21:59:01 +1000 |
commit | 0695940b8ab4b7e69492e8ea071d19fc17dda092 (patch) | |
tree | dadb4df1e2b53a9193f0b3b002902923663f8be9 /misc/sys/cdefs.h | |
parent | 10de07f5fdd9eaf3a808d4461401f5b661095614 (diff) | |
download | glibc-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/sys/cdefs.h')
-rw-r--r-- | misc/sys/cdefs.h | 14 |
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 */ |