[ping2][PATCH] Revert to defining __extern_inline only for g++-4.3+
Siddhesh Poyarekar
siddhesh@redhat.com
Mon Sep 15 08:16:00 GMT 2014
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
> >
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20140915/f2af73bd/attachment.sig>
More information about the Libc-alpha
mailing list