This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix libgomp crash without TLS (PR42616)
- From: Varvara Rainchik <varvara dot s dot rainchik at gmail dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Richard Henderson <rth at redhat dot com>, gcc-patches at gcc dot gnu dot org
- Date: Mon, 1 Dec 2014 18:25:06 +0300
- Subject: Re: Fix libgomp crash without TLS (PR42616)
- Authentication-results: sourceware.org; auth=none
- References: <CAAp9h93CTb_oZ-y4-GgJUN7wTkjUajWMzGD+eyY43wJHQFw5eg at mail dot gmail dot com> <5400BB29 dot 2010205 at redhat dot com> <20140901105136 dot GM17454 at tucnak dot redhat dot com> <CAAp9h93RHkPQNCc_U1Vp+aoFEi2KcRhgQzsaVzAZ5mEyutMjAw at mail dot gmail dot com> <CAAp9h93LV3g-VLoEjD3x7nfHOvcxYJjqR7RXF7Y1CKAm-2j8XA at mail dot gmail dot com> <CAAp9h93vx+cM=sNNRzKd0FNABrt96TEmRoU=WOEZnyYrm6zkqQ at mail dot gmail dot com> <CAAp9h91Gd6nauh5Vm4bStXwKcMDdc_fDs+xHtZa1c7DziCpv3g at mail dot gmail dot com> <20140930095219 dot GA1986 at tucnak dot redhat dot com> <542AC0F4 dot 9090808 at redhat dot com> <CAAp9h92JrSYjicz1A2ysfNniXAVk2LkE9WsLNiGXQehgS2yKdQ at mail dot gmail dot com> <20141007071125 dot GE1986 at tucnak dot redhat dot com> <CAAp9h91_2rLg8_GsNcaiA5D9MuTcUiskxkufdydENok1OAxLZQ at mail dot gmail dot com> <CAAp9h91yhuDnD607RO4+=E8DFVfrMKpN5kAa9nCzsq8_XqeTuw at mail dot gmail dot com>
Hi Jakub,
Do you think this patch is ok for upstream:
2014-12-01 Varvara Rainchik <varvara.rainchik@intel.com>
* libgomp/libgomp.h: Eliminate case when HAVE_TLS is not defined:
always use tls emulation.
* libgomp/team.c: Likewise.
--
diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h
index a1482cc..a659ebc 100644
--- a/libgomp/libgomp.h
+++ b/libgomp/libgomp.h
@@ -471,19 +471,11 @@ enum gomp_cancel_kind
/* ... and here is that TLS data. */
-#ifdef HAVE_TLS
extern __thread struct gomp_thread gomp_tls_data;
static inline struct gomp_thread *gomp_thread (void)
{
return &gomp_tls_data;
}
-#else
-extern pthread_key_t gomp_tls_key;
-static inline struct gomp_thread *gomp_thread (void)
-{
- return pthread_getspecific (gomp_tls_key);
-}
-#endif
extern struct gomp_task_icv *gomp_new_icv (void);
diff --git a/libgomp/team.c b/libgomp/team.c
index e6a6d8f..2e8dc47 100644
--- a/libgomp/team.c
+++ b/libgomp/team.c
@@ -37,12 +37,7 @@ pthread_key_t gomp_thread_destructor;
/* This is the libgomp per-thread data structure. */
-#ifdef HAVE_TLS
__thread struct gomp_thread gomp_tls_data;
-#else
-pthread_key_t gomp_tls_key;
-#endif
-
/* This structure is used to communicate across pthread_create. */
@@ -70,13 +65,7 @@ gomp_thread_start (void *xdata)
void (*local_fn) (void *);
void *local_data;
-#ifdef HAVE_TLS
thr = &gomp_tls_data;
-#else
- struct gomp_thread local_thr;
- thr = &local_thr;
- pthread_setspecific (gomp_tls_key, thr);
-#endif
gomp_sem_init (&thr->release, 0);
/* Extract what we need from data. */
@@ -916,13 +905,6 @@ gomp_team_end (void)
static void __attribute__((constructor))
initialize_team (void)
{
-#ifndef HAVE_TLS
- static struct gomp_thread initial_thread_tls_data;
-
- pthread_key_create (&gomp_tls_key, NULL);
- pthread_setspecific (gomp_tls_key, &initial_thread_tls_data);
-#endif
-
if (pthread_key_create (&gomp_thread_destructor, gomp_free_thread) != 0)
gomp_fatal ("could not create thread pool destructor.");
}
Or should I add some extra checks in config/tls.m4? As far as I
understand you have mentioned case when both native tls and tls
emulation are not supported. So, is it sufficient to check that
HAVE_TLS and USE_EMUTLS are not defined to detect this case?
2014-11-10 16:15 GMT+03:00 Varvara Rainchik <varvara.s.rainchik@gmail.com>:
> *Ping*
>
> 2014-10-13 14:48 GMT+04:00 Varvara Rainchik <varvara.s.rainchik@gmail.com>:
>>> Now, I wonder on which OS and why does config/tls.m4 CHECK_GCC_TLS
>>> actually fail? Can you figure that out?
>>>
>>
>> On Android check passes with --disable-tls (standard while building
>> gcc for Android as TLS is not supported in bionic) and fails with
>> --enable-tls (i686-linux-android/libgomp/conftest.c:32: undefined
>> reference to `___tls_get_addr'). So, HAVE_TLS is not defined in both
>> cases.
>>
>>> If we get rid of HAVE_TLS code altogether, we might lose support of
>>> some very old OSes, e.g. some Linux distros with a recent gcc and binutils
>>> (so that emutls isn't used), but very old glibc (that doesn't support
>>> TLS or supports it incorrectly, think of pre-2002 glibc). So, if we get
>>> rid of !HAVE_TLS code in libgomp, it would be nice if config/tls.m4 detected
>>> it properly and we'd just fail at configure time.
>>
>> How can we check this in config/tls.m4? Can we just combine tests on
>> TLS and emutls? E.g. check whether HAVE_TLS and USE_EMUTLS are both
>> defined.
>>
>>> And if we don't, just make sure that on Android, Darwin and/or M$Win (or
>>> whatever other OS you had in mind which does support pthreads, but doesn't
>>> support native TLS) find out why HAVE_AS_TLS is not defined (guess
>>> config.log should explain that).
>>
>> HAVE_AS_TLS is also not defined for Android as it depends on --enable-tls.