From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp001-out.apm-internet.net (smtp001-out.apm-internet.net [85.119.248.222]) by sourceware.org (Postfix) with ESMTPS id CE77C385842B for ; Fri, 1 Oct 2021 18:07:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CE77C385842B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sandoe.co.uk Authentication-Results: sourceware.org; spf=none smtp.mailfrom=sandoe.co.uk Received: (qmail 19329 invoked from network); 1 Oct 2021 18:07:17 -0000 X-APM-Out-ID: 16331116361932 X-APM-Authkey: 257869/1(257869/1) 1 Received: from unknown (HELO ?192.168.1.214?) (81.138.1.83) by smtp001.apm-internet.net with SMTP; 1 Oct 2021 18:07:17 -0000 From: Iain Sandoe Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.21\)) Subject: Re: [PING^2][PATCH] libgcc, emutls: Allow building weak definitions of the emutls functions. Date: Fri, 1 Oct 2021 19:07:15 +0100 References: <595871BA-D5D2-4A15-95A0-01D40585B50B@sandoe.co.uk> To: GCC Patches In-Reply-To: <595871BA-D5D2-4A15-95A0-01D40585B50B@sandoe.co.uk> Message-Id: <75953DC4-E6D2-4109-BE9C-832B3FD9FC61@sandoe.co.uk> X-Mailer: Apple Mail (2.3445.104.21) X-Spam-Status: No, score=-15.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_COUK, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, 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: Fri, 01 Oct 2021 18:07:23 -0000 Hi, So let=E2=80=99s ignore the questions for now - OK for the non-Darwin = parts of the patch ? > 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 = questions >>=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_object *) >> in both a forward declaration of the functions and in thier eventual = implementation. >>=20 >> This leads to a (long-standing, nothing new) complaint at build-time = about >> 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 = 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. >>=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=99= s 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-darwin.c \ >> $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c >>=20 >> +# 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 +=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, = void *); >>=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