[hurd,commited] elf: directly call dl_init_static_tls

Samuel Thibault <[email protected]>
Newsgroups gmane.os.hurd.cvs,gmane.comp.lib.glibc.alpha
Message-ID <[email protected]>
htl can now have it directly in ld.so
---
 elf/dl-open.c                       |  2 +-
 elf/dl-reloc.c                      | 23 +----------
 elf/dl-support.c                    |  3 --
 elf/dl-tls.c                        |  7 ++--
 elf/dl-tls_init_tp.c                |  3 --
 htl/Versions                        |  1 -
 htl/pt-alloc.c                      | 30 --------------
 sysdeps/generic/ldsodefs.h          | 23 ++---------
 sysdeps/htl/Makefile                |  4 ++
 sysdeps/htl/dl-thread_gscope_wait.c |  2 +-
 {htl => sysdeps/htl}/pt-internal.h  |  0
 sysdeps/htl/pt-static-tls.c         | 64 +++++++++++++++++++++++++++++
 sysdeps/htl/pthreadP.h              |  3 --
 sysdeps/mach/hurd/htl/pt-sysdep.c   |  2 -
 14 files changed, 78 insertions(+), 89 deletions(-)
 rename {htl => sysdeps/htl}/pt-internal.h (100%)
 create mode 100644 sysdeps/htl/pt-static-tls.c

diff --git a/elf/dl-open.c b/elf/dl-open.c
index da0e8512cf..ee25d4d42b 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -408,7 +408,7 @@ TLS generation counter wrapped!  Please report this."));
 	  _dl_update_slotinfo (imap->l_tls_modid, newgen);
 #endif
 
-	  dl_init_static_tls (imap);
+	  _dl_init_static_tls (imap);
 	  assert (imap->l_need_tls_init == 0);
 	}
     }
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 26a1e7adfc..f1a432ac09 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -119,7 +119,7 @@ _dl_try_allocate_static_tls (struct link_map *map, bool optional)
 	(void) _dl_update_slotinfo (map->l_tls_modid, GL(dl_tls_generation));
 #endif
 
-      dl_init_static_tls (map);
+      _dl_init_static_tls (map);
     }
   else
     map->l_need_tls_init = 1;
@@ -142,27 +142,6 @@ cannot allocate memory in static TLS block"));
     }
 }
 
-#if !PTHREAD_IN_LIBC
-/* Initialize static TLS area and DTV for current (only) thread.
-   libpthread implementations should provide their own hook
-   to handle all threads.  */
-void
-_dl_nothread_init_static_tls (struct link_map *map)
-{
-#if TLS_TCB_AT_TP
-  void *dest = (char *) THREAD_SELF - map->l_tls_offset;
-#elif TLS_DTV_AT_TP
-  void *dest = (char *) THREAD_SELF + map->l_tls_offset + TLS_PRE_TCB_SIZE;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
-
-  /* Initialize the memory.  */
-  memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
-	  '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
-}
-#endif /* !PTHREAD_IN_LIBC */
-
 static __always_inline lookup_t
 resolve_map (lookup_t l, struct r_scope_elem *scope[], const ElfW(Sym) **ref,
 	     const struct r_found_version *version, unsigned long int r_type)
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 7505e149e2..a782c09c94 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -177,9 +177,6 @@ size_t _dl_stack_cache_actsize;
 uintptr_t _dl_in_flight_stack;
 int _dl_stack_cache_lock;
 #endif
-#if !PTHREAD_IN_LIBC
-void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls;
-#endif
 struct dl_scope_free_list *_dl_scope_free_list;
 
 #ifdef NEED_DL_SYSINFO
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index 5bfcb184ed..21fb5b5ed7 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -29,8 +29,9 @@
 #include <dl-tls.h>
 #include <ldsodefs.h>
 #include <dl-tls_block_align.h>
+#include <pthreadP.h>
 
-#if PTHREAD_IN_LIBC
+#ifdef __PTHREAD_NPTL
 # include <list.h>
 #endif
 
@@ -1300,7 +1301,7 @@ cannot create TLS data structures"));
   return true;
 }
 
-#if PTHREAD_IN_LIBC
+#ifdef __PTHREAD_NPTL
 static inline void __attribute__((always_inline))
 init_one_static_tls (struct pthread *curp, struct link_map *map)
 {
@@ -1333,4 +1334,4 @@ _dl_init_static_tls (struct link_map *map)
 
   lll_unlock (GL (dl_stack_cache_lock), LLL_PRIVATE);
 }
