Message ID | 20140828065509.GI8020@spoyarek.pnq.redhat.com |
---|---|
State | New |
Headers | show |
On Thu, 28 Aug 2014, Siddhesh Poyarekar wrote: > diff --git a/include/bits/stdlib-float.h b/include/bits/stdlib-float.h > index 3466314..debb364 100644 > --- a/include/bits/stdlib-float.h > +++ b/include/bits/stdlib-float.h > @@ -1,4 +1,6 @@ > /* No floating-point inline functions in rtld. */ > -#if !IS_IN (rtld) > -# include <stdlib/bits/stdlib-float.h> > +#ifdef _LIBC > +# if !IS_IN (rtld) > +# include <stdlib/bits/stdlib-float.h> > +# endif > #endif That seems wrong - it would mean that <stdlib/bits/stdlib-float.h> doesn't get included at all unless _LIBC. But <stdlib/bits/stdlib-float.h> should be included for the conformance tests, because it would be included for a normal user build (by virtue of being installed as <bits/stdlib-float.h>). So you could include this header for _ISOMAC (for example), in addition to a #else / #if !IS_IN (rtld) case. > diff --git a/include/mqueue.h b/include/mqueue.h > index aba788e..e40f3cb 100644 > --- a/include/mqueue.h > +++ b/include/mqueue.h > @@ -1,7 +1,9 @@ > #include <rt/mqueue.h> > > -#if IS_IN (librt) > +#ifdef _LIBC > +# if IS_IN (librt) > hidden_proto (mq_timedsend) > hidden_proto (mq_timedreceive) > hidden_proto (mq_setattr) > +# endif > #endif Normally, #ifndef _ISOMAC would be the conditional around such extra internal-only contents (and then #if IS_IN (librt) could go inside the !_ISOMAC case). > diff --git a/include/stdlib.h b/include/stdlib.h > index 734f251..a884b51 100644 > --- a/include/stdlib.h > +++ b/include/stdlib.h > @@ -226,11 +226,13 @@ extern int __qfcvt_r (long double __value, int __ndigit, > int *__restrict __decpt, int *__restrict __sign, > char *__restrict __buf, size_t __len); > > -# if IS_IN (libc) > -# undef MB_CUR_MAX > -# define MB_CUR_MAX (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX)) > +# if defined _LIBC > +# if IS_IN (libc) > +# undef MB_CUR_MAX > +# define MB_CUR_MAX (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX)) > > -# define __cxa_atexit(func, arg, d) INTUSE(__cxa_atexit) (func, arg, d) > +# define __cxa_atexit(func, arg, d) INTUSE(__cxa_atexit) (func, arg, d) > +# endif > # endif Why do you need this? Aren't you already inside a !defined _ISOMAC case?
Use #if defined _LIBC && IS_IN (...) rather than nesting. Otherwise OK.
On Fri, Nov 07, 2014 at 03:33:33PM -0800, Roland McGrath wrote: > Use #if defined _LIBC && IS_IN (...) rather than nesting. > Otherwise OK. That doesn't work - the compiler complains about IS_IN not being defined. That is why I had to nest it. Siddhesh
On Tue, Nov 18, 2014 at 07:24:45PM +0530, Siddhesh Poyarekar wrote: > On Fri, Nov 07, 2014 at 03:33:33PM -0800, Roland McGrath wrote: > > Use #if defined _LIBC && IS_IN (...) rather than nesting. > > Otherwise OK. > > That doesn't work - the compiler complains about IS_IN not being > defined. That is why I had to nest it. s/compiler/preprocessor/ of course. Siddhesh
I see. I was not expecting such an error because it doesn't give one for "#if defined notdefined && alsonotdefined" but evidently the function-like macro case is different.
Roland McGrath <roland@hack.frob.com> writes: > I see. I was not expecting such an error because it doesn't give one for > "#if defined notdefined && alsonotdefined" but evidently the function-like > macro case is different. The problem is that all remaining identifiers are replaced by 0 before the expression is evaluated, thus resulting in a non-syntactical expression. Andreas.
diff --git a/include/bits/stdlib-float.h b/include/bits/stdlib-float.h index 3466314..debb364 100644 --- a/include/bits/stdlib-float.h +++ b/include/bits/stdlib-float.h @@ -1,4 +1,6 @@ /* No floating-point inline functions in rtld. */ -#if !IS_IN (rtld) -# include <stdlib/bits/stdlib-float.h> +#ifdef _LIBC +# if !IS_IN (rtld) +# include <stdlib/bits/stdlib-float.h> +# endif #endif diff --git a/include/mqueue.h b/include/mqueue.h index aba788e..e40f3cb 100644 --- a/include/mqueue.h +++ b/include/mqueue.h @@ -1,7 +1,9 @@ #include <rt/mqueue.h> -#if IS_IN (librt) +#ifdef _LIBC +# if IS_IN (librt) hidden_proto (mq_timedsend) hidden_proto (mq_timedreceive) hidden_proto (mq_setattr) +# endif #endif diff --git a/include/stdlib.h b/include/stdlib.h index 734f251..a884b51 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -226,11 +226,13 @@ extern int __qfcvt_r (long double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign, char *__restrict __buf, size_t __len); -# if IS_IN (libc) -# undef MB_CUR_MAX -# define MB_CUR_MAX (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX)) +# if defined _LIBC +# if IS_IN (libc) +# undef MB_CUR_MAX +# define MB_CUR_MAX (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX)) -# define __cxa_atexit(func, arg, d) INTUSE(__cxa_atexit) (func, arg, d) +# define __cxa_atexit(func, arg, d) INTUSE(__cxa_atexit) (func, arg, d) +# endif # endif extern void *__default_morecore (ptrdiff_t) __THROW;
Hi, Here's an updated patch that fixes conformtest failures due to IS_IN. The conformtest tests ideally ought to include the headers to be installed, but cannot do so currently and hence does its tests using headers in include/. Due to this it fails because it doesn't include any of the libc headers and consequently does not have a definition for IS_IN. This patch guards instances in such headers with #ifdef _LIBC. There are a couple of installed headers that have this problem too - stdio-lock.h and libc-lock.h. Both headers however never get used in normal applications since they're only included when _IO_MTSAFE_IO is defined, which it isn't in the normal case. I haven't tried to fix these headers because it won't make a difference and ideally they ought to be removed. I intend to do that as a separate patch after 2.20 is released. I have also verified that this does not result in any change in generated code on x86_64. Siddhesh From 00592dd98e35bc9771d17114f9c1da62368f8488 Mon Sep 17 00:00:00 2001 From: Siddhesh Poyarekar <siddhesh@redhat.com> Date: Mon, 25 Aug 2014 15:58:46 +0530 Subject: [PATCH] Use IS_IN when _LIBC is defined This change is only useful for the conformance tests since the headers changed are not installed. The conformance tests fail due to IS_IN not being defined, so wrap it with a check to make sure that _LIBC is defined. * include/bits/stdlib-float.h: Use IS_IN only if _LIBC is defined. * include/mqueue.h: Likewise. * include/stdlib.h: Likewise. --- include/bits/stdlib-float.h | 6 ++++-- include/mqueue.h | 4 +++- include/stdlib.h | 10 ++++++---- 3 files changed, 13 insertions(+), 7 deletions(-)