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] |
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] |