From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 31FA83858D28 for ; Mon, 4 Oct 2021 16:06:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 31FA83858D28 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BDCB411D4; Mon, 4 Oct 2021 09:06:15 -0700 (PDT) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.126]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 477B23F70D; Mon, 4 Oct 2021 09:06:15 -0700 (PDT) From: Richard Sandiford To: Iain Sandoe Mail-Followup-To: Iain Sandoe , GCC Patches , richard.sandiford@arm.com Cc: GCC Patches Subject: Re: [PING^2][PATCH] libgcc, emutls: Allow building weak definitions of the emutls functions. References: <595871BA-D5D2-4A15-95A0-01D40585B50B@sandoe.co.uk> <75953DC4-E6D2-4109-BE9C-832B3FD9FC61@sandoe.co.uk> Date: Mon, 04 Oct 2021 17:06:14 +0100 In-Reply-To: <75953DC4-E6D2-4109-BE9C-832B3FD9FC61@sandoe.co.uk> (Iain Sandoe's message of "Fri, 1 Oct 2021 19:07:15 +0100") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Oct 2021 16:06:18 -0000 Iain Sandoe writes: > Hi, > > So let=E2=80=99s ignore the questions for now - OK for the non-Darwin par= ts of the > patch ? Looks OK to me. Thanks, Richard > >> On 24 Sep 2021, at 17:57, Iain Sandoe wrote: >>=20 > >> as noted below the non-Darwin parts of this are trivial (and a no-OP). >> I=E2=80=99d like to apply this to start work towards solving Darwin=E2= =80=99s libgcc issues, > >>> On 20 Sep 2021, at 09:25, Iain Sandoe wrote: >>>=20 > >>> The non-Darwin part of this patch is trivial but raises a couple of que= stions >>>=20 >>> A/ >>> We define builtins to support emulated TLS. >>> These are defined with void * pointers >>> The implementation (in libgcc) uses the correct type (struct __emutls_o= bject *) >>> in both a forward declaration of the functions and in thier eventual im= plementation. >>>=20 >>> This leads to a (long-standing, nothing new) complaint at build-time ab= out >>> the mismatch in the builtin/implementation decls. >>>=20 >>> AFAICT, there=E2=80=99s no way to fix that unless we introduce struct _= _emutls_object * >>> as a built-in type? >>>=20 >>> B/=20 >>> It seems that a consequence of the mismatch in decls means that if I ap= ply >>> attributes to the decl (in the implementation file), they are ignored a= nd I have >>> to apply them to the definition in order for this to work. >>>=20 >>> This (B) is what the patch below does. >>>=20 >>> tested on powerpc,i686,x86_64-darwin, x86_64-linux >>> OK for master? >>> thanks, >>> Iain >>>=20 >>> If the current situation is that A or B indicates =E2=80=9Cthere=E2=80= =99s a bug=E2=80=9D, please could that >>> be considered as distinct from the current patch (which doesn=E2=80=99t= alter this in any >>> way) so that we can make progress on fixing Darwin libgcc issues. >>>=20 >>> =3D=3D=3D=3D=3D commit log >>>=20 >>> 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. >>>=20 >>> Signed-off-by: Iain Sandoe >>>=20 >>> libgcc/ChangeLog: >>>=20 >>> * 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(-) >>>=20 >>> 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=3D.private_extern >>> tmake_file=3D"$tmake_file t-darwin ${cpu_type}/t-darwin t-libgcc-pic t= -slibgcc-darwin" >>> - extra_parts=3D"crt3.o libd10-uwfef.a crttms.o crttme.o" >>> + extra_parts=3D"crt3.o libd10-uwfef.a crttms.o crttme.o libemutls_w.a" >>> ;; >>> *-*-dragonfly*) >>> tmake_file=3D"$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 =3D $(srcdir)/unwind-dw2.c $(srcdir)/config/unwind-dw2-fde-da= rwin.c \ >>> $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c >>>=20 >>> +# Make emutls weak so that we can deal with -static-libgcc, override t= he >>> +# hidden visibility when this is present in libgcc_eh. >>> +emutls.o: HOST_LIBGCC2_CFLAGS +=3D \ >>> + -DEMUTLS_ATTR=3D'__attribute__((__weak__,__visibility__("default")))' >>> +emutls_s.o: HOST_LIBGCC2_CFLAGS +=3D \ >>> + -DEMUTLS_ATTR=3D'__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=3D10.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[]; >>> }; >>>=20 >>> +/* 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, vo= id *); >>>=20 >>> #ifdef __GTHREADS >>> @@ -123,7 +132,11 @@ emutls_alloc (struct __emutls_object *obj) >>> return ret; >>> } >>>=20 >>> -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 >>> } >>>=20 >>> -void >>> +EMUTLS_ATTR void >>> __emutls_register_common (struct __emutls_object *obj, >>> word size, word align, void *templ) >>> { >>> --=20 >>>=20 >>=20