diff mbox

[committed] Fix build failure with MPFR 2.4.x (gimple-ssa-sprintf.c)

Message ID 20170127082023.GQ1867@tucnak
State New
Headers show

Commit Message

Jakub Jelinek Jan. 27, 2017, 8:20 a.m. UTC
On Fri, Jan 27, 2017 at 08:41:59AM +0100, Rainer Orth wrote:
> > On 01/24/2017 02:37 AM, Markus Trippelsdorf wrote:
> >> MPFR_RNDx was introduced in MPFR 3.0.0. Since the minimal version that
> >> gcc checks for is 2.4.0, this leads to a build failure.
> >>
> >> The fix is straightforward.
> >>
> >> Tested on x86_64-pc-linux-gnu. Committed to trunk as obvious.
> >>
> >> 	* gimple-ssa-sprintf.c (format_floating): Change MPFR_RNDx to
> >> 	GMP_RNDx for compatibility.
> >
> > This was changed once before for this reason (in r240350).  I forgot
> > all about it and put it back in my latest patch for some reason.  I
> > don't remember why exactly but I suspect I might have been trying to
> > overcome some MPFR oddity.  It might help to #undef the MPFR_RNDx
> > macros after including <mpfr.h> to avoid this in the future.  In any
> > event, thanks for the fix.
> 
> we certainly should do something like this: your latest patch introduced
> the same failure again:
> 
> /vol/gcc/src/hg/trunk/local/gcc/gimple-ssa-sprintf.c: In function 'long long unsigned int {anonymous}::format_floating_max(tree, char, long long int)':
> /vol/gcc/src/hg/trunk/local/gcc/gimple-ssa-sprintf.c:1501:27: error: 'MPFR_RNDN' was not declared in this scope
>    mpfr_from_real (x, &rv, MPFR_RNDN);
>                            ^
> Makefile:1098: recipe for target 'gimple-ssa-sprintf.o' failed
> make[3]: *** [gimple-ssa-sprintf.o] Error 1

So what about poisoning MPFR_RND{N,D,Z,U} then?

With mpfr 3.1.5 it seems to work, both when using system gcc (6.3.1)
and when building in stage3.  I don't have mpfr 2.4.* around and apparently
it is incompatible with gmp 6.1.x, so I'd have to build both gmp and mpfr
(and likely mpc too).  Can you just quickly try this if it works for you?

Newer mpfr.h has:
typedef enum {
  MPFR_RNDN=0,  /* round to nearest, with ties to even */
  MPFR_RNDZ,    /* round toward zero */
  MPFR_RNDU,    /* round toward +Inf */
  MPFR_RNDD,    /* round toward -Inf */
  MPFR_RNDA,    /* round away from zero */
  MPFR_RNDF,    /* faithful rounding (not implemented yet) */
  MPFR_RNDNA=-1 /* round to nearest, with ties away from zero (mpfr_round) */
} mpfr_rnd_t;

/* kept for compatibility with MPFR 2.4.x and before */
#define GMP_RNDN MPFR_RNDN
#define GMP_RNDZ MPFR_RNDZ
#define GMP_RNDU MPFR_RNDU
#define GMP_RNDD MPFR_RNDD

so the question is if it will work with compilers that pretend to be GCC
(clang++, icc).  I've just tried it with both, clang++ 3.8.0 compiles it
fine (with noisy warnings about various non-issues), icpc 16.0.2 does error
out on a couple of unrelated things, but doesn't mention the *RND* stuff.
icpc claims to be GCC 6.3.1 (maybe it always pretends to be the same version
as system gcc?) and errors e.g. on:
../../gcc/hash-table.h(956): error: declaration is incompatible with function template "void hash_table<Descriptor, Allocator>::traverse_noresize<Argument,Callback>(Argument)" (declared at line 444)
  hash_table<Descriptor, Allocator>::traverse_noresize (Argument argument)
../../gcc/gimple.h(62): error: identifier "__builtin_FILE" is undefined
../../gcc/gimple.h(63): error: identifier "__builtin_LINE" is undefined
../../gcc/gimple.h(64): error: identifier "__builtin_FUNCTION" is undefined

2017-01-27  Jakub Jelinek  <jakub@redhat.com>

	* realmpfr.h: Poison MPFR_RND{N,Z,U,D}.
	* gimple-ssa-sprintf.c (format_floating_max): Use GMP_RNDN
	instead of MPFR_RNDN.



	Jakub

Comments

Rainer Orth Jan. 27, 2017, 10:14 a.m. UTC | #1
Hi Jakub,

