This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[ping2][PATCH] Revert to defining __extern_inline only for g++-4.3+


Ping!

On Mon, Sep 01, 2014 at 10:53:06PM +0530, Siddhesh Poyarekar wrote:
> Ping, is this patch OK?  I don't want to necessarily commit it in
> 2.20, but it would be nice to keep it in queue for commit and maybe
> backport it to 2.20 later.
> 
> Siddhesh
> 
> On Wed, Aug 13, 2014 at 11:53:35PM +0530, Siddhesh Poyarekar wrote:
> > Hi,
> > 
> > The check for only __GNUC_STDC_INLINE__ and __GNUC_GNU_INLINE__ may
> > not be sufficient since those flags were added during initial support
> > for C99 inlining semantics.  There is also a problem with always
> > defining __extern_inline and __extern_always_inline, since it enables
> > inline wrapper functions even when GNU inlining semantics are not
> > guaranteed.  This, along with the possibility of such wrappers using
> > redirection (btowc for example) could result in compiler generating an
> > infinitely recusrive call to the function.
> > 
> > In fact it was such a recursion that led to this code being written
> > the way it was; see:
> > 
> > https://bugzilla.redhat.com/show_bug.cgi?id=186410
> > 
> > The initial change:
> > 
> > commit b7bfe116e6304da848759b69a6d713da3e93e936
> > Author: Marek Polacek <polacek@redhat.com>
> > Date:   Wed Sep 26 12:58:36 2012 +0200
> > 
> >     Fix up definitions for older compilers.
> > 
> > was to fix bugs 14530 and 13741, but they can be resolved by checking
> > if __fortify_function and/or __extern_always_inline are defined, as it
> > has been done in this patch.
> > 
> > I have tested this with gcc 3.2, 3.4 and 4.1.  In addition, I have
> > done a quick audit of uses of __extern_always_inline and
> > __extern_inline to make sure that none of the uses can result in
> > compilation errors.
> > 
> > There is however a regression in this patch for llvm, since it reverts
> > the llvm expectation that __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__
> > definition imply proper extern inline semantics.
> > 
> > If we don't want this fixed in 2.20 at this stage, I'd like to know if
> > we can backport to the 2.20 branch after release.
> > 
> > Thanks,
> > Siddhesh
> > 
> > 2014-08-13  Siddhesh Poyarekar  <siddhesh@redhat.com>
> > 	    Jakub Jelinek  <jakub@redhat.com>
> > 
> > 	* libio/stdio.h: Check definition of __fortify_function
> > 	instead of __extern_always_inline to include bits/stdio2.h.
> > 	* math/bits/math-finite.h [__USE_XOPEN || __USE_ISOC99]: Also
> > 	check if __extern_always_inline is defined.
> > 	[__USE_MISC || __USE_XOPEN]: Likewise.
> > 	[__USE_ISOC99] Likewise.
> > 	* misc/sys/cdefs.h (__fortify_function): Define only if
> > 	__extern_always_inline is defined.
> > 	[!__cplusplus || __GNUC_PREREQ (4,3)]: Revert to defining
> > 	__extern_always_inline and __extern_inline only for g++-4.3
> > 	and newer or a compatible gcc.
> > 
> > diff --git a/libio/stdio.h b/libio/stdio.h
> > index d8c0bdb..1f4f837 100644
> > --- a/libio/stdio.h
> > +++ b/libio/stdio.h
> > @@ -932,7 +932,7 @@ extern void funlockfile (FILE *__stream) __THROW;
> >  #ifdef __USE_EXTERN_INLINES
> >  # include <bits/stdio.h>
> >  #endif
> > -#if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
> > +#if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function
> >  # include <bits/stdio2.h>
> >  #endif
> >  #ifdef __LDBL_COMPAT
> > diff --git a/math/bits/math-finite.h b/math/bits/math-finite.h
> > index aa755de..0656645 100644
> > --- a/math/bits/math-finite.h
> > +++ b/math/bits/math-finite.h
> > @@ -251,7 +251,8 @@ extern long double __REDIRECT_NTH (lgammal_r, (long double, int *),
> >  # endif
> >  #endif
> >  
> > -#if defined __USE_XOPEN || defined __USE_ISOC99
> > +#if ((defined __USE_XOPEN || defined __USE_ISOC99) \
> > +     && defined __extern_always_inline)
> >  /* lgamma.  */
> >  __extern_always_inline double __NTH (lgamma (double __d))
> >  {
> > @@ -284,7 +285,8 @@ __extern_always_inline long double __NTH (lgammal (long double __d))
> >  # endif
> >  #endif
> >  
> > -#if defined __USE_MISC || defined __USE_XOPEN
> > +#if ((defined __USE_MISC || defined __USE_XOPEN) \
> > +     && defined __extern_always_inline)
> >  /* gamma.  */
> >  __extern_always_inline double __NTH (gamma (double __d))
> >  {
> > @@ -422,7 +424,7 @@ extern long double __REDIRECT_NTH (sqrtl, (long double), __sqrtl_finite);
> >  # endif
> >  #endif
> >  
> > -#ifdef __USE_ISOC99
> > +#if defined __USE_ISOC99 && defined __extern_always_inline
> >  /* tgamma.  */
> >  extern double __gamma_r_finite (double, int *);
> >  __extern_always_inline double __NTH (tgamma (double __d))
> > diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
> > index 04db956..d8ee73c 100644
> > --- a/misc/sys/cdefs.h
> > +++ b/misc/sys/cdefs.h
> > @@ -131,7 +131,6 @@
> >  /* Fortify support.  */
> >  #define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
> >  #define __bos0(ptr) __builtin_object_size (ptr, 0)
> > -#define __fortify_function __extern_always_inline __attribute_artificial__
> >  
> >  #if __GNUC_PREREQ (4,3)
> >  # define __warndecl(name, msg) \
> > @@ -318,12 +317,10 @@
> >  # define __attribute_artificial__ /* Ignore */
> >  #endif
> >  
> > -#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__
> > +/* 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)
> > +# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
> >  #  define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
> >  #  define __extern_always_inline \
> >    extern __always_inline __attribute__ ((__gnu_inline__))
> > @@ -331,9 +328,10 @@
> >  #  define __extern_inline extern __inline
> >  #  define __extern_always_inline extern __always_inline
> >  # endif
> > -#else /* Not GCC.  */
> > -# define __extern_inline  /* Ignore */
> > -# define __extern_always_inline /* Ignore */
> > +#endif
> > +
> > +#ifdef __extern_always_inline
> > +# define __fortify_function __extern_always_inline __attribute_artificial__
> >  #endif
> >  
> >  /* GCC 4.3 and above allow passing all anonymous arguments of an
> > -- 
> > 1.9.3
> > 
> 
> 


Attachment: pgp2p81yv4M4d.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]