From 0695940b8ab4b7e69492e8ea071d19fc17dda092 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 1 May 2013 20:32:38 +1000 Subject: [PATCH] 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. --- ChangeLog | 8 ++++++++ misc/sys/cdefs.h | 14 ++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index b584840..f9a9bdc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-05-01 Richard Smith + + * 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 [BZ #15423] diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index f5f18e9..4aded9b 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 */ -- 2.7.4