[head tinderbox] failure on arm/arm
Joseph Koshy
joseph.koshy at gmail.com
Sun Nov 12 08:00:02 PST 2006
ru> Still doesn't make much sense to me. If all structure
ru> members are chars (like is the case with "struct ar_hdr"
ru> from <ar.h> which GCC complains about, and in my example,
ru> the required alignment shouldn't be more than sizeof(char).
ru> What am I missing?
gk> You are missing that inside bubu() the compiler
gk> 'believes' that:
gk> * The `s' pointer is (char *)-aligned.
gk> * The sizeof(struct foo) is >1.
gk> * You are trying to assign `s' (with it's possibly
gk> misaligned value) to the `return value' place,
gk> whose type is (at least, as far as the compiler
gk> knows) is (struct foo *).
gk> That may break alignment assumptions the compiler is making
gk> inside bubu(), especially about the `s' pointer, hence the
gk> warning.
The following program prints `1' on the AMD64, i386 and on
sparc64.
----- SNIP ----
#include <stdio.h>
struct foo {
char x;
};
int
main(int c, char **v)
{
printf("align=%d\n", __alignof__(struct foo));
}
---- SNIP ---
I don't have a way of running ARM binaries, but
disassembly of the binary shows:
00000000 <main>:
... snip ...
20: e59f0010 ldr r0, [pc, #16] ; 38 <.text+0x38>
24: e3a01004 mov r1, #4 ; 0x4
28: ebfffffe bl 28 <main+0x28>
2c: e1a00003 mov r0, r3
... snip ...
If I am reading the assembly correctly, GCC thinks that
the alignment for struct foo is '4'. However, changing
the program print `__alignof__(foo.x)' results in a value
of `1' being loaded into R1.
And then `sizeof (struct foo)` appears to be 4 with GCC/arm
and 1 on the other architectures.
GCC/arm also thinks that the alignment requirement for
`char a[1]' is `4', even though `sizeof(char a[1])`
remains at 1.
This doesn't make sense at many levels.
--
FreeBSD Volunteer, http://people.freebsd.org/~jkoshy/
More information about the freebsd-current
mailing list