> On Fri, Jan 27, 2017 at 08:41:59AM +0100, Rainer Orth wrote:
>> > On 01/24/2017 02:37 AM, Markus Trippelsdorf wrote:
>> >> MPFR_RNDx was introduced in MPFR 3.0.0. Since the minimal version that
>> >> gcc checks for is 2.4.0, this leads to a build failure.
>> >>
>> >> The fix is straightforward.
>> >>
>> >> Tested on x86_64-pc-linux-gnu. Committed to trunk as obvious.
>> >>
>> >> 	* gimple-ssa-sprintf.c (format_floating): Change MPFR_RNDx to
>> >> 	GMP_RNDx for compatibility.
>> >
>> > This was changed once before for this reason (in r240350).  I forgot
>> > all about it and put it back in my latest patch for some reason.  I
>> > don't remember why exactly but I suspect I might have been trying to
>> > overcome some MPFR oddity.  It might help to #undef the MPFR_RNDx
>> > macros after including <mpfr.h> to avoid this in the future.  In any
>> > event, thanks for the fix.
>> 
>> we certainly should do something like this: your latest patch introduced
>> the same failure again:
>> 
>> /vol/gcc/src/hg/trunk/local/gcc/gimple-ssa-sprintf.c: In function 'long long unsigned int {anonymous}::format_floating_max(tree, char, long long int)':
>> /vol/gcc/src/hg/trunk/local/gcc/gimple-ssa-sprintf.c:1501:27: error: 'MPFR_RNDN' was not declared in this scope
>>    mpfr_from_real (x, &rv, MPFR_RNDN);
>>                            ^
>> Makefile:1098: recipe for target 'gimple-ssa-sprintf.o' failed
>> make[3]: *** [gimple-ssa-sprintf.o] Error 1
>
> So what about poisoning MPFR_RND{N,D,Z,U} then?
>
> With mpfr 3.1.5 it seems to work, both when using system gcc (6.3.1)
> and when building in stage3.  I don't have mpfr 2.4.* around and apparently
> it is incompatible with gmp 6.1.x, so I'd have to build both gmp and mpfr
> (and likely mpc too).  Can you just quickly try this if it works for you?

sure: just tried a sparc-sun-solaris2.12 bootstrap with gcc 4.9 and mpfr
2.4.2-p3.  Successfully built the stage1 and stage2 compilers.

	Rainer
Richard Biener Jan. 27, 2017, 10:15 a.m. UTC | #2
On Fri, 27 Jan 2017, Jakub Jelinek wrote:

> On Fri, Jan 27, 2017 at 08:41:59AM +0100, Rainer Orth wrote:
> > > On 01/24/2017 02:37 AM, Markus Trippelsdorf wrote:
> > >> MPFR_RNDx was introduced in MPFR 3.0.0. Since the minimal version that
> > >> gcc checks for is 2.4.0, this leads to a build failure.
> > >>
> > >> The fix is straightforward.
> > >>
> > >> Tested on x86_64-pc-linux-gnu. Committed to trunk as obvious.
> > >>
> > >> 	* gimple-ssa-sprintf.c (format_floating): Change MPFR_RNDx to
> > >> 	GMP_RNDx for compatibility.
> > >
> > > This was changed once before for this reason (in r240350).  I forgot
> > > all about it and put it back in my latest patch for some reason.  I
> > > don't remember why exactly but I suspect I might have been trying to
> > > overcome some MPFR oddity.  It might help to #undef the MPFR_RNDx
> > > macros after including <mpfr.h> to avoid this in the future.  In any
> > > event, thanks for the fix.
> > 
> > we certainly should do something like this: your latest patch introduced
> > the same failure again:
> > 
> > /vol/gcc/src/hg/trunk/local/gcc/gimple-ssa-sprintf.c: In function 'long long unsigned int {anonymous}::format_floating_max(tree, char, long long int)':
> > /vol/gcc/src/hg/trunk/local/gcc/gimple-ssa-sprintf.c:1501:27: error: 'MPFR_RNDN' was not declared in this scope
> >    mpfr_from_real (x, &rv, MPFR_RNDN);
> >                            ^
> > Makefile:1098: recipe for target 'gimple-ssa-sprintf.o' failed
> > make[3]: *** [gimple-ssa-sprintf.o] Error 1
> 
> So what about poisoning MPFR_RND{N,D,Z,U} then?

Works for me.

Richard.

