I committed the patch below to clean up the "mess."
Thanks
Martin
Index: gcc/gimple-ssa-sprintf.c
===================================================================
--- gcc/gimple-ssa-sprintf.c (revision 244957)
+++ gcc/gimple-ssa-sprintf.c (working copy)
@@ -1686,20 +1686,10 @@ format_floating (const directive &dir, tree arg)
prec[0] = -1;
if (prec[1] < 0)
{
-#ifdef HAVE_XFmode
- /* When L is specified use long double, otherwise double. */
- unsigned fmtprec
- = (dir.modifier == FMT_LEN_L
- ? REAL_MODE_FORMAT (XFmode)->p
- : REAL_MODE_FORMAT (DFmode)->p);
-#elif defined HAVE_DFmode
- /* No long double support, use double precision for both. */
- unsigned fmtprec = REAL_MODE_FORMAT (DFmode)->p;
-#else
- /* No long double or double support. */
- unsigned fmtprec = 0;
-#endif
- /* The precision of the IEEE 754 double format is 53.
+ unsigned fmtprec
+ = REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (arg)))->p;
+
+ /* The precision of the IEEE 754 double format is 53.
The precision of all other GCC binary double formats
is 56 or less. */
prec[1] = fmtprec <= 56 ? 13 : 15;
Thanks
Martin
On 01/26/2017 06:12 PM, Andrew Pinski wrote:
On Thu, Jan 26, 2017 at 3:17 PM, Martin Sebor <mse...@gmail.com> wrote:
Hi,
With this patch all my builds for aarch64/arm failed:
/gcc/gimple-ssa-sprintf.c: In function
‘<unnamed>::fmtresult<unnamed>::format_floating(const<unnamed>::direc
tive&, tree_node*)’:
/gcc/gimple-ssa-sprintf.c:1643: error: ‘XFmode’ was not declared in this
scope
Is this fixed later in the series?
It isn't. I just reproduced it with an aarch64 cross-compiler so
I hope to be able to fix it quickly.
This actually broke any non-x86 targeted GCC.
Even the current code is wrong:
#ifdef HAVE_XFmode
/* When L is specified use long double, otherwise double. */
unsigned fmtprec
= (dir.modifier == FMT_LEN_L
? REAL_MODE_FORMAT (XFmode)->p
: REAL_MODE_FORMAT (DFmode)->p);
#elif defined HAVE_DFmode
/* No long double support, use double precision for both. */
unsigned fmtprec = REAL_MODE_FORMAT (DFmode)->p;
#else
/* No long double or double support. */
unsigned fmtprec = 0;
#endif
Shouldn't this be based instead on long_double_type_node instead?
Because different targets might have an option to select different
modes.
So it just becomes something like which simplifies the mess you have currently:
/* When L is specified use long double, otherwise double. */
unsigned fmtprec
= (dir.modifier == FMT_LEN_L
? REAL_MODE_FORMAT (TYPE_MODE (long_double_type_node))->p
: REAL_MODE_FORMAT (TYPE_MODE ((double_type_node))->p);
Thanks,
Andrew
Martin