Hi,

as noted below the non-Darwin parts of this are trivial (and a no-OP).
I’d like to apply this to start work towards solving Darwin’s libgcc issues,

OTOH, the two raised questions remain…
thanks
Iain

> On 20 Sep 2021, at 09:25, Iain Sandoe <i...@sandoe.co.uk> wrote:
> 
> Hi,
> 
> The non-Darwin part of this patch is trivial but raises a couple of questions
> 
> A/
> We define builtins to support emulated TLS.
> These are defined with void * pointers
> The implementation (in libgcc) uses the correct type (struct __emutls_object 
> *)
> in both a forward declaration of the functions and in thier eventual 
> implementation.
> 
> This leads to a (long-standing, nothing new) complaint at build-time about
> the mismatch in the builtin/implementation decls.
> 
> AFAICT, there’s no way to fix that unless we introduce struct __emutls_object 
> *
> as a built-in type?
> 
> B/ 
> It seems that a consequence of the mismatch in decls means that if I apply
> attributes to the decl (in the implementation file), they are ignored and I 
> have
> to apply them to the definition in order for this to work.
> 
> This (B) is what the patch below does.
> 
> tested on powerpc,i686,x86_64-darwin, x86_64-linux
> OK for master?
> thanks,
> Iain
> 
> If the current situation is that A or B indicates “there’s a bug”, please 
> could that
> be considered as distinct from the current patch (which doesn’t alter this in 
> any
> way) so that we can make progress on fixing Darwin libgcc issues.
> 
> ===== commit log
> 
> 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 <i...@sandoe.co.uk>
> 
> libgcc/ChangeLog:
> 
>       * config.host: Add weak-defined emutls crt.
>       * 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.host     |  2 +-
> libgcc/config/t-darwin | 13 +++++++++++++
> libgcc/emutls.c        | 17 +++++++++++++++--
> 3 files changed, 29 insertions(+), 3 deletions(-)
> 
> diff --git a/libgcc/config.host b/libgcc/config.host
> index 6c34b13d611..a447ac7ae30 100644
> --- a/libgcc/config.host
> +++ b/libgcc/config.host
> @@ -215,7 +215,7 @@ case ${host} in
> *-*-darwin*)
>   asm_hidden_op=.private_extern
>   tmake_file="$tmake_file t-darwin ${cpu_type}/t-darwin t-libgcc-pic 
> t-slibgcc-darwin"
> -  extra_parts="crt3.o libd10-uwfef.a crttms.o crttme.o"
> +  extra_parts="crt3.o libd10-uwfef.a crttms.o crttme.o libemutls_w.a"
>   ;;
> *-*-dragonfly*)
>   tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip"
> diff --git a/libgcc/config/t-darwin b/libgcc/config/t-darwin
> index 14ae6b35a4e..d6f688d66d5 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 ed2658170f5..d553a74728f 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)
> {
> -- 
> 

Reply via email to