On Tue, May 21, 2013 at 10:59 AM, Nicholas Clark <n...@ccl4.org> wrote:
> On Tue, May 21, 2013 at 06:40:17PM +0200, Vladimir Serbinenko wrote:
>> On 21.05.2013 18:33, Martin Jambor wrote:
>>
>> > Hi,
>> >
>> > On Tue, May 21, 2013 at 05:28:42PM +0200, Laurent GUERBY wrote:
>> >> Hi,
>> >>
>> >> For various reasons it is no longer possible for us to host and
>> >> maintain in running state the gcc6x machines.
>> >>
>> >
>> > oh no, those were basically the machines on which I debugged
>> > strict-alignment issues.
>>
>> gcc42 and gcc49 should be fine for this.
>
> It seems that mips is not as strict as sparc for alignment of long long.
> Despite mips gcc saying that __alignof__(long long) is 8, this code:
>
> #include <stdio.h>
> #include <inttypes.h>
>
> int main() {
>     uint32_t a[4] = { 0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F };
>     uint64_t b = *((unsigned long long *) (a + 1));
>     printf("Got %0llX\n", b);
>     return 0;
> }
>
>
> runs on gcc49, producing this output:
>
> Got 8090A0B04050607
>
>
> The same code compiled on gcc62 (a sparc) produces a bus error.
>
> Also, sparc gcc can generate code that use a single 8 byte memory load
> instruction to load two adjacent 4 byte values from a structure it knows to
> be 8 byte aligned. This will crash if calling code has cheated on structure
> alignment. I'm not aware of mips gcc doing this.
>
> Hence mips seems to be a less than ideal proxy for sparc for verifying that
> code is not making alignment mistakes.

gcc49 is using the o32 ABI, so you don't have native 64-bit types. I
imagine that long long is emulated on o32, so a 64-bit load is
actually 2x 32-bit loads.

I can try later on an n32 system (with 64-bit native integers). I
imagine it will fail there.

_______________________________________________
Gcc-cfarm-users mailing list
Gcc-cfarm-users@gna.org
https://mail.gna.org/listinfo/gcc-cfarm-users

Reply via email to