From b9873b4e2c9a9955789318f4d550147ef9405b07 Mon Sep 17 00:00:00 2001 From: Iain Sandoe <iain@sandoe.co.uk> Date: Sun, 19 Sep 2021 12:35:46 +0100 Subject: [PATCH] libgcc, emutls: Allow building weak definitions of the emutls functions. In order to better support use of the emulated TLS between objects with DSO dependencies and static-linked libgcc, allow a target to make weak definitions. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> libgcc/ChangeLog: * config/t-darwin: Build weak-defined emutls objects. * emutls.c (__emutls_get_address): Add optional attributes. (__emutls_register_common): Likewise. (EMUTLS_ATTR): New. --- libgcc/config/t-darwin | 13 +++++++++++++ libgcc/emutls.c | 17 +++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/libgcc/config/t-darwin b/libgcc/config/t-darwin index 14ae6b35a4ee..d6f688d66d52 100644 --- a/libgcc/config/t-darwin +++ b/libgcc/config/t-darwin @@ -15,6 +15,19 @@ crttme.o: $(srcdir)/config/darwin-crt-tm.c LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/config/unwind-dw2-fde-darwin.c \ $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c +# Make emutls weak so that we can deal with -static-libgcc, override the +#Â hidden visibility when this is present in libgcc_eh. +emutls.o: HOST_LIBGCC2_CFLAGS += \ + -DEMUTLS_ATTR='__attribute__((__weak__,__visibility__("default")))' +emutls_s.o: HOST_LIBGCC2_CFLAGS += \ + -DEMUTLS_ATTR='__attribute__((__weak__,__visibility__("default")))' + +# Make the emutls crt as a convenience lib so that it can be linked +#Â optionally, use the shared version so that we can link with DSO. +libemutls_w.a: emutls_s.o + $(AR_CREATE_FOR_TARGET) $@ $< + $(RANLIB_FOR_TARGET) $@ + # Patch to __Unwind_Find_Enclosing_Function for Darwin10. d10-uwfef.o: $(srcdir)/config/darwin10-unwind-find-enc-func.c $(crt_compile) -mmacosx-version-min=10.6 -c $< diff --git a/libgcc/emutls.c b/libgcc/emutls.c index ed2658170f5b..d553a74728f8 100644 --- a/libgcc/emutls.c +++ b/libgcc/emutls.c @@ -50,7 +50,16 @@ struct __emutls_array void **data[]; }; +/* EMUTLS_ATTR is provided to allow targets to build the emulated tls + routines as weak definitions, for example. + If there is no definition, fall back to the default. */ +#ifndef EMUTLS_ATTR +# define EMUTLS_ATTR +#endif + +EMUTLS_ATTR void *__emutls_get_address (struct __emutls_object *); +EMUTLS_ATTR void __emutls_register_common (struct __emutls_object *, word, word, void *); #ifdef __GTHREADS @@ -123,7 +132,11 @@ emutls_alloc (struct __emutls_object *obj) return ret; } -void * +/* Despite applying the attribute to the declaration, in this case the mis- + match between the builtin's declaration [void * (*)(void *)] and the + implementation here, causes the decl. attributes to be discarded. */ + +EMUTLS_ATTR void * __emutls_get_address (struct __emutls_object *obj) { if (! __gthread_active_p ()) @@ -187,7 +200,7 @@ __emutls_get_address (struct __emutls_object *obj) #endif } -void +EMUTLS_ATTR void __emutls_register_common (struct __emutls_object *obj, word size, word align, void *templ) { -- GitLab