-#endif /* PTHREAD_IN_LIBC */
+#endif /* __PTHREAD_NPTL */
diff --git a/elf/dl-tls_init_tp.c b/elf/dl-tls_init_tp.c
index 3ab262ae31..fc97e8a744 100644
--- a/elf/dl-tls_init_tp.c
+++ b/elf/dl-tls_init_tp.c
@@ -21,9 +21,6 @@
 void
 __tls_pre_init_tp (void)
 {
-#if !PTHREAD_IN_LIBC
-  GL(dl_init_static_tls) = &_dl_nothread_init_static_tls;
-#endif
 }
 
 void
diff --git a/htl/Versions b/htl/Versions
index cac34e623b..6b77fe21f7 100644
--- a/htl/Versions
+++ b/htl/Versions
@@ -307,7 +307,6 @@ libc {
     __pthread_block_intr;
     __pthread_create;
     __pthread_init_thread;
-    __pthread_init_static_tls;
     __pthread_default_attr;
     __pthread_attr_init;
     __pthread_attr_getstacksize;
diff --git a/htl/pt-alloc.c b/htl/pt-alloc.c
index 53833d3f20..f23d9d3e5b 100644
--- a/htl/pt-alloc.c
+++ b/htl/pt-alloc.c
@@ -204,33 +204,3 @@ retry:
   return 0;
 }
 libc_hidden_def (__pthread_alloc)
-
-void
-attribute_hidden
-__pthread_init_static_tls (struct link_map *map)
-{
-  int i;
-
-  __mach_rwlock_wrlock (GL (dl_pthread_threads_lock));
-  for (i = 0; i < GL (dl_pthread_num_threads); ++i)
-    {
-      struct __pthread *t = GL (dl_pthread_threads)[i];
-
-      if (t == NULL)
-	continue;
-
-# if TLS_TCB_AT_TP
-      void *dest = (char *) t->tcb - map->l_tls_offset;
-# elif TLS_DTV_AT_TP
-      void *dest = (char *) t->tcb + map->l_tls_offset + TLS_PRE_TCB_SIZE;
-# else
-#  error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-# endif
-
-      /* Initialize the memory.  */
-      memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
-	      '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
-    }
-  __mach_rwlock_unlock (GL (dl_pthread_threads_lock));
-}
-libc_hidden_def (__pthread_init_static_tls)
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 46a7119b3a..cbb8273a7d 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -441,10 +441,6 @@ struct rtld_global
   /* Generation counter for the dtv.  */
   EXTERN size_t _dl_tls_generation;
 
-#if !PTHREAD_IN_LIBC
-  EXTERN void (*_dl_init_static_tls) (struct link_map *);
-#endif
-
   /* Scopes to free after next THREAD_GSCOPE_WAIT ().  */
   EXTERN struct dl_scope_free_list
   {
@@ -1239,8 +1235,6 @@ extern bool __rtld_tls_init_tp_called attribute_hidden;
 extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb);
 rtld_hidden_proto (_dl_deallocate_tls)
 
-extern void _dl_nothread_init_static_tls (struct link_map *) attribute_hidden;
-
 /* Get a pointer to _dl_main_map.  */
 extern struct link_map * _dl_get_dl_main_map (void) attribute_hidden;
 
@@ -1321,21 +1315,10 @@ extern void _dl_aux_init (ElfW(auxv_t) *av)
      attribute_hidden;
 
 /* Initialize the static TLS space for the link map in all existing
-   threads. */
-#if PTHREAD_IN_LIBC
+   threads.
+   The stack list is available to ld.so, so the initialization can
+   be handled within ld.so directly.  */
 void _dl_init_static_tls (struct link_map *map) attribute_hidden;
