From owner-p4-projects@FreeBSD.ORG Tue Aug 15 20:38:47 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 622CC16A4EE; Tue, 15 Aug 2006 20:38:47 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2407916A4EC for ; Tue, 15 Aug 2006 20:38:47 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id C89C043D7C for ; Tue, 15 Aug 2006 20:38:37 +0000 (GMT) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k7FKcbjG054631 for ; Tue, 15 Aug 2006 20:38:37 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k7FKcbP0054628 for perforce@freebsd.org; Tue, 15 Aug 2006 20:38:37 GMT (envelope-from jb@freebsd.org) Date: Tue, 15 Aug 2006 20:38:37 GMT Message-Id: <200608152038.k7FKcbP0054628@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 104119 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Aug 2006 20:38:47 -0000 http://perforce.freebsd.org/chv.cgi?CH=104119 Change 104119 by jb@jb_freebsd2 on 2006/08/15 20:38:00 IFlibbsdelf Affected files ... .. //depot/projects/dtrace/src/lib/libelf/Makefile#6 integrate .. //depot/projects/dtrace/src/lib/libelf/elf_getarhdr.3#1 branch .. //depot/projects/dtrace/src/lib/libelf/elf_getarsym.3#1 branch .. //depot/projects/dtrace/src/lib/libelf/elf_next.c#5 integrate .. //depot/projects/dtrace/src/lib/libelf/libelf_convert.m4#5 integrate Differences ... ==== //depot/projects/dtrace/src/lib/libelf/Makefile#6 (text+ko) ==== @@ -59,6 +59,8 @@ elf_end.3 elf_errmsg.3 \ elf_fill.3 \ elf_flagdata.3 \ + elf_getarhdr.3 \ + elf_getarsym.3 \ elf_getbase.3 \ elf_getident.3 \ elf_hash.3 \ @@ -104,8 +106,6 @@ elf_flagdata.3 elf_flagphdr.3 \ elf_flagdata.3 elf_flagscn.3 \ elf_flagdata.3 elf_flagshdr.3 \ - elf.3 elf_getarhdr.3 \ - elf.3 elf_getarsym.3 \ elf.3 elf_getdata.3 \ elf.3 elf_getscn.3 \ elf.3 elf_ndxscn.3 \ ==== //depot/projects/dtrace/src/lib/libelf/elf_next.c#5 (text+ko) ==== ==== //depot/projects/dtrace/src/lib/libelf/libelf_convert.m4#5 (text+ko) ==== @@ -152,7 +152,7 @@ (X) = _t; \ } while (0) #define READ_WORD(P,X) do { \ - uint32_t _t; \ + uint16_t _t; \ unsigned char *const _q = (unsigned char *) &_t; \ const unsigned char *const _p = \ (const unsigned char *) (P); \ @@ -167,7 +167,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 { \ - uint64_t _t; \ + uint16_t _t; \ unsigned char *const _q = (unsigned char *) &_t; \ const unsigned char *const _p = \ (const unsigned char *) (P); \ @@ -188,7 +188,6 @@ #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) @@ -202,9 +201,16 @@ * 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 additinal complication is that `ar' only pads data + * byte order. An additional 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') @@ -251,20 +257,19 @@ static void libelf_cvt_$1$3_tof(char *dst, char *src, int count, int byteswap) { - Elf64_$2 t; + Elf64_$2 t, *s = (Elf64_$2 *) (uintptr_t) src; int c; if (dst == src && !byteswap) return; if (!byteswap) { - (void) memcpy(dst, src, count * sizeof(t)); + (void) memcpy(dst, src, count * sizeof(*s)); return; } for (c = 0; c < count; c++) { - memcpy(&t, src, sizeof(t)); - src += sizeof(t); + t = *s++; SWAP_$1$3(t); WRITE_$1$3(dst,t); } @@ -275,22 +280,21 @@ static void libelf_cvt_$1$3_tom(char *dst, char *src, int count, int byteswap) { - Elf64_$2 t; + Elf64_$2 t, *d = (Elf64_$2 *) (uintptr_t) dst; int c; if (dst == src && !byteswap) return; if (!byteswap) { - (void) memcpy(dst, src, count * sizeof(t)); + (void) memcpy(dst, src, count * sizeof(*d)); return; } for (c = 0; c < count; c++) { READ_$1$3(src,t); SWAP_$1$3(t); - memcpy(dst, &t, sizeof(t)); - dst += sizeof(t); + *d++ = t; } } ') @@ -366,12 +370,12 @@ static void libelf_cvt$3_$1_tof(char *dst, char *src, int count, int byteswap) { - Elf$3_$2 t; + Elf$3_$2 t, *s; int c; + s = (Elf$3_$2 *) (uintptr_t) src; for (c = 0; c < count; c++) { - memcpy(&t, src, sizeof(t)); - src += sizeof(t); + t = *s++; if (byteswap) { SWAP_STRUCT($2,$3) } @@ -385,22 +389,21 @@ static void libelf_cvt$3_$1_tom(char *dst, char *src, int count, int byteswap) { - Elf$3_$2 t; - unsigned char *s; - int i; + Elf$3_$2 t, *d; + unsigned char *s,*s0; 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; - for (i = 0; i < count; i++) { - s = (unsigned char *) src; + while (count--) { + s = s0; READ_STRUCT($2,$3) if (byteswap) { SWAP_STRUCT($2,$3) } - memcpy(dst, &t, sizeof(t)); - dst += sizeof(t); - src += fsz; + *d-- = t; s0 -= fsz; } } ')')