diff options
Diffstat (limited to 'csu')
-rw-r--r-- | csu/Versions | 4 | ||||
-rw-r--r-- | csu/libc-start.c | 17 | ||||
-rw-r--r-- | csu/libc-tls.c | 58 | ||||
-rw-r--r-- | csu/tst-atomic.c | 113 | ||||
-rw-r--r-- | csu/version.c | 7 |
5 files changed, 57 insertions, 142 deletions
diff --git a/csu/Versions b/csu/Versions index f0b4f00549..a1321a9df8 100644 --- a/csu/Versions +++ b/csu/Versions @@ -5,7 +5,7 @@ libc { # helper functions __libc_init_first; __libc_start_main; -%if !HAVE___THREAD +%if !(USE_TLS && HAVE___THREAD) # global variables _errno; @@ -18,7 +18,7 @@ libc { gnu_get_libc_release; gnu_get_libc_version; } GLIBC_PRIVATE { -%if HAVE___THREAD +%if USE_TLS && HAVE___THREAD # This version is for the TLS symbol, GLIBC_2.0 is the old object symbol. errno; %endif diff --git a/csu/libc-start.c b/csu/libc-start.c index 634844759d..194db6b1ec 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1998-2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -30,7 +30,11 @@ extern int __libc_multiple_libcs; #include <tls.h> #ifndef SHARED # include <dl-osinfo.h> -extern void __pthread_initialize_minimal (void); +extern void __pthread_initialize_minimal (void) +# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP + __attribute__ ((weak)) +# endif + ; # ifndef THREAD_SET_STACK_GUARD /* Only exported for architectures that don't store the stack guard canary in thread local area. */ @@ -136,8 +140,13 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), /* Initialize the thread library at least a bit since the libgcc functions are using thread functions if these are available and - we need to setup errno. */ - __pthread_initialize_minimal (); + we need to setup errno. If there is no thread library and we + handle TLS the function is defined in the libc to initialized the + TLS handling. */ +# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP + if (__pthread_initialize_minimal) +# endif + __pthread_initialize_minimal (); #endif # ifndef SHARED diff --git a/csu/libc-tls.c b/csu/libc-tls.c index 0d240ccef9..3544e396da 100644 --- a/csu/libc-tls.c +++ b/csu/libc-tls.c @@ -1,5 +1,5 @@ /* Initialization code for TLS in statically linked application. - Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -29,6 +29,7 @@ #error makefile bug, this file is for static only #endif +#ifdef USE_TLS extern ElfW(Phdr) *_dl_phdr; extern size_t _dl_phnum; @@ -142,19 +143,19 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) The initialized value of _dl_tls_static_size is provided by dl-open.c to request some surplus that permits dynamic loading of modules with IE-model TLS. */ -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign); tlsblock = __sbrk (tcb_offset + tcbsize + max_align); -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP tcb_offset = roundup (tcbsize, align ?: 1); tlsblock = __sbrk (tcb_offset + memsz + max_align + TLS_PRE_TCB_SIZE + GL(dl_tls_static_size)); tlsblock += TLS_PRE_TCB_SIZE; -#else +# else /* In case a model with a different layout for the TCB and DTV is defined add another #elif here and in the following #ifs. */ -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif /* Align the TLS block. */ tlsblock = (void *) (((uintptr_t) tlsblock + max_align - 1) @@ -165,16 +166,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) // static_dtv[1].counter = 0; would be needed if not already done /* Initialize the TLS block. */ -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP static_dtv[2].pointer.val = ((char *) tlsblock + tcb_offset - roundup (memsz, align ?: 1)); static_map.l_tls_offset = roundup (memsz, align ?: 1); -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP static_dtv[2].pointer.val = (char *) tlsblock + tcb_offset; static_map.l_tls_offset = tcb_offset; -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif static_dtv[2].pointer.is_static = true; /* sbrk gives us zero'd memory, so we don't need to clear the remainder. */ memcpy (static_dtv[2].pointer.val, initimage, filesz); @@ -182,16 +183,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) /* Install the pointer to the dtv. */ /* Initialize the thread pointer. */ -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP INSTALL_DTV ((char *) tlsblock + tcb_offset, static_dtv); const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset, 0); -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP INSTALL_DTV (tlsblock, static_dtv); const char *lossage = TLS_INIT_TP (tlsblock, 0); -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif if (__builtin_expect (lossage != NULL, 0)) __libc_fatal (lossage); @@ -211,11 +212,11 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) memsz = roundup (memsz, align ?: 1); -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP memsz += tcbsize; -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP memsz += tcb_offset; -#endif +# endif init_static_tls (memsz, MAX (TLS_TCB_ALIGN, max_align)); } @@ -229,11 +230,11 @@ _dl_tls_setup (void) { init_slotinfo (); init_static_tls ( -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP TLS_TCB_SIZE, -#else +# else 0, -#endif +# endif TLS_TCB_ALIGN); return 0; } @@ -247,3 +248,16 @@ __pthread_initialize_minimal (void) { __libc_setup_tls (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN); } + +#elif defined NONTLS_INIT_TP + +/* This is the minimal initialization function used when libpthread is + not used. */ +void +__attribute__ ((weak)) +__pthread_initialize_minimal (void) +{ + NONTLS_INIT_TP; +} + +#endif diff --git a/csu/tst-atomic.c b/csu/tst-atomic.c index 7c0b022b78..7a2e3d0865 100644 --- a/csu/tst-atomic.c +++ b/csu/tst-atomic.c @@ -1,5 +1,5 @@ /* Tests for atomic.h macros. - Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. @@ -379,117 +379,6 @@ do_test (void) } #endif -#ifdef catomic_compare_and_exchange_val_acq - mem = 24; - if (catomic_compare_and_exchange_val_acq (&mem, 35, 24) != 24 - || mem != 35) - { - puts ("catomic_compare_and_exchange_val_acq test 1 failed"); - ret = 1; - } - - mem = 12; - if (catomic_compare_and_exchange_val_acq (&mem, 10, 15) != 12 - || mem != 12) - { - puts ("catomic_compare_and_exchange_val_acq test 2 failed"); - ret = 1; - } - - mem = -15; - if (catomic_compare_and_exchange_val_acq (&mem, -56, -15) != -15 - || mem != -56) - { - puts ("catomic_compare_and_exchange_val_acq test 3 failed"); - ret = 1; - } - - mem = -1; - if (catomic_compare_and_exchange_val_acq (&mem, 17, 0) != -1 - || mem != -1) - { - puts ("catomic_compare_and_exchange_val_acq test 4 failed"); - ret = 1; - } -#endif - - mem = 24; - if (catomic_compare_and_exchange_bool_acq (&mem, 35, 24) - || mem != 35) - { - puts ("catomic_compare_and_exchange_bool_acq test 1 failed"); - ret = 1; - } - - mem = 12; - if (! catomic_compare_and_exchange_bool_acq (&mem, 10, 15) - || mem != 12) - { - puts ("catomic_compare_and_exchange_bool_acq test 2 failed"); - ret = 1; - } - - mem = -15; - if (catomic_compare_and_exchange_bool_acq (&mem, -56, -15) - || mem != -56) - { - puts ("catomic_compare_and_exchange_bool_acq test 3 failed"); - ret = 1; - } - - mem = -1; - if (! catomic_compare_and_exchange_bool_acq (&mem, 17, 0) - || mem != -1) - { - puts ("catomic_compare_and_exchange_bool_acq test 4 failed"); - ret = 1; - } - - mem = 2; - if (catomic_exchange_and_add (&mem, 11) != 2 - || mem != 13) - { - puts ("catomic_exchange_and_add test failed"); - ret = 1; - } - - mem = -21; - catomic_add (&mem, 22); - if (mem != 1) - { - puts ("catomic_add test failed"); - ret = 1; - } - - mem = -1; - catomic_increment (&mem); - if (mem != 0) - { - puts ("catomic_increment test failed"); - ret = 1; - } - - mem = 2; - if (catomic_increment_val (&mem) != 3) - { - puts ("catomic_increment_val test failed"); - ret = 1; - } - - mem = 17; - catomic_decrement (&mem); - if (mem != 16) - { - puts ("catomic_decrement test failed"); - ret = 1; - } - - if (catomic_decrement_val (&mem) != 15) - { - puts ("catomic_decrement_val test failed"); - ret = 1; - } - return ret; } diff --git a/csu/version.c b/csu/version.c index f7a8fb35e9..2196d20432 100644 --- a/csu/version.c +++ b/csu/version.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992-2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1992-2002, 2003, 2004, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -25,7 +25,7 @@ static const char __libc_version[] = VERSION; static const char banner[] = "GNU C Library "RELEASE" release version "VERSION", by Roland McGrath et al.\n\ -Copyright (C) 2007 Free Software Foundation, Inc.\n\ +Copyright (C) 2006 Free Software Foundation, Inc.\n\ This is free software; see the source for copying conditions.\n\ There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\ PARTICULAR PURPOSE.\n\ @@ -34,6 +34,9 @@ Compiled by GNU CC version "__VERSION__".\n" #ifdef GLIBC_OLDEST_ABI "The oldest ABI supported: " GLIBC_OLDEST_ABI ".\n" #endif +#ifdef USE_TLS +"Thread-local storage support included.\n" +#endif "For bug reporting instructions, please see:\n\ <http://www.gnu.org/software/libc/bugs.html>.\n"; |