mirror of
https://sourceware.org/git/glibc.git
synced 2025-09-01 05:02:03 +03:00
.
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
113
csu/tst-atomic.c
113
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;
|
||||
}
|
||||
|
||||
|
@@ -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";
|
||||
|
||||
|
Reference in New Issue
Block a user