gcc version 4.0.1 20050727 (Red Hat 4.0.1-5) gcc version 4.0.2 GNU C version 4.1.0 20050927 (experimental) (alpha-unknown-linux-gnu)
All tested versions generate the same wrong code for the following testcase (EV4/EV5 only with -O2 optimization): #include <stdio.h> #include <stddef.h> typedef struct Foo { void *p1; long p2; void *p3; unsigned char p4; char p5[3]; } Foo; #ifdef __DECC #undef offsetof #define offsetof(TYPE, MEMBER) ((char *)(&(((TYPE *)0)-> MEMBER ))) #endif void foo(const char *fn) { Foo *p; p = (Foo *)(fn - offsetof(Foo, p5)); p->p4 = 1; } int main(int argc, char **argv) { Foo p; #if defined(__alpha__) && defined(__linux__) # include <asm/sysinfo.h> # include <asm/unistd.h> unsigned int buf[2] = { SSIN_UACPROC, UAC_SIGBUS | UAC_NOPRINT }; syscall(__NR_osf_setsysinfo, SSI_NVPAIRS, buf, 1, 0, 0, 0); #endif printf("Offset - %d\n", offsetof(Foo, p5)); foo(p.p5); } The assembler for the function "foo" is: .globl foo .ent foo $foo..ng: foo: .frame $30,0,$26,0 .prologue 0 ldah $2,256($31) ldl $1,-4($16) zapnot $1,247,$1 bis $1,$2,$2 stl $2,-4($16) ret $31,($26),1 .end foo The offset of "p5" member is 25 bytes, but compiler thinks that "p5" is aligned in "foo" function and issue "ldl" on unaligned address. DECC compiler generates "ldl $1, -1($16)" instruction. It might be not very good coding practice, but it taken from Mozilla source. Thank you. -- Summary: GCC 4.0/4.1 generates code that produces unaligned access exceptions Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: tsv at solvo dot ru GCC build triplet: alpha-*-linux-gnu GCC host triplet: alpha-*-linux-gnu GCC target triplet: alpha-*-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24178