summaryrefslogtreecommitdiff
path: root/lib/builtins/emutls.c
diff options
context:
space:
mode:
authorChih-Hung Hsieh <chh@google.com>2016-02-04 20:26:00 +0000
committerChih-Hung Hsieh <chh@google.com>2016-02-04 20:26:00 +0000
commitd0341750d01d7d7519b03484e38495603e091957 (patch)
tree47fde93d4330a251ad9e98aa924fd5b0c77ea764 /lib/builtins/emutls.c
parent23ef7905ff3f4f3183b342fc3a5eb28639215a63 (diff)
builtins: Fix struct __emutls_control to match GCC
The type of size and align in struct __emutls_control must be typedef unsigned int gcc_word __attribute__((mode(word))); to match GCC. When gcc_word is larger than size_t, which is the case for x32, the upper extra bits are all zeros. We can use variables of size_t to operate on size and align. Fix one trivial C99 warning about mixed declaration and code. Differential Revision: http://reviews.llvm.org/D16886 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@259824 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/builtins/emutls.c')
-rw-r--r--lib/builtins/emutls.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/builtins/emutls.c b/lib/builtins/emutls.c
index 09e79568b..8d9d64f56 100644
--- a/lib/builtins/emutls.c
+++ b/lib/builtins/emutls.c
@@ -27,9 +27,14 @@
* If xyz has non-zero initial value, __emutls_v.xyz's "value"
* will point to __emutls_t.xyz, which has the initial value.
*/
+typedef unsigned int gcc_word __attribute__((mode(word)));
typedef struct __emutls_control {
- size_t size; /* size of the object in bytes */
- size_t align; /* alignment of the object in bytes */
+ /* Must use gcc_word here, instead of size_t, to match GCC. When
+ gcc_word is larger than size_t, the upper extra bits are all
+ zeros. We can use variables of size_t to operate on size and
+ align. */
+ gcc_word size; /* size of the object in bytes */
+ gcc_word align; /* alignment of the object in bytes */
union {
uintptr_t index; /* data[index-1] is the object address */
void* address; /* object address, when in single thread env */
@@ -67,21 +72,20 @@ static __inline void emutls_memalign_free(void *base) {
/* Emulated TLS objects are always allocated at run-time. */
static __inline void *emutls_allocate_object(__emutls_control *control) {
/* Use standard C types, check with gcc's emutls.o. */
- typedef unsigned int gcc_word __attribute__((mode(word)));
typedef unsigned int gcc_pointer __attribute__((mode(pointer)));
- COMPILE_TIME_ASSERT(sizeof(size_t) == sizeof(gcc_word));
COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(gcc_pointer));
COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(void*));
size_t size = control->size;
size_t align = control->align;
+ void* base;
if (align < sizeof(void*))
align = sizeof(void*);
/* Make sure that align is power of 2. */
if ((align & (align - 1)) != 0)
abort();
- void* base = emutls_memalign_alloc(align, size);
+ base = emutls_memalign_alloc(align, size);
if (control->value)
memcpy(base, control->value, size);
else