This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
> }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]