Date: Wed, 16 Aug 2006 01:31:17 GMT From: John Birrell <jb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 104167 for review Message-ID: <200608160131.k7G1VHNC094569@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=104167 Change 104167 by jb@jb_freebsd2 on 2006/08/16 01:30:34 Revert back to using my memcpy version of this file which works on sun4v. Revision 5 certainly stopped the compiler warnings about alignment, but the compiler was doing the right thing. Adding another cast to avoid the warning just masked the problem. Affected files ... .. //depot/projects/dtrace/src/lib/libelf/libelf_convert.m4#6 edit Differences ... ==== //depot/projects/dtrace/src/lib/libelf/libelf_convert.m4#6 (text+ko) ==== @@ -1,3 +1,4 @@ +//depot/projects/dtrace/src/lib/libelf/libelf_convert.m4#4 - edit change 103978 (text+ko) /*- * Copyright (c) 2006 Joseph Koshy * All rights reserved. @@ -152,7 +153,7 @@ (X) = _t; \ } while (0) #define READ_WORD(P,X) do { \ - uint16_t _t; \ + uint32_t _t; \ unsigned char *const _q = (unsigned char *) &_t; \ const unsigned char *const _p = \ (const unsigned char *) (P); \ @@ -167,7 +168,7 @@ #define READ_OFF32(P,X) READ_WORD(P,X) #define READ_SWORD(P,X) READ_WORD(P,X) #define READ_WORD64(P,X) do { \ - uint16_t _t; \ + uint64_t _t; \ unsigned char *const _q = (unsigned char *) &_t; \ const unsigned char *const _p = \ (const unsigned char *) (P); \ @@ -188,6 +189,7 @@ #define READ_XWORD(P,X) READ_WORD64(P,X) #define READ_IDENT(P,X) do { \ (void) memcpy((X), (P), sizeof((X))); \ + (P) = (P) + sizeof((X)); \ } while (0) divert(-1) @@ -201,16 +203,9 @@ * casting to work as expected. On the other hand the `file' * representation of an ELF data structure could be packed tighter * than its `in-memory' representation, and could be of a differing - * byte order. An additional complication is that `ar' only pads data + * byte order. An additinal complication is that `ar' only pads data * to even addresses and so ELF archive member data being read from * inside an `ar' archive could end up at misaligned memory addresses. - * - * Consequently, casting the `char *' pointers that point to memory - * representations (i.e., source pointers for the *_tof() functions - * and the destination pointers for the *_tom() functions), is safe, - * as these pointers should be correctly aligned for the memory type - * already. However, pointers to file representations have to be - * treated as being potentially unaligned and no casting can be done. */ include(SRCDIR`/elf_types.m4') @@ -257,19 +252,20 @@ static void libelf_cvt_$1$3_tof(char *dst, char *src, int count, int byteswap) { - Elf64_$2 t, *s = (Elf64_$2 *) (uintptr_t) src; + Elf64_$2 t; int c; if (dst == src && !byteswap) return; if (!byteswap) { - (void) memcpy(dst, src, count * sizeof(*s)); + (void) memcpy(dst, src, count * sizeof(t)); return; } for (c = 0; c < count; c++) { - t = *s++; + memcpy(&t, src, sizeof(t)); + src += sizeof(t); SWAP_$1$3(t); WRITE_$1$3(dst,t); } @@ -280,21 +276,22 @@ static void libelf_cvt_$1$3_tom(char *dst, char *src, int count, int byteswap) { - Elf64_$2 t, *d = (Elf64_$2 *) (uintptr_t) dst; + Elf64_$2 t; int c; if (dst == src && !byteswap) return; if (!byteswap) { - (void) memcpy(dst, src, count * sizeof(*d)); + (void) memcpy(dst, src, count * sizeof(t)); return; } for (c = 0; c < count; c++) { READ_$1$3(src,t); SWAP_$1$3(t); - *d++ = t; + memcpy(dst, &t, sizeof(t)); + dst += sizeof(t); } } ') @@ -370,12 +367,12 @@ static void libelf_cvt$3_$1_tof(char *dst, char *src, int count, int byteswap) { - Elf$3_$2 t, *s; + Elf$3_$2 t; int c; - s = (Elf$3_$2 *) (uintptr_t) src; for (c = 0; c < count; c++) { - t = *s++; + memcpy(&t, src, sizeof(t)); + src += sizeof(t); if (byteswap) { SWAP_STRUCT($2,$3) } @@ -389,21 +386,22 @@ static void libelf_cvt$3_$1_tom(char *dst, char *src, int count, int byteswap) { - Elf$3_$2 t, *d; - unsigned char *s,*s0; + Elf$3_$2 t; + unsigned char *s; + int i; size_t fsz; fsz = elf$3_fsize(ELF_T_$1, 1, EV_CURRENT); - d = ((Elf$3_$2 *) (uintptr_t) dst) + (count - 1); - s0 = (unsigned char *) src + (count - 1) * fsz; - while (count--) { - s = s0; + for (i = 0; i < count; i++) { + s = (unsigned char *) src; READ_STRUCT($2,$3) if (byteswap) { SWAP_STRUCT($2,$3) } - *d-- = t; s0 -= fsz; + memcpy(dst, &t, sizeof(t)); + dst += sizeof(t); + src += fsz; } } ')')
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608160131.k7G1VHNC094569>