This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
ICE outputting unaligned fp constant on powerpc-apple-darwin5.1
- From: Geert bosch <bosch at gnat dot com>
- To: gcc at gcc dot gnu dot org
- Date: Thu, 29 Nov 2001 19:33:54 -0500
- Subject: ICE outputting unaligned fp constant on powerpc-apple-darwin5.1
Compiler bootstraps fine, but fails with the following test case:
> struct s {
> char c;
> double d;
> };
>
> struct s t [] = { { 0, 0.0 } };
It hits an ICE in assemble_real, at varasm.c:2169:
> if (align < GET_MODE_ALIGNMENT (mode))
> abort ();
According to comments in darwin.h, Darwin word-aligns FP doubles
but doubleword-aligns 64-bit ints and increases natural record
alignment to doubleword if the first field is an FP double while
the FP fields remain word aligned.
GET_MODE_ALIGNMENT is defined as below in rtl.c, and will cause
the mode alignment for doubles to be 64 bits, which is wrong.
I wonder how this is supposed to work and how this should be fixed.
Should I write a new get_darwin_mode_alignment that returns
32 for double and calls get_mode_alignment otherwise,
or am I completely wrong here?
-Geert
> /* Return the alignment of MODE. This will be bounded by 1 and
> BIGGEST_ALIGNMENT. */
>
> unsigned int
> get_mode_alignment (mode)
> enum machine_mode mode;
> {
> unsigned int alignment = GET_MODE_UNIT_SIZE (mode);
> /* Extract the LSB of the size. */
^^^ shouldn't this be MSB (most significant bit)?
> alignment = alignment & -alignment;
> alignment *= BITS_PER_UNIT;
>
> alignment = MIN (BIGGEST_ALIGNMENT, MAX (1, alignment));
> return alignment;
> }