From patchwork Tue Aug 10 21:02:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fangrui Song X-Patchwork-Id: 44632 X-Patchwork-Delegate: szabolcs.nagy@arm.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EA5273850413 for ; Tue, 10 Aug 2021 21:03:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EA5273850413 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1628629435; bh=nfX/HfaeerLXPBFJ9rD0/2YIk36YPhiK0yoNCrAqcJk=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=QyZRHnTXm6KPGj1WtKA8VzNGjodT5bP+29NsODhrGfJfelzjRkVyaYcsBmdwJ+fF9 JnX2xGDYjZEl2/o3Rj0mgbazJjNYW9n5WF4/yknM49+QnNHi4F0PUIrO58IzitH8Fs qp5VObjocNJt79QsSV1FCBHhSkG4iJZ1JIrNlSNQ= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by sourceware.org (Postfix) with ESMTPS id C8D773853819 for ; Tue, 10 Aug 2021 21:03:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C8D773853819 Received: by mail-yb1-xb4a.google.com with SMTP id f8-20020a2585480000b02905937897e3daso170067ybn.2 for ; Tue, 10 Aug 2021 14:03:23 -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:message-id:mime-version:subject:from:to:cc; bh=nfX/HfaeerLXPBFJ9rD0/2YIk36YPhiK0yoNCrAqcJk=; b=cIDdZOnWmQ7AdMbdwspDLB/6pOL8cqDapTOrOrYiyUXYSjdLisJJlGAF9xIDVsRpBh 7/Cgj5meEpy8CSoacyjIAmoVkRxxJdEN6/HUXD6qLrZKcuns05/AlZKdXeOe8HAQVXfS kQ45X3LMDTgz0mn/Alvxhgx4XHBnMhc+mFFytcFdowSxM2eEOt5GpxnjZq3t+Snm2vgm zlRnIX5ILZ1096/WNL1W166DE+hm3I0ocoGKPCW9HFUK8ECJgU4Q2bhVoP6vvb3RDcD9 9D+mVng1v+ZgmVl0Qn7sB5bev15AgsLA+t2pfONv5xALAWnSF+m1tI5cPTm3lBy90lms 7zxw== X-Gm-Message-State: AOAM532DXUuw7XM2P+jnnkgabQMo3/ODH53n5rs21LH5gVefdaaEkeGB ajtfhXjW2PUM5MKC6VTBbryk7FuD8rAJQ87oplKPImvaAcRzzPaaN/E8U6LQhN6YELiN22TS04v EOMzbE+PQ8xwQOMvU16imn2d7G+hvLt/+EVwl0oZ5Wb2A723Rc5QJxCyoxsYRhTr2U6Wd X-Google-Smtp-Source: ABdhPJwbLdVNMQePwKAyzbYCklv0vRmtwYMk7RMuaVb+zSGSlkNmry9YJ4q6TmUjO+AbCw34kXBJZwjM7WKd X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:200:69a6:3e8d:f42c:7450]) (user=maskray job=sendgmr) by 2002:a25:814f:: with SMTP id j15mr40155685ybm.358.1628629403296; Tue, 10 Aug 2021 14:03:23 -0700 (PDT) Date: Tue, 10 Aug 2021 14:02:47 -0700 Message-Id: <20210810210247.676100-1-maskray@google.com> Mime-Version: 1.0 Subject: [PATCH v2] aarch64: Skip traditional GD/LD TLS which are unsupported by Clang and LLD [BZ #28205] To: libc-alpha@sourceware.org, Adhemerval Zanella , Szabolcs Nagy X-Spam-Status: No, score=-19.6 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL 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: 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: , X-Patchwork-Original-From: Fangrui Song via Libc-alpha From: Fangrui Song Reply-To: Fangrui Song Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" 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. --- config.h.in | 3 +++ elf/tst-tls1.c | 7 +++++-- elf/tst-tls2.c | 6 ++++-- elf/tst-tls3.c | 8 ++++---- elf/tst-tlsmod1.c | 6 ++++-- elf/tst-tlsmod2.c | 4 +++- elf/tst-tlsmod3.c | 5 ++++- elf/tst-tlsmod4.c | 4 +++- sysdeps/aarch64/configure | 30 ++++++++++++++++++++++++++++++ sysdeps/aarch64/configure.ac | 18 ++++++++++++++++++ 10 files changed, 78 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..57d5ea2485 100644 --- a/elf/tst-tls1.c +++ b/elf/tst-tls1.c @@ -39,7 +39,8 @@ do_test (void) result = 1; } - + /* Clang and LLD do not support traditional GD/LD TLS on aarch64. */ +#ifdef 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 - +#ifdef 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-tls2.c b/elf/tst-tls2.c index 963b8d6c88..c9dcc084e3 100644 --- a/elf/tst-tls2.c +++ b/elf/tst-tls2.c @@ -39,7 +39,7 @@ do_test (void) result = 1; } - +#ifdef HAVE_TRAD_TLS /* Get variables using local dynamic model. */ fputs ("get sum of foo and bar (LD)", stdout); ap = TLS_LD (foo); @@ -56,8 +56,9 @@ do_test (void) printf ("bar = %d\n", *bp); result = 1; } +#endif - +#ifdef HAVE_TRAD_TLS /* Get variables using generic dynamic model. */ fputs ("get sum of foo and bar (GD)", stdout); ap = TLS_GD (foo); @@ -74,6 +75,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..6f2e144a7f 100644 --- a/elf/tst-tls3.c +++ b/elf/tst-tls3.c @@ -17,8 +17,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 +32,8 @@ do_test (void) bp = TLS_IE (bar); *bp = 2; - +#ifdef 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 +56,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..9f48e36af4 100644 --- a/elf/tst-tlsmod1.c +++ b/elf/tst-tlsmod1.c @@ -14,7 +14,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 +34,8 @@ in_dso (void) result = 1; } - +#ifdef 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 +58,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..78578ebcc2 100644 --- a/elf/tst-tlsmod2.c +++ b/elf/tst-tlsmod2.c @@ -9,9 +9,10 @@ COMMON_INT_DEF(foo); int in_dso (int n, int *caller_foop) { - int *foop; int result = 0; +#ifdef HAVE_TRAD_TLS + int *foop; puts ("foo"); /* Make sure PLT is used before macros. */ asm ("" ::: "memory"); @@ -29,6 +30,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..d9f17dbb6f 100644 --- a/elf/tst-tlsmod3.c +++ b/elf/tst-tlsmod3.c @@ -12,8 +12,10 @@ COMMON_INT_DEF(comm_n); int in_dso2 (void) { - int *foop; int result = 0; + +#ifdef HAVE_TRAD_TLS + int *foop; static int n; int *np; @@ -32,6 +34,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..27baaaf501 100644 --- a/elf/tst-tlsmod4.c +++ b/elf/tst-tlsmod4.c @@ -9,9 +9,10 @@ COMMON_INT_DEF(baz); int in_dso (int n, int *caller_bazp) { - int *bazp; int result = 0; +#ifdef HAVE_TRAD_TLS + int *bazp; puts ("foo"); /* Make sure PLT is used before macros. */ asm ("" ::: "memory"); @@ -29,6 +30,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 <