Possible Issue in ieeefp.h
Craig Howland
howland@LGSInnovations.com
Mon Nov 21 20:20:00 GMT 2016
On 11/21/2016 03:12 PM, Joel Sherrill wrote:
>
>
> On 11/21/2016 12:03 PM, Joel Sherrill wrote:
>>
>>
>> On 11/21/2016 10:52 AM, Craig Howland wrote:
>>>
>>> ...
>>
>> Hmm.. my C/C++ toolset has this in float.h which looks correct:
>>
>> /* Number of base-FLT_RADIX digits in the significand, p. */
>> #undef FLT_MANT_DIG
>> #undef DBL_MANT_DIG
>> #undef LDBL_MANT_DIG
>> #define FLT_MANT_DIG __FLT_MANT_DIG__
>> #define DBL_MANT_DIG __DBL_MANT_DIG__
>> #define LDBL_MANT_DIG __LDBL_MANT_DIG__
>>
>> I will ask the user what the one in their build tree looks like.
>> If that looks OK, maybe the source file that isn't compiling
>> isn't including float.h. The user report doesn't go back far enough
>> to have a file -- only errors in ieeefp.h.
>>
>> I have a thread to pull on. Thanks.
>
> And I have something more concrete. :)
>
> So far multiple RTEMS targets have built FORTRAN OK. But
> the i386 (which is the one the user was trying) fails
> with this:
>
> /home/joel/rtems-4.11-work/rtems-source-builder/rtems/build/i386-rtems4.12-gcc-6-20161110-newlib-2.4.0.20161025-x86_64-linux-gnu-1/gcc-6-20161110/newlib/libc/include/ieeefp.h:152:2:
> error: #error "double and long double are the same size but LDBL_EQ_DBL is not
> defined"
> #error "double and long double are the same size but LDBL_EQ_DBL is not defined"
> ^~~~~
>
> The versions of gcc and newlib are in this version string
> from sparc-rtems4.12-gcc:
>
> sparc-rtems4.12-gcc (GCC) 6.2.1 20161110 (RTEMS 4.12, RSB
> 1c68dbb293922863d5f48ec05559b0fc4b4ea893, Newlib 2.4.0.20161025)
>
> It is nice to see ieeefp.h being defensive. Is the bug
> in machine/ieeefp.h which should define this?
>
> Thanks again.
>
> --joel
>
No, LDBL_EQ_DBL is supposed to be defined by configure. That check is also
rigorous, not only requiring the mantissa length, but also the exponent range.
As a guess, one of the latter two is perhaps missing from your float.h.
#include <float.h>
#if DBL_MANT_DIG == LDBL_MANT_DIG && LDBL_MIN_EXP == DBL_MIN_EXP && \
LDBL_MAX_EXP == DBL_MAX_EXP
#define _LDBL_EQ_DBL
#else
#error "LDBL != DBL"
#endif
Craig
More information about the Newlib
mailing list