hurd: let csu initialize tls
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 28 Dec 2021 09:15:52 +0000 (10:15 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 28 Dec 2021 09:15:52 +0000 (10:15 +0100)
Since 9cec82de715b ("htl: Initialize later"), we let csu initialize
pthreads. We can thus let it initialize tls later too, to better align
with the generic order.  Initialization however accesses ports which
links/unlinks into the sigstate for unwinding.  We can however easily
skip that during initialization.

hurd/hurd/userlink.h
sysdeps/mach/hurd/i386/init-first.c
sysdeps/mach/hurd/libc-start.h [deleted file]

index 4b5ba96..0301658 100644 (file)
@@ -98,13 +98,16 @@ _hurd_userlink_link (struct hurd_userlink **chainp,
   link->resource.prevp = chainp;
   *chainp = link;
 
-  /* Also chain it on the current thread's list of active resources.  */
-  thread_chainp = &_hurd_self_sigstate ()->active_resources;
-  link->thread.next = *thread_chainp;
-  if (link->thread.next)
-    link->thread.next->thread.prevp = &link->thread.next;
-  link->thread.prevp = thread_chainp;
-  *thread_chainp = link;
+  if (!__LIBC_NO_TLS ())
+    {
+      /* Also chain it on the current thread's list of active resources.  */
+      thread_chainp = &_hurd_self_sigstate ()->active_resources;
+      link->thread.next = *thread_chainp;
+      if (link->thread.next)
+       link->thread.next->thread.prevp = &link->thread.next;
+      link->thread.prevp = thread_chainp;
+      *thread_chainp = link;
+    }
 }
 # endif
 #endif
@@ -131,11 +134,14 @@ _hurd_userlink_unlink (struct hurd_userlink *link)
   if (link->resource.next)
     link->resource.next->resource.prevp = link->resource.prevp;
 
-  /* Remove our link from the chain of currently active resources
-     for this thread.  */
-  *link->thread.prevp = link->thread.next;
-  if (link->thread.next)
-    link->thread.next->thread.prevp = link->thread.prevp;
+  if (!__LIBC_NO_TLS ())
+    {
+      /* Remove our link from the chain of currently active resources
+        for this thread.  */
+      *link->thread.prevp = link->thread.next;
+      if (link->thread.next)
+       link->thread.next->thread.prevp = link->thread.prevp;
+    }
 
   return dealloc;
 }
@@ -160,9 +166,12 @@ _hurd_userlink_move (struct hurd_userlink *new_link,
     new_link->resource.next->resource.prevp = &new_link->resource.next;
   *new_link->resource.prevp = new_link;
 
-  if (new_link->thread.next != NULL)
-    new_link->thread.next->thread.prevp = &new_link->thread.next;
-  *new_link->thread.prevp = new_link;
+  if (!__LIBC_NO_TLS ())
+    {
+      if (new_link->thread.next != NULL)
+       new_link->thread.next->thread.prevp = &new_link->thread.next;
+      *new_link->thread.prevp = new_link;
+    }
 }
 # endif
 #endif
index a430aae..5e85aa2 100644 (file)
@@ -184,9 +184,6 @@ init (int *data)
       _dl_phnum = d->phdrsz / sizeof (ElfW(Phdr));
       assert (d->phdrsz % sizeof (ElfW(Phdr)) == 0);
     }
-
-  /* We need to setup TLS before initializing libpthread.  */
-  __libc_setup_tls ();
 #endif
 
   /* Call `init1' (above) with the user code as the return address, and the
diff --git a/sysdeps/mach/hurd/libc-start.h b/sysdeps/mach/hurd/libc-start.h
deleted file mode 100644 (file)
index 32cf99e..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Hurd definitions for libc main startup.
-   Copyright (C) 2017-2021 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/>.  */
-
-#ifndef _LIBC_START_H
-#define _LIBC_START_H
-
-#ifndef SHARED
-/* By default we perform STT_GNU_IFUNC resolution *before* TLS
-   initialization, and this means you cannot, without machine
-   knowledge, access TLS from an IFUNC resolver.  */
-#define ARCH_SETUP_IREL() apply_irel ()
-#define ARCH_SETUP_TLS()
-#define ARCH_APPLY_IREL()
-#endif /* ! SHARED  */
-
-#endif /* _LIBC_START_H  */