This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch hjl/pointer created. glibc-2.16-ports-merge-772-g6a77943
- From: hjl at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 26 Nov 2012 18:17:23 -0000
- Subject: GNU C Library master sources branch hjl/pointer created. glibc-2.16-ports-merge-772-g6a77943
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, hjl/pointer has been created
at 6a77943153843e1dc8ab8642085344f199ed40e0 (commit)
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=6a77943153843e1dc8ab8642085344f199ed40e0
commit 6a77943153843e1dc8ab8642085344f199ed40e0
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Mon Nov 26 10:16:29 2012 -0800
Cast to int32 first when casting pointer to int64
diff --git a/ChangeLog.hjl b/ChangeLog.hjl
new file mode 100644
index 0000000..430ac65
--- /dev/null
+++ b/ChangeLog.hjl
@@ -0,0 +1,27 @@
+2012-11-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * elf/dl-load.c (_dl_map_object_from_fd): Cast to uintptr_t
+ before casting to void *.
+ * include/sys/cdefs.h (__pointer_type): New macro.
+ (__real_type_sub): Likewise.
+ (__real_type): Likewise.
+ * sysdeps/x86_64/bits/atomic.h
+ (__arch_c_compare_and_exchange_val_64_acq): Cast to __real_type
+ 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.
+
+nptl/
+
+2012-11-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * unwind.c (__pthread_unwind): Pass address of unwind_cleanup
+ to THREAD_SETMEM.
+ * sysdeps/i386/tls.h (THREAD_SETMEM): Cast to __real_type before
+ casting to uint64_t.
+ (THREAD_SETMEM_NC): Likewise.
+ * sysdeps/x86_64/tls.h (THREAD_SETMEM): Likewise.
+ (THREAD_SETMEM_NC): Likewise.
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/sys/cdefs.h b/include/sys/cdefs.h
index 71baa1a..6685fbf 100644
--- a/include/sys/cdefs.h
+++ b/include/sys/cdefs.h
@@ -18,3 +18,16 @@ rtld_hidden_proto (__chk_fail)
#endif
#endif
+
+/* 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)))
diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h
index eb1ca31..98bafdb 100644
--- a/nptl/sysdeps/i386/tls.h
+++ b/nptl/sysdeps/i386/tls.h
@@ -343,7 +343,7 @@ union user_desc_init
\
asm volatile ("movl %%eax,%%gs:%P1\n\t" \
"movl %%edx,%%gs:%P2" : \
- : "A" ((uint64_t) (value)), \
+ : "A" ((uint64_t) (__integer_if_pointer_type (value)) (value)),\
"i" (offsetof (struct pthread, member)), \
"i" (offsetof (struct pthread, member) + 4)); \
}})
@@ -370,7 +370,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) (__integer_if_pointer_type (value)) (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..23675b3 100644
--- a/nptl/sysdeps/x86_64/tls.h
+++ b/nptl/sysdeps/x86_64/tls.h
@@ -263,7 +263,7 @@ typedef struct
abort (); \
\
asm volatile ("movq %q0,%%fs:%P1" : \
- : IMM_MODE ((uint64_t) (value)), \
+ : IMM_MODE ((uint64_t) (__integer_if_pointer_type (value)) (value)),\
"i" (offsetof (struct pthread, member))); \
}})
@@ -288,7 +288,7 @@ typedef struct
abort (); \
\
asm volatile ("movq %q0,%%fs:%P1(,%q2,8)" : \
- : IMM_MODE ((uint64_t) (value)), \
+ : IMM_MODE ((uint64_t) (__integer_if_pointer_type (value)) (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..4c7efd8 100644
--- a/sysdeps/x86_64/bits/atomic.h
+++ b/sysdeps/x86_64/bits/atomic.h
@@ -101,8 +101,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) (__integer_if_pointer_type (newval)) (newval)),\
+ "m" (*mem), \
+ "0" ((atomic64_t) (__integer_if_pointer_type (oldval)) (oldval)),\
"i" (offsetof (tcbhead_t, multiple_threads))); \
ret; })
@@ -125,7 +126,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) (__integer_if_pointer_type (newvalue)) (newvalue)),\
+ "m" (*mem)); \
result; })
@@ -149,7 +151,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) (__integer_if_pointer_type (value)) (value)),\
+ "m" (*mem), \
"i" (offsetof (tcbhead_t, multiple_threads))); \
result; })
@@ -187,7 +190,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) (__integer_if_pointer_type (value)) (value)),\
+ "m" (*mem), \
"i" (offsetof (tcbhead_t, multiple_threads))); \
} while (0)
@@ -218,7 +222,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) (__integer_if_pointer_type (value)) (value)),\
+ "m" (*mem)); \
__result; })
@@ -239,7 +244,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) (__integer_if_pointer_type (value)) (value)),\
+ "m" (*mem)); \
__result; })
-----------------------------------------------------------------------
hooks/post-receive
--
GNU C Library master sources