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 | |
parent | 10de07f5fdd9eaf3a808d4461401f5b661095614 (diff) | |
download | glibc-0695940b8ab4b7e69492e8ea071d19fc17dda092.tar.gz glibc-0695940b8ab4b7e69492e8ea071d19fc17dda092.tar.xz 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.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | misc/sys/cdefs.h | 14 |
2 files changed, 14 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog index b584840009..f9a9bdcbea 100644 --- 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] 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 */ |