-#endif
-static inline void
-dl_init_static_tls (struct link_map *map)
-{
-#if PTHREAD_IN_LIBC
-  /* The stack list is available to ld.so, so the initialization can
-     be handled within ld.so directly.  */
-  _dl_init_static_tls (map);
-#else
-  GL (dl_init_static_tls) (map);
-#endif
-}
 
 #ifndef SHARED
 /* Called before relocating ld.so during static dlopen.  This can be
diff --git a/sysdeps/htl/Makefile b/sysdeps/htl/Makefile
index 624d1be7b6..f71e003bb7 100644
--- a/sysdeps/htl/Makefile
+++ b/sysdeps/htl/Makefile
@@ -5,3 +5,7 @@ endif
 ifeq ($(subdir),posix)
 CFLAGS-confstr.c += -DLIBPTHREAD_VERSION='"HTL $(version)"'
 endif
+
+ifeq ($(subdir),elf)
+sysdep-dl-routines += pt-static-tls
+endif
diff --git a/sysdeps/htl/dl-thread_gscope_wait.c b/sysdeps/htl/dl-thread_gscope_wait.c
index d8428d4491..e2a008112c 100644
--- a/sysdeps/htl/dl-thread_gscope_wait.c
+++ b/sysdeps/htl/dl-thread_gscope_wait.c
@@ -18,7 +18,7 @@
 
 #include <ldsodefs.h>
 #include <pthread.h>
-#include <htl/pt-internal.h>
+#include <pt-internal.h>
 
 static inline int *
 thread_gscope_flag (struct __pthread *t)
diff --git a/htl/pt-internal.h b/sysdeps/htl/pt-internal.h
similarity index 100%
rename from htl/pt-internal.h
rename to sysdeps/htl/pt-internal.h
diff --git a/sysdeps/htl/pt-static-tls.c b/sysdeps/htl/pt-static-tls.c
new file mode 100644
index 0000000000..d627fbd684
--- /dev/null
+++ b/sysdeps/htl/pt-static-tls.c
@@ -0,0 +1,64 @@
+/* Initialize the static TLS space for the link map in all existing threads.
+   Copyright (C) 2000-2026 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library;  if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <pthread.h>
+#include <string.h>
+
+#include <pt-internal.h>
+#include <ldsodefs.h>
+
+static inline void __attribute__((always_inline))
+init_one_static_tls (tcbhead_t *curp, struct link_map *map)
+{
+# if TLS_TCB_AT_TP
+  void *dest = (char *) curp - map->l_tls_offset;
+# elif TLS_DTV_AT_TP
+  void *dest = (char *) curp + map->l_tls_offset + TLS_PRE_TCB_SIZE;
+# else
+#  error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
+
+  /* Initialize the memory.  */
+  memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
+	  '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
+}
+
+
+void
+_dl_init_static_tls (struct link_map *map)
+{
+  int i;
+
+  if (!GL (dl_pthread_num_threads))
+    {
+      init_one_static_tls (THREAD_SELF, map);
+      return;
+    }
+
+  __mach_rwlock_wrlock (GL (dl_pthread_threads_lock));
+  for (i = 0; i < GL (dl_pthread_num_threads); ++i)
+    {
+      struct __pthread *t = GL (dl_pthread_threads)[i];
+
+      if (t == NULL)
+	continue;
+
+      init_one_static_tls (t->tcb, map);
+    }
+  __mach_rwlock_unlock (GL (dl_pthread_threads_lock));
+}
diff --git a/sysdeps/htl/pthreadP.h b/sysdeps/htl/pthreadP.h
index d6e669abf8..2ae24074e9 100644
--- a/sysdeps/htl/pthreadP.h
+++ b/sysdeps/htl/pthreadP.h
@@ -28,9 +28,6 @@
 /* Attribute to indicate thread creation was issued from C11 thrd_create.  */
 #define ATTR_C11_THREAD ((void*)(uintptr_t)-1)
 
-extern void __pthread_init_static_tls (struct link_map *);
-libc_hidden_proto (__pthread_init_static_tls)
-
 /* These represent the interface used by glibc itself.  */
 
 extern int __pthread_barrier_destroy (pthread_barrier_t *__barrier);
diff --git a/sysdeps/mach/hurd/htl/pt-sysdep.c b/sysdeps/mach/hurd/htl/pt-sysdep.c
index 3d7907e051..8f89b69f4b 100644
--- a/sysdeps/mach/hurd/htl/pt-sysdep.c
+++ b/sysdeps/mach/hurd/htl/pt-sysdep.c
@@ -123,8 +123,6 @@ _init_routine (void *stack)
 
   __register_atfork (NULL, NULL, reset_pthread_total, __dso_handle);
 
-  GL(dl_init_static_tls) = &__pthread_init_static_tls;
-
   /* Make MiG code thread aware.  */
   __mig_init (thread->stackaddr);
 }
-- 
2.51.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.