> With mpfr 3.1.5 it seems to work, both when using system gcc (6.3.1)
> and when building in stage3.  I don't have mpfr 2.4.* around and apparently
> it is incompatible with gmp 6.1.x, so I'd have to build both gmp and mpfr
> (and likely mpc too).  Can you just quickly try this if it works for you?
> 
> Newer mpfr.h has:
> typedef enum {
>   MPFR_RNDN=0,  /* round to nearest, with ties to even */
>   MPFR_RNDZ,    /* round toward zero */
>   MPFR_RNDU,    /* round toward +Inf */
>   MPFR_RNDD,    /* round toward -Inf */
>   MPFR_RNDA,    /* round away from zero */
>   MPFR_RNDF,    /* faithful rounding (not implemented yet) */
>   MPFR_RNDNA=-1 /* round to nearest, with ties away from zero (mpfr_round) */
> } mpfr_rnd_t;
> 
> /* kept for compatibility with MPFR 2.4.x and before */
> #define GMP_RNDN MPFR_RNDN
> #define GMP_RNDZ MPFR_RNDZ
> #define GMP_RNDU MPFR_RNDU
> #define GMP_RNDD MPFR_RNDD
> 
> so the question is if it will work with compilers that pretend to be GCC
> (clang++, icc).  I've just tried it with both, clang++ 3.8.0 compiles it
> fine (with noisy warnings about various non-issues), icpc 16.0.2 does error
> out on a couple of unrelated things, but doesn't mention the *RND* stuff.
> icpc claims to be GCC 6.3.1 (maybe it always pretends to be the same version
> as system gcc?) and errors e.g. on:
> ../../gcc/hash-table.h(956): error: declaration is incompatible with function template "void hash_table<Descriptor, Allocator>::traverse_noresize<Argument,Callback>(Argument)" (declared at line 444)
>   hash_table<Descriptor, Allocator>::traverse_noresize (Argument argument)
> ../../gcc/gimple.h(62): error: identifier "__builtin_FILE" is undefined
> ../../gcc/gimple.h(63): error: identifier "__builtin_LINE" is undefined
> ../../gcc/gimple.h(64): error: identifier "__builtin_FUNCTION" is undefined
> 
> 2017-01-27  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* realmpfr.h: Poison MPFR_RND{N,Z,U,D}.
> 	* gimple-ssa-sprintf.c (format_floating_max): Use GMP_RNDN
> 	instead of MPFR_RNDN.
> 
> --- gcc/realmpfr.h.jj	2017-01-01 12:45:39.000000000 +0100
> +++ gcc/realmpfr.h	2017-01-27 09:04:56.082042138 +0100
> @@ -32,5 +32,10 @@ extern void real_from_mpfr (REAL_VALUE_T
>  			    const real_format *, mp_rnd_t);
>  extern void mpfr_from_real (mpfr_ptr, const REAL_VALUE_TYPE *, mp_rnd_t);
>  
> -#endif /* ! GCC_REALGMP_H */
> +#if (GCC_VERSION >= 3000)
> +  /* For compatibility with mpfr 2.4 and earlier, we want to only use
> +     GMP_RND*.  */
> +  #pragma GCC poison MPFR_RNDN MPFR_RNDZ MPFR_RNDU MPFR_RNDD
> +#endif
>  
> +#endif /* ! GCC_REALGMP_H */
> --- gcc/gimple-ssa-sprintf.c.jj	2017-01-27 08:49:03.000000000 +0100
> +++ gcc/gimple-ssa-sprintf.c	2017-01-27 08:53:52.911721864 +0100
> @@ -1498,7 +1498,7 @@ format_floating_max (tree type, char spe
>       round-to-nearest mode.  */
>    mpfr_t x;
>    mpfr_init2 (x, rfmt->p);
> -  mpfr_from_real (x, &rv, MPFR_RNDN);
> +  mpfr_from_real (x, &rv, GMP_RNDN);
>  
>    /* Return a value one greater to account for the leading minus sign.  */
>    return 1 + get_mpfr_format_length (x, "", prec, spec, 'D');
> 
> 
> 	Jakub
> 
>
diff mbox

Patch

--- gcc/realmpfr.h.jj	2017-01-01 12:45:39.000000000 +0100
+++ gcc/realmpfr.h	2017-01-27 09:04:56.082042138 +0100
@@ -32,5 +32,10 @@  extern void real_from_mpfr (REAL_VALUE_T
 			    const real_format *, mp_rnd_t);
 extern void mpfr_from_real (mpfr_ptr, const REAL_VALUE_TYPE *, mp_rnd_t);
 
-#endif /* ! GCC_REALGMP_H */
+#if (GCC_VERSION >= 3000)
+  /* For compatibility with mpfr 2.4 and earlier, we want to only use
+     GMP_RND*.  */
+  #pragma GCC poison MPFR_RNDN MPFR_RNDZ MPFR_RNDU MPFR_RNDD
+#endif
 
+#endif /* ! GCC_REALGMP_H */
--- gcc/gimple-ssa-sprintf.c.jj	2017-01-27 08:49:03.000000000 +0100
+++ gcc/gimple-ssa-sprintf.c	2017-01-27 08:53:52.911721864 +0100
@@ -1498,7 +1498,7 @@  format_floating_max (tree type, char spe
      round-to-nearest mode.  */
   mpfr_t x;
   mpfr_init2 (x, rfmt->p);
-  mpfr_from_real (x, &rv, MPFR_RNDN);
+  mpfr_from_real (x, &rv, GMP_RNDN);
 
   /* Return a value one greater to account for the leading minus sign.  */
   return 1 + get_mpfr_format_length (x, "", prec, spec, 'D');