From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS3215 2.6.0.0/16 X-Spam-Status: No, score=-2.3 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FSL_HELO_FAKE, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id CB8861F8C6 for ; Tue, 10 Aug 2021 21:15:36 +0000 (UTC) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AE2D9396E05C for ; Tue, 10 Aug 2021 21:15:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AE2D9396E05C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1628630135; bh=OLADAW9z48lWWaJPwGzctViYliaQsIR1VdzzdjyiRlc=; h=Date:To:Subject:References:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=EpNJ5bdP4kYbNVV9W+41SoPuXIg2CKh/+fM5MeKb7JFbBz8lsH90FopHKtZaT8YUU 4g2t08uoRqcmTOxWgeo7i1+UBUubwGMmn74RTuRcbXZuyQGu2m6goXy1sGLAOZLKvD y1mtwhNXMMFzc1CelNY2XxKGwtcXwJvc+ibTZjY8= Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by sourceware.org (Postfix) with ESMTPS id B8FE53982011 for ; Tue, 10 Aug 2021 21:15:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B8FE53982011 Received: by mail-pj1-x102e.google.com with SMTP id fa24-20020a17090af0d8b0290178bfa69d97so1196170pjb.0 for ; Tue, 10 Aug 2021 14:15:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=OLADAW9z48lWWaJPwGzctViYliaQsIR1VdzzdjyiRlc=; b=sCGNPrOuRevu+BEfsKldlRqcOxHVhOslQJrqGwzyVuZKCOWuYn3yMsyMxf3n7Mtx9O j7EwFSI3wPvWhD2YE3fsSGWlfihsjepun1fMM51TWtGt76TwOZTWI6sSiQJD4typc7Eo DbUiQd+Z01Kvd6SXMZDoexknMLmlHTL+6wkojoOOBbK3wRXCVonPSUHAtYJugNQ3Nbmr BUdglR+XkiepFlsC3TfckNc0jimAW0aBw7+vhOjvOGDKqOOzE45eXgBRqGyHcK3e0wtb uxcQ6PCtJvVVKwrhubsgnM19E8fb8KYCajgFx3xdyoBRAlapY3ib1/7FkkMWumXll3UH qnOA== X-Gm-Message-State: AOAM5307cy6uNWLGnB80WnZ7P+sEQoO6HwkiWnkUgAtHlFYfux9c+hwM Yl08oe3tgiD8mMsD+cgxuWoUcWoTBdhGMw== X-Google-Smtp-Source: ABdhPJywRBjegbMAetNpgGbf8l7iUpy7IXhXDhpDGC75HVH0O6KjfR8QZw5FziFf2ndamcIWMAXufA== X-Received: by 2002:a17:902:9042:b029:12c:c03:20e2 with SMTP id w2-20020a1709029042b029012c0c0320e2mr1400752plz.36.1628630103314; Tue, 10 Aug 2021 14:15:03 -0700 (PDT) Received: from google.com ([2620:15c:2ce:200:69a6:3e8d:f42c:7450]) by smtp.gmail.com with ESMTPSA id k200sm25710720pfd.46.2021.08.10.14.15.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Aug 2021 14:15:02 -0700 (PDT) Date: Tue, 10 Aug 2021 14:14:58 -0700 To: libc-alpha@sourceware.org, Adhemerval Zanella , Szabolcs Nagy Subject: Re: [PATCH v2] aarch64: Skip traditional GD/LD TLS which are unsupported by Clang and LLD [BZ #28205] Message-ID: <20210810211458.oxx3t5phzt3z3sp3@google.com> References: <20210810210247.676100-1-maskray@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <20210810210247.676100-1-maskray@google.com> X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Fangrui Song via Libc-alpha Reply-To: Fangrui Song Errors-To: libc-alpha-bounces+e=80x24.org@sourceware.org Sender: "Libc-alpha" On 2021-08-10, Fangrui Song wrote: >TLSDESC is the default on aarch64. Clang doesn't support >-mtls-dialect=trad. Its integrated assembler doesn't support the >marker. LLD's doesn't support R_AARCH64_TLSGD_*/R_AARCH64_TLSLD_* >relocations. Just skip the tests. > >With https://sourceware.org/pipermail/libc-alpha/2021-August/129966.html >("aarch64: Make elf_machine_{load_address, dynamic} robust [BZ #28203]"), >if we allow LLD in configure.ac, >`make check` test results of LLD are on par with GNU ld. I messed up in the diff. The correct diff needs `#include ` to make HAVE_TRAD_TLS defined. --- config.h.in | 3 +++ elf/tst-tls1.c | 8 ++++++-- elf/tst-tls2.c | 7 +++++-- elf/tst-tls3.c | 9 +++++---- elf/tst-tlsmod1.c | 7 +++++-- elf/tst-tlsmod2.c | 5 ++++- elf/tst-tlsmod3.c | 6 +++++- elf/tst-tlsmod4.c | 5 ++++- sysdeps/aarch64/configure | 30 ++++++++++++++++++++++++++++++ sysdeps/aarch64/configure.ac | 18 ++++++++++++++++++ 10 files changed, 85 insertions(+), 13 deletions(-) diff --git a/config.h.in b/config.h.in index 0d92504f65..7dcce4d3a4 100644 --- a/config.h.in +++ b/config.h.in @@ -198,6 +198,9 @@ /* Define if CC supports attribute retain. */ #undef HAVE_GNU_RETAIN +/* Define if CC and LD support traditional TLS GD/LD models. */ +#define HAVE_TRAD_TLS 1 + /* Define to 1 if the assembler needs intermediate aliases to define multiple symbol versions for one symbol. */ #define SYMVER_NEEDS_ALIAS 0 diff --git a/elf/tst-tls1.c b/elf/tst-tls1.c index c31da56ce9..1f102b62b7 100644 --- a/elf/tst-tls1.c +++ b/elf/tst-tls1.c @@ -1,4 +1,5 @@ /* glibc test for TLS in ld.so. */ +#include #include #include "tls-macros.h" @@ -39,7 +40,8 @@ do_test (void) result = 1; } - + /* Clang and LLD do not support traditional GD/LD TLS on aarch64. */ +#if HAVE_TRAD_TLS /* Get variables using local dynamic model. */ fputs ("get sum of foo and bar (LD)", stdout); ap = TLS_LD (foo); @@ -56,8 +58,9 @@ do_test (void) printf ("bar = %d\n", *bp); result = 1; } +#endif - +#if HAVE_TRAD_TLS /* Get variables using generic dynamic model. */ fputs ("get sum of foo and bar (GD)", stdout); ap = TLS_GD (foo); @@ -74,6 +77,7 @@ do_test (void) printf ("bar = %d\n", *bp); result = 1; } +#endif return result; } diff --git a/elf/tst-tls2.c b/elf/tst-tls2.c index 963b8d6c88..46e69b049b 100644 --- a/elf/tst-tls2.c +++ b/elf/tst-tls2.c @@ -1,4 +1,5 @@ /* glibc test for TLS in ld.so. */ +#include #include #include "tls-macros.h" @@ -39,7 +40,7 @@ do_test (void) result = 1; } - +#if HAVE_TRAD_TLS /* Get variables using local dynamic model. */ fputs ("get sum of foo and bar (LD)", stdout); ap = TLS_LD (foo); @@ -56,8 +57,9 @@ do_test (void) printf ("bar = %d\n", *bp); result = 1; } +#endif - +#if HAVE_TRAD_TLS /* Get variables using generic dynamic model. */ fputs ("get sum of foo and bar (GD)", stdout); ap = TLS_GD (foo); @@ -74,6 +76,7 @@ do_test (void) printf ("bar = %d\n", *bp); result = 1; } +#endif return result; } diff --git a/elf/tst-tls3.c b/elf/tst-tls3.c index 7e0abb4c58..4abdec2857 100644 --- a/elf/tst-tls3.c +++ b/elf/tst-tls3.c @@ -1,4 +1,5 @@ /* glibc test for TLS in ld.so. */ +#include #include #include "tls-macros.h" @@ -17,8 +18,7 @@ static int do_test (void) { int result = 0; - int *ap, *bp, *cp; - + int *ap, *bp; /* Set the variable using the local exec model. */ puts ("set baz to 3 (LE)"); @@ -33,7 +33,8 @@ do_test (void) bp = TLS_IE (bar); *bp = 2; - +#if HAVE_TRAD_TLS + int *cp; /* Get variables using local dynamic model. */ fputs ("get sum of foo, bar (GD) and baz (LD)", stdout); ap = TLS_GD (foo); @@ -56,7 +57,7 @@ do_test (void) printf ("baz = %d\n", *cp); result = 1; } - +#endif result |= in_dso (); diff --git a/elf/tst-tlsmod1.c b/elf/tst-tlsmod1.c index 8d9156791b..94346415c3 100644 --- a/elf/tst-tlsmod1.c +++ b/elf/tst-tlsmod1.c @@ -1,3 +1,4 @@ +#include #include #include "tls-macros.h" @@ -14,7 +15,7 @@ int in_dso (void) { int result = 0; - int *ap, *bp, *cp; + int *ap, *bp; /* Get variables using initial exec model. */ fputs ("get sum of foo and bar (IE)", stdout); @@ -34,7 +35,8 @@ in_dso (void) result = 1; } - +#if HAVE_TRAD_TLS + int *cp; /* Get variables using generic dynamic model. */ fputs ("get sum of foo and bar and baz (GD)", stdout); ap = TLS_GD (foo); @@ -57,6 +59,7 @@ in_dso (void) printf ("baz = %d\n", *cp); result = 1; } +#endif return result; } diff --git a/elf/tst-tlsmod2.c b/elf/tst-tlsmod2.c index 40eb1407f8..8028237155 100644 --- a/elf/tst-tlsmod2.c +++ b/elf/tst-tlsmod2.c @@ -1,3 +1,4 @@ +#include #include #include "tls-macros.h" @@ -9,9 +10,10 @@ COMMON_INT_DEF(foo); int in_dso (int n, int *caller_foop) { - int *foop; int result = 0; +#if HAVE_TRAD_TLS + int *foop; puts ("foo"); /* Make sure PLT is used before macros. */ asm ("" ::: "memory"); @@ -29,6 +31,7 @@ in_dso (int n, int *caller_foop) } *foop = 16; +#endif return result; } diff --git a/elf/tst-tlsmod3.c b/elf/tst-tlsmod3.c index 6d186c47ee..d001778247 100644 --- a/elf/tst-tlsmod3.c +++ b/elf/tst-tlsmod3.c @@ -1,3 +1,4 @@ +#include #include #include "tls-macros.h" @@ -12,8 +13,10 @@ COMMON_INT_DEF(comm_n); int in_dso2 (void) { - int *foop; int result = 0; + +#if HAVE_TRAD_TLS + int *foop; static int n; int *np; @@ -32,6 +35,7 @@ in_dso2 (void) result |= in_dso (*foop = 42 + n++, foop); *foop = 16; +#endif return result; } diff --git a/elf/tst-tlsmod4.c b/elf/tst-tlsmod4.c index 86889aac7e..a31c163ca6 100644 --- a/elf/tst-tlsmod4.c +++ b/elf/tst-tlsmod4.c @@ -1,3 +1,4 @@ +#include #include #include "tls-macros.h" @@ -9,9 +10,10 @@ COMMON_INT_DEF(baz); int in_dso (int n, int *caller_bazp) { - int *bazp; int result = 0; +#if HAVE_TRAD_TLS + int *bazp; puts ("foo"); /* Make sure PLT is used before macros. */ asm ("" ::: "memory"); @@ -29,6 +31,7 @@ in_dso (int n, int *caller_bazp) } *bazp = 16; +#endif return result; } diff --git a/sysdeps/aarch64/configure b/sysdeps/aarch64/configure index 4c1fac49f3..eb62e68010 100644 --- a/sysdeps/aarch64/configure +++ b/sysdeps/aarch64/configure @@ -332,3 +332,33 @@ if test $libc_cv_aarch64_sve_asm = yes; then $as_echo "#define HAVE_AARCH64_SVE_ASM 1" >>confdefs.h fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -mtls-dialect=trad" >&5 +$as_echo_n "checking for -mtls-dialect=trad... " >&6; } +if ${libc_cv_aarch64_trad_tls+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.c <&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } + then + libc_cv_aarch64_trad_tls=yes + else + libc_cv_aarch64_trad_tls=no + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_aarch64_trad_tls" >&5 +$as_echo "$libc_cv_aarch64_trad_tls" >&6; } +if test $libc_cv_aarch64_trad_tls = no; then + $as_echo "#define HAVE_TRAD_TLS 0" >>confdefs.h + +fi diff --git a/sysdeps/aarch64/configure.ac b/sysdeps/aarch64/configure.ac index 3347c13fa1..6d3b412acc 100644 --- a/sysdeps/aarch64/configure.ac +++ b/sysdeps/aarch64/configure.ac @@ -105,3 +105,21 @@ rm -f conftest*]) if test $libc_cv_aarch64_sve_asm = yes; then AC_DEFINE(HAVE_AARCH64_SVE_ASM) fi + +# Check if both CC and LD support traditional TLS GD/LD models. +AC_CACHE_CHECK([for -mtls-dialect=trad], libc_cv_aarch64_trad_tls, [dnl +cat > conftest.c <