ia64-linux bootstrap failure, long double string table breakage

Jim Wilson wilson@cygnus.com
Tue Nov 21 14:30:00 GMT 2000


I am getting comparison failures when trying to bootstrap on ia64-linux.

The problem is that my system compiler supports 64-bit long doubles, but
the current compiler supports 128-bit long doubles.  This itself should
not be a problem, but relatively new code in varasm.c in the struct
constant_descriptor aligns a field to a long double boundary.  Unfortunately,
code that creates these structures was not similarly modified.
record_constant creates these structures by calling obstack_grow, but there
is no code to emit padding.  So the data emitted by record_constant no
longer matches the struct constant_descriptor.  The result is that the
code that eliminates duplicate strings is now broken on targets where
long double requires greater alignment than pointers.

For targets where the size of long double has not changed, and the alignment
of long double is greater than the alignment of pointers, then the bootstrap
will complete, but we will get larger object files because duplicate strings
are no longer being eliminated.

For the few targets where the size of long double has changed, and the new
alignment is greater than the alignment of pointers, then we get a bootstrap
compare failure because the stage3 binaries have duplicate strings but the
stage2 binaries do not.

This was broken by this change:

2000-11-13  Richard Earnshaw  <rearnsha@arm.com>

	    * varasm.c (struct constant_descriptor): Put CONTENTS inside a
	    union to make it well-aligned.  Update all uses.

Jim


More information about the Gcc-bugs mailing list