Ada bootstrap failure on ia64
Zack Weinberg
zack@codesourcery.com
Tue Oct 28 09:22:00 GMT 2003
Andreas Schwab <schwab@suse.de> writes:
> "Zack Weinberg" <zack@codesourcery.com> writes:
>
>> Could one of you please try to debug this problem further?
>
> I was able to bootstrap the ada compiler with this patch:
>
> --- ia64.h.~1.159.~ 2003-10-27 11:39:43.000000000 +0100
> +++ ia64.h 2003-10-27 22:40:28.000000000 +0100
> @@ -421,6 +421,9 @@ while (0)
> /* long double is XFmode normally, TFmode for HPUX. */
> #define LONG_DOUBLE_TYPE_SIZE (TARGET_HPUX ? 128 : 96)
>
> +/* long double is always stored as a 128 bit entity. */
> +#define WIDEST_HARDWARE_FP_SIZE 128
This is wrong. Actually, I think *all* definitions of
WIDEST_HARDWARE_FP_SIZE are wrong. The sole use is in ada/targtyps.c,
which uses it to implement get_target_long_double_size, which is used
exclusively to set the value of Standard_Long_Long_Float_Size in
ttypes.ads.
And Standard_Long_Long_Float is clearly intended to be the same as
long double; any deviation from long_double_type_size is incorrect.
It *appears* that the reason for this is that targtyps.c is or was
linked into gnatpsta -- this is yet another reason why gnatpsta is
broken and needs to be folded into gnat1. (To reiterate, the
values in package Standard are not written in stone, they can change
with compiler command line switches.)
> (insn 431 97 430 7 (set (subreg:DI (reg:XF f8) 8)
> (reg:DI r15)) 5 {*movdi_internal} (nil)
> (nil))
This insn should never have been generated. It is trying to store an
XFmode quantity in a pair of DImode registers, which is not allowed by
the back end. I do not know why gnat tried to do this in the first
place.
zw
More information about the Gcc
mailing list