From c515fb5148f1d81d5f7736825e14c7502c15432a Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 26 Nov 2012 16:42:38 -0800 Subject: [PATCH] Cast to __intptr_t before casting pointer to int64 --- ChangeLog | 17 +++++++++++++++++ elf/dl-load.c | 3 ++- include/libc-internal.h | 16 ++++++++++++++++ nptl/ChangeLog | 11 +++++++++++ nptl/sysdeps/i386/tls.h | 5 +++-- nptl/sysdeps/x86_64/tls.h | 5 +++-- nptl/unwind.c | 2 +- sysdeps/x86_64/bits/atomic.h | 21 ++++++++++++++------- 8 files changed, 67 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6b0d548..dfe6671 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2012-11-26 H.J. Lu + + * elf/dl-load.c (_dl_map_object_from_fd): Cast to uintptr_t + before casting to void *. + * include/libc-internal.h (__pointer_type): New macro. + (__integer_if_pointer_type_sub): Likewise. + (__integer_if_pointer_type): Likewise. + (cast_to_integer): Likewise. + * sysdeps/x86_64/bits/atomic.h: Include . + (__arch_c_compare_and_exchange_val_64_acq): Use cast_to_integer + before casting to atomic64_t. + (atomic_exchange_acq): Likewise. + (__arch_exchange_and_add_body): Likewise. + (__arch_add_body): Likewise. + (atomic_add_negative): Likewise. + (atomic_add_zero): Likewise. + 2012-11-26 Joseph Myers * sysdeps/generic/unwind-dw2-fde.c (get_pc_begin): New function. diff --git a/elf/dl-load.c b/elf/dl-load.c index a695556..70fe78f 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1351,7 +1351,8 @@ cannot allocate TLS data structures for initial thread"); && ((size_t) (c->mapend - c->mapstart + c->mapoff) >= header->e_phoff + header->e_phnum * sizeof (ElfW(Phdr)))) /* Found the program header in this segment. */ - l->l_phdr = (void *) (c->mapstart + header->e_phoff - c->mapoff); + l->l_phdr = (void *) (uintptr_t) (c->mapstart + header->e_phoff + - c->mapoff); if (c->allocend > c->dataend) { diff --git a/include/libc-internal.h b/include/libc-internal.h index e5fd533..0c0fa02 100644 --- a/include/libc-internal.h +++ b/include/libc-internal.h @@ -34,4 +34,20 @@ extern void __libc_thread_freeres (void); /* Define and initialize `__progname' et. al. */ extern void __init_misc (int, char **, char **); +/* 1 if 'type' is a pointer type, 0 otherwise. */ +# define __pointer_type(type) (__builtin_classify_type ((type) 0) == 5) + +/* __intptr_t if P is true, or T if P is false. */ +# define __integer_if_pointer_type_sub(T, P) \ + __typeof__ (*(0 ? (__typeof__ (0 ? (T *) 0 : (void *) (P))) 0 \ + : (__typeof__ (0 ? (__intptr_t *) 0 : (void *) (!(P)))) 0)) + +/* __intptr_t if EXPR has a pointer type, or the type of EXPR otherwise. */ +# define __integer_if_pointer_type(expr) \ + __integer_if_pointer_type_sub(__typeof__ ((__typeof__ (expr)) 0), \ + __pointer_type (__typeof__ (expr))) + +/* Cast an integer or a pointer VAL to integer with proper type. */ +# define cast_to_integer(val) ((__integer_if_pointer_type (val)) (val)) + #endif /* _LIBC_INTERNAL */ diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 7c8736c..a9b00e7 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,14 @@ +2012-11-26 H.J. Lu + + * unwind.c (__pthread_unwind): Pass address of unwind_cleanup + to THREAD_SETMEM. + * sysdeps/i386/tls.h: Include . + (THREAD_SETMEM): Use cast_to_integer before casting to uint64_t. + (THREAD_SETMEM_NC): Likewise. + * sysdeps/x86_64/tls.h: Include . + (THREAD_SETMEM): Use cast_to_integer before casting to uint64_t. + (THREAD_SETMEM_NC): Likewise. + 2012-11-21 Joseph Myers * sysdeps/unix/sysv/linux/sem_post.c (__old_sem_post): Cast result diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h index eb1ca31..90c7a53 100644 --- a/nptl/sysdeps/i386/tls.h +++ b/nptl/sysdeps/i386/tls.h @@ -26,6 +26,7 @@ # include # include # include +# include # include @@ -343,7 +344,7 @@ union user_desc_init \ asm volatile ("movl %%eax,%%gs:%P1\n\t" \ "movl %%edx,%%gs:%P2" : \ - : "A" ((uint64_t) (value)), \ + : "A" ((uint64_t) cast_to_integer (value)), \ "i" (offsetof (struct pthread, member)), \ "i" (offsetof (struct pthread, member) + 4)); \ }}) @@ -370,7 +371,7 @@ union user_desc_init \ asm volatile ("movl %%eax,%%gs:%P1(,%2,8)\n\t" \ "movl %%edx,%%gs:4+%P1(,%2,8)" : \ - : "A" ((uint64_t) (value)), \ + : "A" ((uint64_t) cast_to_integer (value)), \ "i" (offsetof (struct pthread, member)), \ "r" (idx)); \ }}) diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h index bc60a51..f3b7649 100644 --- a/nptl/sysdeps/x86_64/tls.h +++ b/nptl/sysdeps/x86_64/tls.h @@ -26,6 +26,7 @@ # include # include # include +# include # include /* Replacement type for __m128 since this file is included by ld.so, @@ -263,7 +264,7 @@ typedef struct abort (); \ \ asm volatile ("movq %q0,%%fs:%P1" : \ - : IMM_MODE ((uint64_t) (value)), \ + : IMM_MODE ((uint64_t) cast_to_integer (value)), \ "i" (offsetof (struct pthread, member))); \ }}) @@ -288,7 +289,7 @@ typedef struct abort (); \ \ asm volatile ("movq %q0,%%fs:%P1(,%q2,8)" : \ - : IMM_MODE ((uint64_t) (value)), \ + : IMM_MODE ((uint64_t) cast_to_integer (value)), \ "i" (offsetof (struct pthread, member[0])), \ "r" (idx)); \ }}) diff --git a/nptl/unwind.c b/nptl/unwind.c index 7ccb213..aedd037 100644 --- a/nptl/unwind.c +++ b/nptl/unwind.c @@ -124,7 +124,7 @@ __pthread_unwind (__pthread_unwind_buf_t *buf) /* This is not a catchable exception, so don't provide any details about the exception type. We do need to initialize the field though. */ THREAD_SETMEM (self, exc.exception_class, 0); - THREAD_SETMEM (self, exc.exception_cleanup, unwind_cleanup); + THREAD_SETMEM (self, exc.exception_cleanup, &unwind_cleanup); _Unwind_ForcedUnwind (&self->exc, unwind_stop, ibuf); #else diff --git a/sysdeps/x86_64/bits/atomic.h b/sysdeps/x86_64/bits/atomic.h index 100943f..552581c 100644 --- a/sysdeps/x86_64/bits/atomic.h +++ b/sysdeps/x86_64/bits/atomic.h @@ -18,6 +18,7 @@ #include #include /* For tcbhead_t. */ +#include typedef int8_t atomic8_t; @@ -101,8 +102,9 @@ typedef uintmax_t uatomic_max_t; "lock\n" \ "0:\tcmpxchgq %q2, %1" \ : "=a" (ret), "=m" (*mem) \ - : "q" ((atomic64_t) (newval)), "m" (*mem), \ - "0" ((atomic64_t) (oldval)), \ + : "q" ((atomic64_t) cast_to_integer (newval)), \ + "m" (*mem), \ + "0" ((atomic64_t) cast_to_integer (oldval)), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ ret; }) @@ -125,7 +127,8 @@ typedef uintmax_t uatomic_max_t; else \ __asm __volatile ("xchgq %q0, %1" \ : "=r" (result), "=m" (*mem) \ - : "0" ((atomic64_t) (newvalue)), "m" (*mem)); \ + : "0" ((atomic64_t) cast_to_integer (newvalue)), \ + "m" (*mem)); \ result; }) @@ -149,7 +152,8 @@ typedef uintmax_t uatomic_max_t; else \ __asm __volatile (lock "xaddq %q0, %1" \ : "=r" (result), "=m" (*mem) \ - : "0" ((atomic64_t) (value)), "m" (*mem), \ + : "0" ((atomic64_t) cast_to_integer (value)), \ + "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ result; }) @@ -187,7 +191,8 @@ typedef uintmax_t uatomic_max_t; else \ __asm __volatile (lock "addq %q1, %0" \ : "=m" (*mem) \ - : "ir" ((atomic64_t) (value)), "m" (*mem), \ + : "ir" ((atomic64_t) cast_to_integer (value)), \ + "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ } while (0) @@ -218,7 +223,8 @@ typedef uintmax_t uatomic_max_t; else \ __asm __volatile (LOCK_PREFIX "addq %q2, %0; sets %1" \ : "=m" (*mem), "=qm" (__result) \ - : "ir" ((atomic64_t) (value)), "m" (*mem)); \ + : "ir" ((atomic64_t) cast_to_integer (value)), \ + "m" (*mem)); \ __result; }) @@ -239,7 +245,8 @@ typedef uintmax_t uatomic_max_t; else \ __asm __volatile (LOCK_PREFIX "addq %q2, %0; setz %1" \ : "=m" (*mem), "=qm" (__result) \ - : "ir" ((atomic64_t) (value)), "m" (*mem)); \ + : "ir" ((atomic64_t) cast_to_integer (value)), \ + "m" (*mem)); \ __result; }) -- 2.7.4