unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Fangrui Song via Libc-alpha <libc-alpha@sourceware.org>
To: libc-alpha@sourceware.org,
	Adhemerval Zanella <adhemerval.zanella@linaro.org>,
	Szabolcs Nagy <nsz@port70.net>
Subject: Re: [PATCH v2] aarch64: Skip traditional GD/LD TLS which are unsupported by Clang and LLD [BZ #28205]
Date: Tue, 10 Aug 2021 14:14:58 -0700	[thread overview]
Message-ID: <20210810211458.oxx3t5phzt3z3sp3@google.com> (raw)
In-Reply-To: <20210810210247.676100-1-maskray@google.com>

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 <config.h>` 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 <config.h>
  #include <stdio.h>
  
  #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 <config.h>
  #include <stdio.h>
  
  #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 <config.h>
  #include <stdio.h>
  
  #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 <config.h>
  #include <stdio.h>
  
  #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 <config.h>
  #include <stdio.h>
  
  #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 <config.h>
  #include <stdio.h>
  
  #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 <config.h>
  #include <stdio.h>
  
  #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 <<EOF
+extern __thread int i;
+void foo (void) { i = 10; }
+EOF
+  if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIC
+                     -mtls-dialect=trad -shared -o conftest.so conftest.c'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&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 <<EOF
+extern __thread int i;
+void foo (void) { i = 10; }
+EOF
+  if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIC
+                     -mtls-dialect=trad -shared -o conftest.so conftest.c])
+  then
+    libc_cv_aarch64_trad_tls=yes
+  else
+    libc_cv_aarch64_trad_tls=no
+  fi
+  rm -f conftest*])
+if test $libc_cv_aarch64_trad_tls = no; then
+  AC_DEFINE(HAVE_TRAD_TLS, 0)
+fi
-- 
2.32.0.605.g8dce9f2422-goog


  reply	other threads:[~2021-08-10 21:15 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-10 21:02 [PATCH v2] aarch64: Skip traditional GD/LD TLS which are unsupported by Clang and LLD [BZ #28205] Fangrui Song via Libc-alpha
2021-08-10 21:14 ` Fangrui Song via Libc-alpha [this message]
2021-08-11 12:17   ` Szabolcs Nagy via Libc-alpha
2021-08-11 15:57     ` Fangrui Song via Libc-alpha
2021-08-11 21:34       ` Fangrui Song via Libc-alpha

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/libc/involved.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210810211458.oxx3t5phzt3z3sp3@google.com \
    --to=libc-alpha@sourceware.org \
    --cc=adhemerval.zanella@linaro.org \
    --cc=maskray@google.com \
    --cc=nsz@port70.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).