gcc version 4.2.0 20060304 (experimental) [EMAIL PROTECTED]:/tmp% cat test.c void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n);
struct timeval { long tv_sec; }; struct outdata { char seq; struct timeval tv __attribute__((packed)); }; void send_probe(struct outdata *outdata, struct timeval *tp) { memcpy(&outdata->tv, tp, sizeof outdata->tv); } [EMAIL PROTECTED]:/tmp% gcc-3.4 -c -O3 test.c && objdump -dr test.o 0000000000000000 <send_probe>: 0: 00 00 51 a6 ldq a2,0(a1) 4: 08 00 10 2d ldq_u t7,8(a0) 8: 01 00 70 20 lda t2,1(a0) c: 01 00 f0 2c ldq_u t6,1(a0) 10: e5 0e 43 4a insqh a2,t2,t4 14: 64 07 43 4a insql a2,t2,t3 18: 46 0e 03 49 mskqh t7,t2,t5 1c: 40 06 e3 48 mskql t6,t2,v0 20: 01 04 c5 44 or t5,t4,t0 24: 08 00 30 3c stq_u t0,8(a0) 28: 02 04 04 44 or v0,t3,t1 2c: 01 00 50 3c stq_u t1,1(a0) 30: 01 80 fa 6b ret [EMAIL PROTECTED]:/tmp% gcc -c -O3 test.c && objdump -dr test.o 0000000000000000 <send_probe>: 0: 00 00 31 a4 ldq t0,0(a1) 4: 01 00 30 b4 stq t0,1(a0) 8: 01 80 fa 6b ret So 3.4 accounts for an unaligned access, but mainline doesn't. This has been broken since 4.0. Just reading outdata->tv.tv_sec works fine. -- Summary: Unaligned accesses with __attribute__(packed) and memcpy Product: gcc Version: 4.2.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: falk at debian dot org GCC build triplet: alphaev68-linux-gnu GCC host triplet: alphaev68-linux-gnu GCC target triplet: alphaev68-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26565