* [PATCH v2 0/3] Extending TLS testing and fixing TLS gnu2 for ARM
@ 2024-03-12 16:21 Adhemerval Zanella
2024-03-12 16:21 ` [PATCH v2 1/3] Ignore undefined symbols for -mtls-dialect=gnu2 Adhemerval Zanella
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Adhemerval Zanella @ 2024-03-12 16:21 UTC (permalink / raw)
To: libc-alpha; +Cc: Szabolcs Nagy, H . J . Lu, Arjun Shankar
A recent x86 fix for TLS descriptors [1] uncovered an ARM issue on
_dl_tlsdesc_dynamic where it fails to save/restore all possible
register.
And checking if aarch64 is also affected, I noted that the TLS
descriptor tests are only enabled iff -mtls-dialect= accepts 'gnu2'.
Since aarch64 uses a different naming for the TLS abi
(traditional/desc), some tests are not enabled. The last patch fixes
it by parametrizing the TLS descriptor dialect name.
[1] https://sourceware.org/pipermail/libc-alpha/2024-February/154995.html
Changes from v2
- Use -shared instead of -unresolved-symbols=ignore-all on configure
check.
- Extend tst-gnu2-tls2.h test for both HWCAP_ARM_VFP and
HWCAP_ARM_VFPD32.
- Use -mtls-dialect=desc for aarch64.
Adhemerval Zanella (3):
Ignore undefined symbols for -mtls-dialect=gnu2
arm: Update _dl_tlsdesc_dynamic to preserve caller-saved registers (BZ
31372)
elf: Enable TLS descriptor tests on aarch64
config.h.in | 3 +
configure | 25 ++++---
configure.ac | 17 +++--
elf/Makefile | 30 ++++----
elf/tst-gnu2-tls2.h | 4 ++
elf/tst-gnu2-tls2mod0.c | 3 +-
elf/tst-gnu2-tls2mod1.c | 3 +-
elf/tst-gnu2-tls2mod2.c | 3 +-
sysdeps/aarch64/preconfigure | 1 +
sysdeps/arm/Makefile | 8 +--
sysdeps/arm/configure | 32 +++++++++
sysdeps/arm/configure.ac | 15 ++++
sysdeps/arm/dl-tlsdesc.S | 70 ++++++++++++++++---
sysdeps/arm/tst-gnu2-tls2.h | 128 +++++++++++++++++++++++++++++++++++
14 files changed, 292 insertions(+), 50 deletions(-)
create mode 100644 sysdeps/arm/tst-gnu2-tls2.h
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/3] Ignore undefined symbols for -mtls-dialect=gnu2
2024-03-12 16:21 [PATCH v2 0/3] Extending TLS testing and fixing TLS gnu2 for ARM Adhemerval Zanella
@ 2024-03-12 16:21 ` Adhemerval Zanella
2024-03-12 16:34 ` H.J. Lu
2024-03-12 16:21 ` [PATCH v2 2/3] arm: Update _dl_tlsdesc_dynamic to preserve caller-saved registers (BZ 31372) Adhemerval Zanella
2024-03-12 16:21 ` [PATCH v2 3/3] elf: Enable TLS descriptor tests on aarch64 Adhemerval Zanella
2 siblings, 1 reply; 7+ messages in thread
From: Adhemerval Zanella @ 2024-03-12 16:21 UTC (permalink / raw)
To: libc-alpha; +Cc: Szabolcs Nagy, H . J . Lu, Arjun Shankar
So it does not fail for arm config that defaults to -mtp=soft (which
issues a call to __aeabi_read_tp).
---
configure | 2 +-
configure.ac | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/configure b/configure
index 59ff1e415d..117b48a421 100755
--- a/configure
+++ b/configure
@@ -7020,7 +7020,7 @@ void foo (void)
}
EOF
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nostartfiles
- conftest.c -o conftest 1>&5'
+ -shared conftest.c -o conftest 1>&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
ac_status=$?
diff --git a/configure.ac b/configure.ac
index 65799e5685..19b88a47a5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1297,7 +1297,7 @@ void foo (void)
}
EOF
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nostartfiles
- conftest.c -o conftest 1>&AS_MESSAGE_LOG_FD])
+ -shared conftest.c -o conftest 1>&AS_MESSAGE_LOG_FD])
then
libc_cv_mtls_dialect_gnu2=yes
else
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 2/3] arm: Update _dl_tlsdesc_dynamic to preserve caller-saved registers (BZ 31372)
2024-03-12 16:21 [PATCH v2 0/3] Extending TLS testing and fixing TLS gnu2 for ARM Adhemerval Zanella
2024-03-12 16:21 ` [PATCH v2 1/3] Ignore undefined symbols for -mtls-dialect=gnu2 Adhemerval Zanella
@ 2024-03-12 16:21 ` Adhemerval Zanella
2024-03-12 16:35 ` H.J. Lu
2024-03-12 16:21 ` [PATCH v2 3/3] elf: Enable TLS descriptor tests on aarch64 Adhemerval Zanella
2 siblings, 1 reply; 7+ messages in thread
From: Adhemerval Zanella @ 2024-03-12 16:21 UTC (permalink / raw)
To: libc-alpha; +Cc: Szabolcs Nagy, H . J . Lu, Arjun Shankar
ARM _dl_tlsdesc_dynamic slow path has two issues:
* The ip/r12 is defined by AAPCS as a scratch register, and gcc is
used to save the stack pointer before on some function calls. So it
should also be saved/restored as well. It fixes the tst-gnu2-tls2.
* None of the possible VFP registers are saved/restored. ARM has the
additional complexity to have different VFP bank sizes (depending of
VFP support by the chip).
The tst-gnu2-tls2 test is extended to check for VFP registers, although
only for hardfp builds. Different than setcontext, _dl_tlsdesc_dynamic
does not have HWCAP_ARM_IWMMXT (I don't have a way to properly test
it and it is almost a decade since newer hardware was released).
With this patch there is no need to mark tst-gnu2-tls2 as XFAIL.
Checked on arm-linux-gnueabihf.
---
config.h.in | 3 +
elf/Makefile | 4 --
elf/tst-gnu2-tls2.h | 4 ++
elf/tst-gnu2-tls2mod0.c | 3 +-
elf/tst-gnu2-tls2mod1.c | 3 +-
elf/tst-gnu2-tls2mod2.c | 3 +-
sysdeps/arm/configure | 32 +++++++++
sysdeps/arm/configure.ac | 15 +++++
sysdeps/arm/dl-tlsdesc.S | 70 +++++++++++++++++---
sysdeps/arm/tst-gnu2-tls2.h | 128 ++++++++++++++++++++++++++++++++++++
10 files changed, 250 insertions(+), 15 deletions(-)
create mode 100644 sysdeps/arm/tst-gnu2-tls2.h
diff --git a/config.h.in b/config.h.in
index 2f0669e19b..cf4212f5eb 100644
--- a/config.h.in
+++ b/config.h.in
@@ -141,6 +141,9 @@
/* LOONGARCH floating-point ABI for ld.so. */
#undef LOONGARCH_ABI_FRLEN
+/* Define whether ARM used hard-float and support VFPvX-D32. */
+#undef HAVE_ARM_PCS_VFP_D32
+
/* Linux specific: minimum supported kernel version. */
#undef __LINUX_KERNEL_VERSION
diff --git a/elf/Makefile b/elf/Makefile
index 520a270f0f..393a27ef2a 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -3059,10 +3059,6 @@ $(objpfx)tst-gnu2-tls2.out: \
$(objpfx)tst-gnu2-tls2mod2.so
ifeq (yes,$(have-mtls-dialect-gnu2))
-# This test fails if dl_tlsdesc_dynamic doesn't preserve all caller-saved
-# registers. See https://sourceware.org/bugzilla/show_bug.cgi?id=31372
-test-xfail-tst-gnu2-tls2 = yes
-
CFLAGS-tst-tlsgap-mod0.c += -mtls-dialect=gnu2
CFLAGS-tst-tlsgap-mod1.c += -mtls-dialect=gnu2
CFLAGS-tst-tlsgap-mod2.c += -mtls-dialect=gnu2
diff --git a/elf/tst-gnu2-tls2.h b/elf/tst-gnu2-tls2.h
index 77964a57a3..1ade8151e2 100644
--- a/elf/tst-gnu2-tls2.h
+++ b/elf/tst-gnu2-tls2.h
@@ -27,6 +27,10 @@ extern struct tls *apply_tls (struct tls *);
/* An architecture can define them to verify that clobber caller-saved
registers aren't changed by the implicit TLSDESC call. */
+#ifndef INIT_TLSDESC_CALL
+# define INIT_TLSDESC_CALL()
+#endif
+
#ifndef BEFORE_TLSDESC_CALL
# define BEFORE_TLSDESC_CALL()
#endif
diff --git a/elf/tst-gnu2-tls2mod0.c b/elf/tst-gnu2-tls2mod0.c
index 45556a0e17..3fe3c14277 100644
--- a/elf/tst-gnu2-tls2mod0.c
+++ b/elf/tst-gnu2-tls2mod0.c
@@ -16,13 +16,14 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include "tst-gnu2-tls2.h"
+#include <tst-gnu2-tls2.h>
__thread struct tls tls_var0 __attribute__ ((visibility ("hidden")));
struct tls *
apply_tls (struct tls *p)
{
+ INIT_TLSDESC_CALL ();
BEFORE_TLSDESC_CALL ();
tls_var0 = *p;
struct tls *ret = &tls_var0;
diff --git a/elf/tst-gnu2-tls2mod1.c b/elf/tst-gnu2-tls2mod1.c
index e10b9dbc0a..e210538468 100644
--- a/elf/tst-gnu2-tls2mod1.c
+++ b/elf/tst-gnu2-tls2mod1.c
@@ -16,13 +16,14 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include "tst-gnu2-tls2.h"
+#include <tst-gnu2-tls2.h>
__thread struct tls tls_var1[100] __attribute__ ((visibility ("hidden")));
struct tls *
apply_tls (struct tls *p)
{
+ INIT_TLSDESC_CALL ();
BEFORE_TLSDESC_CALL ();
tls_var1[1] = *p;
struct tls *ret = &tls_var1[1];
diff --git a/elf/tst-gnu2-tls2mod2.c b/elf/tst-gnu2-tls2mod2.c
index 141af51e55..6d3031dc5f 100644
--- a/elf/tst-gnu2-tls2mod2.c
+++ b/elf/tst-gnu2-tls2mod2.c
@@ -16,13 +16,14 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include "tst-gnu2-tls2.h"
+#include <tst-gnu2-tls2.h>
__thread struct tls tls_var2 __attribute__ ((visibility ("hidden")));
struct tls *
apply_tls (struct tls *p)
{
+ INIT_TLSDESC_CALL ();
BEFORE_TLSDESC_CALL ();
tls_var2 = *p;
struct tls *ret = &tls_var2;
diff --git a/sysdeps/arm/configure b/sysdeps/arm/configure
index 35e2918922..4ef4d46cbd 100644
--- a/sysdeps/arm/configure
+++ b/sysdeps/arm/configure
@@ -187,6 +187,38 @@ else
default-abi = soft"
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether VFP supports 32 registers" >&5
+printf %s "checking whether VFP supports 32 registers... " >&6; }
+if test ${libc_cv_arm_pcs_vfp_d32+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+void foo (void)
+{
+ asm volatile ("vldr d16,=17" : : : "d16");
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ libc_cv_arm_pcs_vfp_d32=yes
+else $as_nop
+ libc_cv_arm_pcs_vfp_d32=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_arm_pcs_vfp_d32" >&5
+printf "%s\n" "$libc_cv_arm_pcs_vfp_d32" >&6; }
+if test "$libc_cv_arm_pcs_vfp_d32" = yes ;
+then
+ printf "%s\n" "#define HAVE_ARM_PCS_VFP_D32 1" >>confdefs.h
+
+fi
+
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether PC-relative relocs in movw/movt work properly" >&5
printf %s "checking whether PC-relative relocs in movw/movt work properly... " >&6; }
if test ${libc_cv_arm_pcrel_movw+y}
diff --git a/sysdeps/arm/configure.ac b/sysdeps/arm/configure.ac
index 5172e30bbe..cd00ddc9d9 100644
--- a/sysdeps/arm/configure.ac
+++ b/sysdeps/arm/configure.ac
@@ -21,6 +21,21 @@ else
LIBC_CONFIG_VAR([default-abi], [soft])
fi
+AC_CACHE_CHECK([whether VFP supports 32 registers],
+ libc_cv_arm_pcs_vfp_d32, [
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+void foo (void)
+{
+ asm volatile ("vldr d16,=17" : : : "d16");
+}
+]])],
+ [libc_cv_arm_pcs_vfp_d32=yes],
+ [libc_cv_arm_pcs_vfp_d32=no])])
+if test "$libc_cv_arm_pcs_vfp_d32" = yes ;
+then
+ AC_DEFINE(HAVE_ARM_PCS_VFP_D32)
+fi
+
AC_CACHE_CHECK([whether PC-relative relocs in movw/movt work properly],
libc_cv_arm_pcrel_movw, [
cat > conftest.s <<\EOF
diff --git a/sysdeps/arm/dl-tlsdesc.S b/sysdeps/arm/dl-tlsdesc.S
index 764c56e70f..ada106521d 100644
--- a/sysdeps/arm/dl-tlsdesc.S
+++ b/sysdeps/arm/dl-tlsdesc.S
@@ -19,6 +19,7 @@
#include <sysdep.h>
#include <arm-features.h>
#include <tls.h>
+#include <rtld-global-offsets.h>
#include "tlsdesc.h"
.text
@@ -83,14 +84,20 @@ _dl_tlsdesc_dynamic(struct tlsdesc *tdp)
.align 2
_dl_tlsdesc_dynamic:
/* Our calling convention is to clobber r0, r1 and the processor
- flags. All others that are modified must be saved */
- eabi_save ({r2,r3,r4,lr})
- push {r2,r3,r4,lr}
- cfi_adjust_cfa_offset (16)
+ flags. All others that are modified must be saved. r5 is
+ used as the hwcap value to avoid reload after __tls_get_addr
+ call. If required we will save the vector register on the slow
+ path. */
+ eabi_save ({r2,r3,r4,r5,ip,lr})
+ push {r2,r3,r4,r5,ip,lr}
+ cfi_adjust_cfa_offset (24)
cfi_rel_offset (r2,0)
cfi_rel_offset (r3,4)
cfi_rel_offset (r4,8)
- cfi_rel_offset (lr,12)
+ cfi_rel_offset (r5,12)
+ cfi_rel_offset (ip,16)
+ cfi_rel_offset (lr,20)
+
ldr r1, [r0] /* td */
GET_TLS (lr)
mov r4, r0 /* r4 = tp */
@@ -113,22 +120,69 @@ _dl_tlsdesc_dynamic:
rsbne r0, r4, r3
bne 2f
1: mov r0, r1
+
+ /* Load the hwcap to check for vector support. */
+ ldr r2, 3f
+ ldr r1, .Lrtld_global_ro
+0: add r2, pc, r2
+ ldr r2, [r2, r1]
+ ldr r5, [r2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
+
+#ifdef __SOFTFP__
+ tst r5, #HWCAP_ARM_VFP
+ beq .Lno_vfp
+#endif
+
+ /* Store the VFP registers. Don't use VFP instructions directly
+ because this code is used in non-VFP multilibs. */
+#define VFP_STACK_REQ (32*8 + 8)
+ sub sp, sp, VFP_STACK_REQ
+ cfi_adjust_cfa_offset (VFP_STACK_REQ)
+ mov r3, sp
+ .inst 0xeca30b20 /* vstmia r3!, {d0-d15} */
+ tst r5, #HWCAP_ARM_VFPD32
+ beq 4f
+ .inst 0xece30b20 /* vstmia r3!, {d16-d31} */
+ /* Store the floating-point status register. */
+4: .inst 0xeef12a10 /* vmrs r2, fpscr */
+ str r2, [r3]
+.Lno_vfp:
bl __tls_get_addr
rsb r0, r4, r0
+#ifdef __SOFTFP__
+ tst r5, #HWCAP_ARM_VFP
+ beq 2f
+#endif
+ mov r3, sp
+ .inst 0xecb30b20 /* vldmia r3!, {d0-d15} */
+ tst r5, #HWCAP_ARM_VFPD32
+ beq 5f
+ .inst 0xecf30b20 /* vldmia r3!, {d16-d31} */
+ ldr r4, [r3]
+5: .inst 0xeee14a10 /* vmsr fpscr, r4 */
+ add sp, sp, VFP_STACK_REQ
+ cfi_adjust_cfa_offset (-VFP_STACK_REQ)
+
2:
#if ((defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)) \
|| defined (ARM_ALWAYS_BX))
- pop {r2,r3,r4, lr}
- cfi_adjust_cfa_offset (-16)
+ pop {r2,r3,r4,r5,ip, lr}
+ cfi_adjust_cfa_offset (-20)
cfi_restore (lr)
+ cfi_restore (ip)
+ cfi_restore (r5)
cfi_restore (r4)
cfi_restore (r3)
cfi_restore (r2)
bx lr
#else
- pop {r2,r3,r4, pc}
+ pop {r2,r3,r4,r5,ip, pc}
#endif
eabi_fnend
cfi_endproc
.size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
+
+3: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS
+.Lrtld_global_ro:
+ .long C_SYMBOL_NAME(_rtld_global_ro)(GOT)
#endif /* SHARED */
diff --git a/sysdeps/arm/tst-gnu2-tls2.h b/sysdeps/arm/tst-gnu2-tls2.h
new file mode 100644
index 0000000000..e413ac21fb
--- /dev/null
+++ b/sysdeps/arm/tst-gnu2-tls2.h
@@ -0,0 +1,128 @@
+/* Test TLSDESC relocation. ARM version.
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <sys/auxv.h>
+#include <string.h>
+#include <stdlib.h>
+#include <endian.h>
+
+#ifndef __SOFTFP__
+
+# ifdef HAVE_ARM_PCS_VFP_D32
+# define SAVE_VFP_D32 \
+ asm volatile ("vldr d16,=17" : : : "d16"); \
+ asm volatile ("vldr d17,=18" : : : "d17"); \
+ asm volatile ("vldr d18,=19" : : : "d18"); \
+ asm volatile ("vldr d19,=20" : : : "d19"); \
+ asm volatile ("vldr d20,=21" : : : "d20"); \
+ asm volatile ("vldr d21,=22" : : : "d21"); \
+ asm volatile ("vldr d22,=23" : : : "d22"); \
+ asm volatile ("vldr d23,=24" : : : "d23"); \
+ asm volatile ("vldr d24,=25" : : : "d24"); \
+ asm volatile ("vldr d25,=26" : : : "d25"); \
+ asm volatile ("vldr d26,=27" : : : "d26"); \
+ asm volatile ("vldr d27,=28" : : : "d27"); \
+ asm volatile ("vldr d28,=29" : : : "d28"); \
+ asm volatile ("vldr d29,=30" : : : "d29"); \
+ asm volatile ("vldr d30,=31" : : : "d30"); \
+ asm volatile ("vldr d31,=32" : : : "d31");
+# else
+# define SAVE_VFP_D32
+# endif
+
+# define INIT_TLSDESC_CALL() \
+ unsigned long hwcap = getauxval (AT_HWCAP)
+
+/* Set each vector register to a value from 1 to 32 before the TLS access,
+ dump to memory after TLS access, and compare with the expected values. */
+
+# define BEFORE_TLSDESC_CALL() \
+ if (hwcap & HWCAP_ARM_VFP) \
+ { \
+ asm volatile ("vldr d0,=1" : : : "d0"); \
+ asm volatile ("vldr d1,=2" : : : "d1"); \
+ asm volatile ("vldr d2,=3" : : : "d1"); \
+ asm volatile ("vldr d3,=4" : : : "d3"); \
+ asm volatile ("vldr d4,=5" : : : "d4"); \
+ asm volatile ("vldr d5,=6" : : : "d5"); \
+ asm volatile ("vldr d6,=7" : : : "d6"); \
+ asm volatile ("vldr d7,=8" : : : "d7"); \
+ asm volatile ("vldr d8,=9" : : : "d8"); \
+ asm volatile ("vldr d9,=10" : : : "d9"); \
+ asm volatile ("vldr d10,=11" : : : "d10"); \
+ asm volatile ("vldr d11,=12" : : : "d11"); \
+ asm volatile ("vldr d12,=13" : : : "d12"); \
+ asm volatile ("vldr d13,=14" : : : "d13"); \
+ asm volatile ("vldr d14,=15" : : : "d14"); \
+ asm volatile ("vldr d15,=16" : : : "d15"); \
+ } \
+ if (hwcap & HWCAP_ARM_VFPD32) \
+ { \
+ SAVE_VFP_D32 \
+ }
+
+# define VFP_STACK_REQ (16*8)
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define DISP 7
+# else
+# define DISP 0
+# endif
+
+# ifdef HAVE_ARM_PCS_VFP_D32
+# define CHECK_VFP_D32 \
+ char vfp[VFP_STACK_REQ]; \
+ asm volatile ("vstmia %0, {d16-d31}\n" \
+ : \
+ : "r" (vfp) \
+ : "memory"); \
+ \
+ char expected[VFP_STACK_REQ] = { 0 }; \
+ for (int i = 0; i < 16; ++i) \
+ expected[i * 8 + DISP] = i + 17; \
+ \
+ if (memcmp (vfp, expected, VFP_STACK_REQ) != 0) \
+ abort ();
+# else
+# define CHECK_VFP_D32
+# endif
+
+# define AFTER_TLSDESC_CALL() \
+ if (hwcap & HWCAP_ARM_VFP) \
+ { \
+ char vfp[VFP_STACK_REQ]; \
+ asm volatile ("vstmia %0, {d0-d15}\n" \
+ : \
+ : "r" (vfp) \
+ : "memory"); \
+ \
+ char expected[VFP_STACK_REQ] = { 0 }; \
+ for (int i = 0; i < 16; ++i) \
+ expected[i * 8 + DISP] = i + 1; \
+ \
+ if (memcmp (vfp, expected, VFP_STACK_REQ) != 0) \
+ abort (); \
+ } \
+ if (hwcap & HWCAP_ARM_VFPD32) \
+ { \
+ CHECK_VFP_D32 \
+ }
+
+#endif /* __SOFTFP__ */
+
+#include_next <tst-gnu2-tls2.h>
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 3/3] elf: Enable TLS descriptor tests on aarch64
2024-03-12 16:21 [PATCH v2 0/3] Extending TLS testing and fixing TLS gnu2 for ARM Adhemerval Zanella
2024-03-12 16:21 ` [PATCH v2 1/3] Ignore undefined symbols for -mtls-dialect=gnu2 Adhemerval Zanella
2024-03-12 16:21 ` [PATCH v2 2/3] arm: Update _dl_tlsdesc_dynamic to preserve caller-saved registers (BZ 31372) Adhemerval Zanella
@ 2024-03-12 16:21 ` Adhemerval Zanella
2024-03-12 16:38 ` H.J. Lu
2 siblings, 1 reply; 7+ messages in thread
From: Adhemerval Zanella @ 2024-03-12 16:21 UTC (permalink / raw)
To: libc-alpha; +Cc: Szabolcs Nagy, H . J . Lu, Arjun Shankar
The aarch64 uses 'trad' for traditional tls and 'desc' for tls
descriptors, but unlike other targets it defaults to 'desc'. The
gnutls2 configure check does not set aarch64 as an ABI that uses
TLS descriptors, which then disable somes stests.
Also rename the internal machinery fron gnu2 to tls descriptors.
Checked on aarch64-linux-gnu.
---
configure | 23 +++++++++++++----------
configure.ac | 15 +++++++++------
elf/Makefile | 26 +++++++++++++-------------
sysdeps/aarch64/preconfigure | 1 +
sysdeps/arm/Makefile | 8 ++++----
5 files changed, 40 insertions(+), 33 deletions(-)
diff --git a/configure b/configure
index 117b48a421..432e40a592 100755
--- a/configure
+++ b/configure
@@ -653,7 +653,7 @@ LIBGD
libc_cv_cc_loop_to_function
libc_cv_cc_submachine
libc_cv_cc_nofma
-libc_cv_mtls_dialect_gnu2
+libc_cv_mtls_descriptor
libc_cv_has_glob_dat
libc_cv_fpie
libc_cv_z_execstack
@@ -4760,6 +4760,9 @@ libc_config_ok=no
# whether to use such directories.
with_fp_cond=1
+# A preconfigure script may define another name to TLS descriptor variant
+mtls_descriptor=gnu2
+
if frags=`ls -d $srcdir/sysdeps/*/preconfigure 2> /dev/null`
then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysdeps preconfigure fragments" >&5
@@ -7006,9 +7009,9 @@ fi
printf "%s\n" "$libc_cv_has_glob_dat" >&6; }
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -mtls-dialect=gnu2" >&5
-printf %s "checking for -mtls-dialect=gnu2... " >&6; }
-if test ${libc_cv_mtls_dialect_gnu2+y}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tls descriptor support" >&5
+printf %s "checking for tls descriptor support... " >&6; }
+if test ${libc_cv_mtls_descriptor+y}
then :
printf %s "(cached) " >&6
else $as_nop
@@ -7019,7 +7022,7 @@ void foo (void)
i = 10;
}
EOF
-if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nostartfiles
+if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=$mtls_descriptor -nostdlib -nostartfiles
-shared conftest.c -o conftest 1>&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
@@ -7027,17 +7030,17 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nost
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }
then
- libc_cv_mtls_dialect_gnu2=yes
+ libc_cv_mtls_descriptor=$mtls_descriptor
else
- libc_cv_mtls_dialect_gnu2=no
+ libc_cv_mtls_descriptor=no
fi
rm -f conftest*
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mtls_dialect_gnu2" >&5
-printf "%s\n" "$libc_cv_mtls_dialect_gnu2" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mtls_descriptor" >&5
+printf "%s\n" "$libc_cv_mtls_descriptor" >&6; }
config_vars="$config_vars
-have-mtls-dialect-gnu2 = $libc_cv_mtls_dialect_gnu2"
+have-mtls-descriptor = $libc_cv_mtls_descriptor"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if -Wno-ignored-attributes is required for aliases" >&5
printf %s "checking if -Wno-ignored-attributes is required for aliases... " >&6; }
diff --git a/configure.ac b/configure.ac
index 19b88a47a5..bdc385d03c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -442,6 +442,9 @@ libc_config_ok=no
# whether to use such directories.
with_fp_cond=1
+# A preconfigure script may define another name to TLS descriptor variant
+mtls_descriptor=gnu2
+
dnl Let sysdeps/*/preconfigure act here.
LIBC_PRECONFIGURE([$srcdir], [for sysdeps])
@@ -1287,7 +1290,7 @@ fi
rm -f conftest*])
AC_SUBST(libc_cv_has_glob_dat)
-AC_CACHE_CHECK([for -mtls-dialect=gnu2], libc_cv_mtls_dialect_gnu2,
+AC_CACHE_CHECK([for tls descriptor support], libc_cv_mtls_descriptor,
[dnl
cat > conftest.c <<EOF
__thread int i;
@@ -1296,16 +1299,16 @@ void foo (void)
i = 10;
}
EOF
-if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nostartfiles
+if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=$mtls_descriptor -nostdlib -nostartfiles
-shared conftest.c -o conftest 1>&AS_MESSAGE_LOG_FD])
then
- libc_cv_mtls_dialect_gnu2=yes
+ libc_cv_mtls_descriptor=$mtls_descriptor
else
- libc_cv_mtls_dialect_gnu2=no
+ libc_cv_mtls_descriptor=no
fi
rm -f conftest*])
-AC_SUBST(libc_cv_mtls_dialect_gnu2)
-LIBC_CONFIG_VAR([have-mtls-dialect-gnu2], [$libc_cv_mtls_dialect_gnu2])
+AC_SUBST(libc_cv_mtls_descriptor)
+LIBC_CONFIG_VAR([have-mtls-descriptor], [$libc_cv_mtls_descriptor])
dnl clang emits an warning for a double alias redirection, to warn the
dnl original symbol is sed even when weak definition overrides it.
diff --git a/elf/Makefile b/elf/Makefile
index 393a27ef2a..4f1903391a 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -1001,13 +1001,13 @@ modules-names-tests = $(filter-out ifuncmod% tst-tlsmod%,\
# For +depfiles in Makerules.
extra-test-objs += tst-auditmod17.os
-ifeq (yes,$(have-mtls-dialect-gnu2))
+ifneq (no,$(have-mtls-descriptor))
tests += tst-gnu2-tls1
modules-names += tst-gnu2-tls1mod
$(objpfx)tst-gnu2-tls1: $(objpfx)tst-gnu2-tls1mod.so
tst-gnu2-tls1mod.so-no-z-defs = yes
-CFLAGS-tst-gnu2-tls1mod.c += -mtls-dialect=gnu2
-endif # $(have-mtls-dialect-gnu2)
+CFLAGS-tst-gnu2-tls1mod.c += -mtls-dialect=$(have-mtls-descriptor)
+endif # $(have-mtls-descriptor)
ifeq (yes,$(have-protected-data))
modules-names += tst-protected1moda tst-protected1modb
@@ -2975,11 +2975,11 @@ $(objpfx)tst-tls-allocation-failure-static-patched.out: \
$(objpfx)tst-audit-tlsdesc: $(objpfx)tst-audit-tlsdesc-mod1.so \
$(objpfx)tst-audit-tlsdesc-mod2.so \
$(shared-thread-library)
-ifeq (yes,$(have-mtls-dialect-gnu2))
+ifneq (no,$(have-mtls-descriptor))
# The test is valid for all TLS types, but we want to exercise GNU2
# TLS if possible.
-CFLAGS-tst-audit-tlsdesc-mod1.c += -mtls-dialect=gnu2
-CFLAGS-tst-audit-tlsdesc-mod2.c += -mtls-dialect=gnu2
+CFLAGS-tst-audit-tlsdesc-mod1.c += -mtls-dialect=$(have-mtls-descriptor)
+CFLAGS-tst-audit-tlsdesc-mod2.c += -mtls-dialect=$(have-mtls-descriptor)
endif
$(objpfx)tst-audit-tlsdesc-dlopen: $(shared-thread-library)
$(objpfx)tst-audit-tlsdesc-dlopen.out: $(objpfx)tst-audit-tlsdesc-mod1.so \
@@ -3058,11 +3058,11 @@ $(objpfx)tst-gnu2-tls2.out: \
$(objpfx)tst-gnu2-tls2mod1.so \
$(objpfx)tst-gnu2-tls2mod2.so
-ifeq (yes,$(have-mtls-dialect-gnu2))
-CFLAGS-tst-tlsgap-mod0.c += -mtls-dialect=gnu2
-CFLAGS-tst-tlsgap-mod1.c += -mtls-dialect=gnu2
-CFLAGS-tst-tlsgap-mod2.c += -mtls-dialect=gnu2
-CFLAGS-tst-gnu2-tls2mod0.c += -mtls-dialect=gnu2
-CFLAGS-tst-gnu2-tls2mod1.c += -mtls-dialect=gnu2
-CFLAGS-tst-gnu2-tls2mod2.c += -mtls-dialect=gnu2
+ifneq (no,$(have-mtls-descriptor))
+CFLAGS-tst-tlsgap-mod0.c += -mtls-dialect=$(have-mtls-descriptor)
+CFLAGS-tst-tlsgap-mod1.c += -mtls-dialect=$(have-mtls-descriptor)
+CFLAGS-tst-tlsgap-mod2.c += -mtls-dialect=$(have-mtls-descriptor)
+CFLAGS-tst-gnu2-tls2mod0.c += -mtls-dialect=$(have-mtls-descriptor)
+CFLAGS-tst-gnu2-tls2mod1.c += -mtls-dialect=$(have-mtls-descriptor)
+CFLAGS-tst-gnu2-tls2mod2.c += -mtls-dialect=$(have-mtls-descriptor)
endif
diff --git a/sysdeps/aarch64/preconfigure b/sysdeps/aarch64/preconfigure
index d9bd1f8558..19657b627b 100644
--- a/sysdeps/aarch64/preconfigure
+++ b/sysdeps/aarch64/preconfigure
@@ -2,5 +2,6 @@ case "$machine" in
aarch64*)
base_machine=aarch64
machine=aarch64
+ mtls_descriptor=desc
;;
esac
diff --git a/sysdeps/arm/Makefile b/sysdeps/arm/Makefile
index d5cea717a9..619474eca9 100644
--- a/sysdeps/arm/Makefile
+++ b/sysdeps/arm/Makefile
@@ -13,15 +13,15 @@ $(objpfx)libgcc-stubs.a: $(objpfx)aeabi_unwind_cpp_pr1.os
lib-noranlib: $(objpfx)libgcc-stubs.a
ifeq ($(build-shared),yes)
-ifeq (yes,$(have-mtls-dialect-gnu2))
+ifneq (no,$(have-mtls-descriptor))
tests += tst-armtlsdescloc tst-armtlsdescextnow tst-armtlsdescextlazy
modules-names += tst-armtlsdesclocmod
modules-names += tst-armtlsdescextlazymod tst-armtlsdescextnowmod
CPPFLAGS-tst-armtlsdescextnowmod.c += -Dstatic=
CPPFLAGS-tst-armtlsdescextlazymod.c += -Dstatic=
-CFLAGS-tst-armtlsdesclocmod.c += -mtls-dialect=gnu2
-CFLAGS-tst-armtlsdescextnowmod.c += -mtls-dialect=gnu2
-CFLAGS-tst-armtlsdescextlazymod.c += -mtls-dialect=gnu2
+CFLAGS-tst-armtlsdesclocmod.c += -mtls-dialect=$(have-mtls-descriptor)
+CFLAGS-tst-armtlsdescextnowmod.c += -mtls-dialect=$(have-mtls-descriptor)
+CFLAGS-tst-armtlsdescextlazymod.c += -mtls-dialect=$(have-mtls-descriptor)
LDFLAGS-tst-armtlsdescextnowmod.so += -Wl,-z,now
tst-armtlsdescloc-ENV = LD_BIND_NOW=1
tst-armtlsdescextnow-ENV = LD_BIND_NOW=1
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/3] Ignore undefined symbols for -mtls-dialect=gnu2
2024-03-12 16:21 ` [PATCH v2 1/3] Ignore undefined symbols for -mtls-dialect=gnu2 Adhemerval Zanella
@ 2024-03-12 16:34 ` H.J. Lu
0 siblings, 0 replies; 7+ messages in thread
From: H.J. Lu @ 2024-03-12 16:34 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: libc-alpha, Szabolcs Nagy, Arjun Shankar
On Tue, Mar 12, 2024 at 9:21 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> So it does not fail for arm config that defaults to -mtp=soft (which
> issues a call to __aeabi_read_tp).
> ---
> configure | 2 +-
> configure.ac | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/configure b/configure
> index 59ff1e415d..117b48a421 100755
> --- a/configure
> +++ b/configure
> @@ -7020,7 +7020,7 @@ void foo (void)
> }
> EOF
> if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nostartfiles
> - conftest.c -o conftest 1>&5'
> + -shared conftest.c -o conftest 1>&5'
> { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> (eval $ac_try) 2>&5
> ac_status=$?
> diff --git a/configure.ac b/configure.ac
> index 65799e5685..19b88a47a5 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1297,7 +1297,7 @@ void foo (void)
> }
> EOF
> if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nostartfiles
> - conftest.c -o conftest 1>&AS_MESSAGE_LOG_FD])
> + -shared conftest.c -o conftest 1>&AS_MESSAGE_LOG_FD])
> then
> libc_cv_mtls_dialect_gnu2=yes
> else
> --
> 2.34.1
>
LGTM.
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Thanks.
--
H.J.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/3] arm: Update _dl_tlsdesc_dynamic to preserve caller-saved registers (BZ 31372)
2024-03-12 16:21 ` [PATCH v2 2/3] arm: Update _dl_tlsdesc_dynamic to preserve caller-saved registers (BZ 31372) Adhemerval Zanella
@ 2024-03-12 16:35 ` H.J. Lu
0 siblings, 0 replies; 7+ messages in thread
From: H.J. Lu @ 2024-03-12 16:35 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: libc-alpha, Szabolcs Nagy, Arjun Shankar
On Tue, Mar 12, 2024 at 9:21 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> ARM _dl_tlsdesc_dynamic slow path has two issues:
>
> * The ip/r12 is defined by AAPCS as a scratch register, and gcc is
> used to save the stack pointer before on some function calls. So it
> should also be saved/restored as well. It fixes the tst-gnu2-tls2.
>
> * None of the possible VFP registers are saved/restored. ARM has the
> additional complexity to have different VFP bank sizes (depending of
> VFP support by the chip).
>
> The tst-gnu2-tls2 test is extended to check for VFP registers, although
> only for hardfp builds. Different than setcontext, _dl_tlsdesc_dynamic
> does not have HWCAP_ARM_IWMMXT (I don't have a way to properly test
> it and it is almost a decade since newer hardware was released).
>
> With this patch there is no need to mark tst-gnu2-tls2 as XFAIL.
>
> Checked on arm-linux-gnueabihf.
> ---
> config.h.in | 3 +
> elf/Makefile | 4 --
> elf/tst-gnu2-tls2.h | 4 ++
> elf/tst-gnu2-tls2mod0.c | 3 +-
> elf/tst-gnu2-tls2mod1.c | 3 +-
> elf/tst-gnu2-tls2mod2.c | 3 +-
> sysdeps/arm/configure | 32 +++++++++
> sysdeps/arm/configure.ac | 15 +++++
> sysdeps/arm/dl-tlsdesc.S | 70 +++++++++++++++++---
> sysdeps/arm/tst-gnu2-tls2.h | 128 ++++++++++++++++++++++++++++++++++++
> 10 files changed, 250 insertions(+), 15 deletions(-)
> create mode 100644 sysdeps/arm/tst-gnu2-tls2.h
>
> diff --git a/config.h.in b/config.h.in
> index 2f0669e19b..cf4212f5eb 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -141,6 +141,9 @@
> /* LOONGARCH floating-point ABI for ld.so. */
> #undef LOONGARCH_ABI_FRLEN
>
> +/* Define whether ARM used hard-float and support VFPvX-D32. */
> +#undef HAVE_ARM_PCS_VFP_D32
> +
> /* Linux specific: minimum supported kernel version. */
> #undef __LINUX_KERNEL_VERSION
>
> diff --git a/elf/Makefile b/elf/Makefile
> index 520a270f0f..393a27ef2a 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -3059,10 +3059,6 @@ $(objpfx)tst-gnu2-tls2.out: \
> $(objpfx)tst-gnu2-tls2mod2.so
>
> ifeq (yes,$(have-mtls-dialect-gnu2))
> -# This test fails if dl_tlsdesc_dynamic doesn't preserve all caller-saved
> -# registers. See https://sourceware.org/bugzilla/show_bug.cgi?id=31372
> -test-xfail-tst-gnu2-tls2 = yes
> -
> CFLAGS-tst-tlsgap-mod0.c += -mtls-dialect=gnu2
> CFLAGS-tst-tlsgap-mod1.c += -mtls-dialect=gnu2
> CFLAGS-tst-tlsgap-mod2.c += -mtls-dialect=gnu2
> diff --git a/elf/tst-gnu2-tls2.h b/elf/tst-gnu2-tls2.h
> index 77964a57a3..1ade8151e2 100644
> --- a/elf/tst-gnu2-tls2.h
> +++ b/elf/tst-gnu2-tls2.h
> @@ -27,6 +27,10 @@ extern struct tls *apply_tls (struct tls *);
>
> /* An architecture can define them to verify that clobber caller-saved
> registers aren't changed by the implicit TLSDESC call. */
> +#ifndef INIT_TLSDESC_CALL
> +# define INIT_TLSDESC_CALL()
> +#endif
> +
> #ifndef BEFORE_TLSDESC_CALL
> # define BEFORE_TLSDESC_CALL()
> #endif
> diff --git a/elf/tst-gnu2-tls2mod0.c b/elf/tst-gnu2-tls2mod0.c
> index 45556a0e17..3fe3c14277 100644
> --- a/elf/tst-gnu2-tls2mod0.c
> +++ b/elf/tst-gnu2-tls2mod0.c
> @@ -16,13 +16,14 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> -#include "tst-gnu2-tls2.h"
> +#include <tst-gnu2-tls2.h>
>
> __thread struct tls tls_var0 __attribute__ ((visibility ("hidden")));
>
> struct tls *
> apply_tls (struct tls *p)
> {
> + INIT_TLSDESC_CALL ();
> BEFORE_TLSDESC_CALL ();
> tls_var0 = *p;
> struct tls *ret = &tls_var0;
> diff --git a/elf/tst-gnu2-tls2mod1.c b/elf/tst-gnu2-tls2mod1.c
> index e10b9dbc0a..e210538468 100644
> --- a/elf/tst-gnu2-tls2mod1.c
> +++ b/elf/tst-gnu2-tls2mod1.c
> @@ -16,13 +16,14 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> -#include "tst-gnu2-tls2.h"
> +#include <tst-gnu2-tls2.h>
>
> __thread struct tls tls_var1[100] __attribute__ ((visibility ("hidden")));
>
> struct tls *
> apply_tls (struct tls *p)
> {
> + INIT_TLSDESC_CALL ();
> BEFORE_TLSDESC_CALL ();
> tls_var1[1] = *p;
> struct tls *ret = &tls_var1[1];
> diff --git a/elf/tst-gnu2-tls2mod2.c b/elf/tst-gnu2-tls2mod2.c
> index 141af51e55..6d3031dc5f 100644
> --- a/elf/tst-gnu2-tls2mod2.c
> +++ b/elf/tst-gnu2-tls2mod2.c
> @@ -16,13 +16,14 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> -#include "tst-gnu2-tls2.h"
> +#include <tst-gnu2-tls2.h>
>
> __thread struct tls tls_var2 __attribute__ ((visibility ("hidden")));
>
> struct tls *
> apply_tls (struct tls *p)
> {
> + INIT_TLSDESC_CALL ();
> BEFORE_TLSDESC_CALL ();
> tls_var2 = *p;
> struct tls *ret = &tls_var2;
> diff --git a/sysdeps/arm/configure b/sysdeps/arm/configure
> index 35e2918922..4ef4d46cbd 100644
> --- a/sysdeps/arm/configure
> +++ b/sysdeps/arm/configure
> @@ -187,6 +187,38 @@ else
> default-abi = soft"
> fi
>
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether VFP supports 32 registers" >&5
> +printf %s "checking whether VFP supports 32 registers... " >&6; }
> +if test ${libc_cv_arm_pcs_vfp_d32+y}
> +then :
> + printf %s "(cached) " >&6
> +else $as_nop
> +
> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h. */
> +
> +void foo (void)
> +{
> + asm volatile ("vldr d16,=17" : : : "d16");
> +}
> +
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"
> +then :
> + libc_cv_arm_pcs_vfp_d32=yes
> +else $as_nop
> + libc_cv_arm_pcs_vfp_d32=no
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
> +fi
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_arm_pcs_vfp_d32" >&5
> +printf "%s\n" "$libc_cv_arm_pcs_vfp_d32" >&6; }
> +if test "$libc_cv_arm_pcs_vfp_d32" = yes ;
> +then
> + printf "%s\n" "#define HAVE_ARM_PCS_VFP_D32 1" >>confdefs.h
> +
> +fi
> +
> { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether PC-relative relocs in movw/movt work properly" >&5
> printf %s "checking whether PC-relative relocs in movw/movt work properly... " >&6; }
> if test ${libc_cv_arm_pcrel_movw+y}
> diff --git a/sysdeps/arm/configure.ac b/sysdeps/arm/configure.ac
> index 5172e30bbe..cd00ddc9d9 100644
> --- a/sysdeps/arm/configure.ac
> +++ b/sysdeps/arm/configure.ac
> @@ -21,6 +21,21 @@ else
> LIBC_CONFIG_VAR([default-abi], [soft])
> fi
>
> +AC_CACHE_CHECK([whether VFP supports 32 registers],
> + libc_cv_arm_pcs_vfp_d32, [
> +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
> +void foo (void)
> +{
> + asm volatile ("vldr d16,=17" : : : "d16");
> +}
> +]])],
> + [libc_cv_arm_pcs_vfp_d32=yes],
> + [libc_cv_arm_pcs_vfp_d32=no])])
> +if test "$libc_cv_arm_pcs_vfp_d32" = yes ;
> +then
> + AC_DEFINE(HAVE_ARM_PCS_VFP_D32)
> +fi
> +
> AC_CACHE_CHECK([whether PC-relative relocs in movw/movt work properly],
> libc_cv_arm_pcrel_movw, [
> cat > conftest.s <<\EOF
> diff --git a/sysdeps/arm/dl-tlsdesc.S b/sysdeps/arm/dl-tlsdesc.S
> index 764c56e70f..ada106521d 100644
> --- a/sysdeps/arm/dl-tlsdesc.S
> +++ b/sysdeps/arm/dl-tlsdesc.S
> @@ -19,6 +19,7 @@
> #include <sysdep.h>
> #include <arm-features.h>
> #include <tls.h>
> +#include <rtld-global-offsets.h>
> #include "tlsdesc.h"
>
> .text
> @@ -83,14 +84,20 @@ _dl_tlsdesc_dynamic(struct tlsdesc *tdp)
> .align 2
> _dl_tlsdesc_dynamic:
> /* Our calling convention is to clobber r0, r1 and the processor
> - flags. All others that are modified must be saved */
> - eabi_save ({r2,r3,r4,lr})
> - push {r2,r3,r4,lr}
> - cfi_adjust_cfa_offset (16)
> + flags. All others that are modified must be saved. r5 is
> + used as the hwcap value to avoid reload after __tls_get_addr
> + call. If required we will save the vector register on the slow
> + path. */
> + eabi_save ({r2,r3,r4,r5,ip,lr})
> + push {r2,r3,r4,r5,ip,lr}
> + cfi_adjust_cfa_offset (24)
> cfi_rel_offset (r2,0)
> cfi_rel_offset (r3,4)
> cfi_rel_offset (r4,8)
> - cfi_rel_offset (lr,12)
> + cfi_rel_offset (r5,12)
> + cfi_rel_offset (ip,16)
> + cfi_rel_offset (lr,20)
> +
> ldr r1, [r0] /* td */
> GET_TLS (lr)
> mov r4, r0 /* r4 = tp */
> @@ -113,22 +120,69 @@ _dl_tlsdesc_dynamic:
> rsbne r0, r4, r3
> bne 2f
> 1: mov r0, r1
> +
> + /* Load the hwcap to check for vector support. */
> + ldr r2, 3f
> + ldr r1, .Lrtld_global_ro
> +0: add r2, pc, r2
> + ldr r2, [r2, r1]
> + ldr r5, [r2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
> +
> +#ifdef __SOFTFP__
> + tst r5, #HWCAP_ARM_VFP
> + beq .Lno_vfp
> +#endif
> +
> + /* Store the VFP registers. Don't use VFP instructions directly
> + because this code is used in non-VFP multilibs. */
> +#define VFP_STACK_REQ (32*8 + 8)
> + sub sp, sp, VFP_STACK_REQ
> + cfi_adjust_cfa_offset (VFP_STACK_REQ)
> + mov r3, sp
> + .inst 0xeca30b20 /* vstmia r3!, {d0-d15} */
> + tst r5, #HWCAP_ARM_VFPD32
> + beq 4f
> + .inst 0xece30b20 /* vstmia r3!, {d16-d31} */
> + /* Store the floating-point status register. */
> +4: .inst 0xeef12a10 /* vmrs r2, fpscr */
> + str r2, [r3]
> +.Lno_vfp:
> bl __tls_get_addr
> rsb r0, r4, r0
> +#ifdef __SOFTFP__
> + tst r5, #HWCAP_ARM_VFP
> + beq 2f
> +#endif
> + mov r3, sp
> + .inst 0xecb30b20 /* vldmia r3!, {d0-d15} */
> + tst r5, #HWCAP_ARM_VFPD32
> + beq 5f
> + .inst 0xecf30b20 /* vldmia r3!, {d16-d31} */
> + ldr r4, [r3]
> +5: .inst 0xeee14a10 /* vmsr fpscr, r4 */
> + add sp, sp, VFP_STACK_REQ
> + cfi_adjust_cfa_offset (-VFP_STACK_REQ)
> +
> 2:
> #if ((defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)) \
> || defined (ARM_ALWAYS_BX))
> - pop {r2,r3,r4, lr}
> - cfi_adjust_cfa_offset (-16)
> + pop {r2,r3,r4,r5,ip, lr}
> + cfi_adjust_cfa_offset (-20)
> cfi_restore (lr)
> + cfi_restore (ip)
> + cfi_restore (r5)
> cfi_restore (r4)
> cfi_restore (r3)
> cfi_restore (r2)
> bx lr
> #else
> - pop {r2,r3,r4, pc}
> + pop {r2,r3,r4,r5,ip, pc}
> #endif
> eabi_fnend
> cfi_endproc
> .size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
> +
> +3: .long _GLOBAL_OFFSET_TABLE_ - 0b - PC_OFS
> +.Lrtld_global_ro:
> + .long C_SYMBOL_NAME(_rtld_global_ro)(GOT)
> #endif /* SHARED */
> diff --git a/sysdeps/arm/tst-gnu2-tls2.h b/sysdeps/arm/tst-gnu2-tls2.h
> new file mode 100644
> index 0000000000..e413ac21fb
> --- /dev/null
> +++ b/sysdeps/arm/tst-gnu2-tls2.h
> @@ -0,0 +1,128 @@
> +/* Test TLSDESC relocation. ARM version.
> + Copyright (C) 2024 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <config.h>
> +#include <sys/auxv.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <endian.h>
> +
> +#ifndef __SOFTFP__
> +
> +# ifdef HAVE_ARM_PCS_VFP_D32
> +# define SAVE_VFP_D32 \
> + asm volatile ("vldr d16,=17" : : : "d16"); \
> + asm volatile ("vldr d17,=18" : : : "d17"); \
> + asm volatile ("vldr d18,=19" : : : "d18"); \
> + asm volatile ("vldr d19,=20" : : : "d19"); \
> + asm volatile ("vldr d20,=21" : : : "d20"); \
> + asm volatile ("vldr d21,=22" : : : "d21"); \
> + asm volatile ("vldr d22,=23" : : : "d22"); \
> + asm volatile ("vldr d23,=24" : : : "d23"); \
> + asm volatile ("vldr d24,=25" : : : "d24"); \
> + asm volatile ("vldr d25,=26" : : : "d25"); \
> + asm volatile ("vldr d26,=27" : : : "d26"); \
> + asm volatile ("vldr d27,=28" : : : "d27"); \
> + asm volatile ("vldr d28,=29" : : : "d28"); \
> + asm volatile ("vldr d29,=30" : : : "d29"); \
> + asm volatile ("vldr d30,=31" : : : "d30"); \
> + asm volatile ("vldr d31,=32" : : : "d31");
> +# else
> +# define SAVE_VFP_D32
> +# endif
> +
> +# define INIT_TLSDESC_CALL() \
> + unsigned long hwcap = getauxval (AT_HWCAP)
> +
> +/* Set each vector register to a value from 1 to 32 before the TLS access,
> + dump to memory after TLS access, and compare with the expected values. */
> +
> +# define BEFORE_TLSDESC_CALL() \
> + if (hwcap & HWCAP_ARM_VFP) \
> + { \
> + asm volatile ("vldr d0,=1" : : : "d0"); \
> + asm volatile ("vldr d1,=2" : : : "d1"); \
> + asm volatile ("vldr d2,=3" : : : "d1"); \
> + asm volatile ("vldr d3,=4" : : : "d3"); \
> + asm volatile ("vldr d4,=5" : : : "d4"); \
> + asm volatile ("vldr d5,=6" : : : "d5"); \
> + asm volatile ("vldr d6,=7" : : : "d6"); \
> + asm volatile ("vldr d7,=8" : : : "d7"); \
> + asm volatile ("vldr d8,=9" : : : "d8"); \
> + asm volatile ("vldr d9,=10" : : : "d9"); \
> + asm volatile ("vldr d10,=11" : : : "d10"); \
> + asm volatile ("vldr d11,=12" : : : "d11"); \
> + asm volatile ("vldr d12,=13" : : : "d12"); \
> + asm volatile ("vldr d13,=14" : : : "d13"); \
> + asm volatile ("vldr d14,=15" : : : "d14"); \
> + asm volatile ("vldr d15,=16" : : : "d15"); \
> + } \
> + if (hwcap & HWCAP_ARM_VFPD32) \
> + { \
> + SAVE_VFP_D32 \
> + }
> +
> +# define VFP_STACK_REQ (16*8)
> +# if __BYTE_ORDER == __BIG_ENDIAN
> +# define DISP 7
> +# else
> +# define DISP 0
> +# endif
> +
> +# ifdef HAVE_ARM_PCS_VFP_D32
> +# define CHECK_VFP_D32 \
> + char vfp[VFP_STACK_REQ]; \
> + asm volatile ("vstmia %0, {d16-d31}\n" \
> + : \
> + : "r" (vfp) \
> + : "memory"); \
> + \
> + char expected[VFP_STACK_REQ] = { 0 }; \
> + for (int i = 0; i < 16; ++i) \
> + expected[i * 8 + DISP] = i + 17; \
> + \
> + if (memcmp (vfp, expected, VFP_STACK_REQ) != 0) \
> + abort ();
> +# else
> +# define CHECK_VFP_D32
> +# endif
> +
> +# define AFTER_TLSDESC_CALL() \
> + if (hwcap & HWCAP_ARM_VFP) \
> + { \
> + char vfp[VFP_STACK_REQ]; \
> + asm volatile ("vstmia %0, {d0-d15}\n" \
> + : \
> + : "r" (vfp) \
> + : "memory"); \
> + \
> + char expected[VFP_STACK_REQ] = { 0 }; \
> + for (int i = 0; i < 16; ++i) \
> + expected[i * 8 + DISP] = i + 1; \
> + \
> + if (memcmp (vfp, expected, VFP_STACK_REQ) != 0) \
> + abort (); \
> + } \
> + if (hwcap & HWCAP_ARM_VFPD32) \
> + { \
> + CHECK_VFP_D32 \
> + }
> +
> +#endif /* __SOFTFP__ */
> +
> +#include_next <tst-gnu2-tls2.h>
> --
> 2.34.1
>
LGTM.
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Thanks.
--
H.J.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 3/3] elf: Enable TLS descriptor tests on aarch64
2024-03-12 16:21 ` [PATCH v2 3/3] elf: Enable TLS descriptor tests on aarch64 Adhemerval Zanella
@ 2024-03-12 16:38 ` H.J. Lu
0 siblings, 0 replies; 7+ messages in thread
From: H.J. Lu @ 2024-03-12 16:38 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: libc-alpha, Szabolcs Nagy, Arjun Shankar
On Tue, Mar 12, 2024 at 9:21 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> The aarch64 uses 'trad' for traditional tls and 'desc' for tls
> descriptors, but unlike other targets it defaults to 'desc'. The
> gnutls2 configure check does not set aarch64 as an ABI that uses
> TLS descriptors, which then disable somes stests.
>
> Also rename the internal machinery fron gnu2 to tls descriptors.
>
> Checked on aarch64-linux-gnu.
> ---
> configure | 23 +++++++++++++----------
> configure.ac | 15 +++++++++------
> elf/Makefile | 26 +++++++++++++-------------
> sysdeps/aarch64/preconfigure | 1 +
> sysdeps/arm/Makefile | 8 ++++----
> 5 files changed, 40 insertions(+), 33 deletions(-)
>
> diff --git a/configure b/configure
> index 117b48a421..432e40a592 100755
> --- a/configure
> +++ b/configure
> @@ -653,7 +653,7 @@ LIBGD
> libc_cv_cc_loop_to_function
> libc_cv_cc_submachine
> libc_cv_cc_nofma
> -libc_cv_mtls_dialect_gnu2
> +libc_cv_mtls_descriptor
> libc_cv_has_glob_dat
> libc_cv_fpie
> libc_cv_z_execstack
> @@ -4760,6 +4760,9 @@ libc_config_ok=no
> # whether to use such directories.
> with_fp_cond=1
>
> +# A preconfigure script may define another name to TLS descriptor variant
> +mtls_descriptor=gnu2
> +
> if frags=`ls -d $srcdir/sysdeps/*/preconfigure 2> /dev/null`
> then
> { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysdeps preconfigure fragments" >&5
> @@ -7006,9 +7009,9 @@ fi
> printf "%s\n" "$libc_cv_has_glob_dat" >&6; }
>
>
> -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -mtls-dialect=gnu2" >&5
> -printf %s "checking for -mtls-dialect=gnu2... " >&6; }
> -if test ${libc_cv_mtls_dialect_gnu2+y}
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tls descriptor support" >&5
> +printf %s "checking for tls descriptor support... " >&6; }
> +if test ${libc_cv_mtls_descriptor+y}
> then :
> printf %s "(cached) " >&6
> else $as_nop
> @@ -7019,7 +7022,7 @@ void foo (void)
> i = 10;
> }
> EOF
> -if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nostartfiles
> +if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=$mtls_descriptor -nostdlib -nostartfiles
> -shared conftest.c -o conftest 1>&5'
> { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> (eval $ac_try) 2>&5
> @@ -7027,17 +7030,17 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nost
> printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> test $ac_status = 0; }; }
> then
> - libc_cv_mtls_dialect_gnu2=yes
> + libc_cv_mtls_descriptor=$mtls_descriptor
> else
> - libc_cv_mtls_dialect_gnu2=no
> + libc_cv_mtls_descriptor=no
> fi
> rm -f conftest*
> fi
> -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mtls_dialect_gnu2" >&5
> -printf "%s\n" "$libc_cv_mtls_dialect_gnu2" >&6; }
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mtls_descriptor" >&5
> +printf "%s\n" "$libc_cv_mtls_descriptor" >&6; }
>
> config_vars="$config_vars
> -have-mtls-dialect-gnu2 = $libc_cv_mtls_dialect_gnu2"
> +have-mtls-descriptor = $libc_cv_mtls_descriptor"
>
> { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if -Wno-ignored-attributes is required for aliases" >&5
> printf %s "checking if -Wno-ignored-attributes is required for aliases... " >&6; }
> diff --git a/configure.ac b/configure.ac
> index 19b88a47a5..bdc385d03c 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -442,6 +442,9 @@ libc_config_ok=no
> # whether to use such directories.
> with_fp_cond=1
>
> +# A preconfigure script may define another name to TLS descriptor variant
> +mtls_descriptor=gnu2
> +
> dnl Let sysdeps/*/preconfigure act here.
> LIBC_PRECONFIGURE([$srcdir], [for sysdeps])
>
> @@ -1287,7 +1290,7 @@ fi
> rm -f conftest*])
> AC_SUBST(libc_cv_has_glob_dat)
>
> -AC_CACHE_CHECK([for -mtls-dialect=gnu2], libc_cv_mtls_dialect_gnu2,
> +AC_CACHE_CHECK([for tls descriptor support], libc_cv_mtls_descriptor,
> [dnl
> cat > conftest.c <<EOF
> __thread int i;
> @@ -1296,16 +1299,16 @@ void foo (void)
> i = 10;
> }
> EOF
> -if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nostartfiles
> +if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=$mtls_descriptor -nostdlib -nostartfiles
> -shared conftest.c -o conftest 1>&AS_MESSAGE_LOG_FD])
> then
> - libc_cv_mtls_dialect_gnu2=yes
> + libc_cv_mtls_descriptor=$mtls_descriptor
> else
> - libc_cv_mtls_dialect_gnu2=no
> + libc_cv_mtls_descriptor=no
> fi
> rm -f conftest*])
> -AC_SUBST(libc_cv_mtls_dialect_gnu2)
> -LIBC_CONFIG_VAR([have-mtls-dialect-gnu2], [$libc_cv_mtls_dialect_gnu2])
> +AC_SUBST(libc_cv_mtls_descriptor)
> +LIBC_CONFIG_VAR([have-mtls-descriptor], [$libc_cv_mtls_descriptor])
>
> dnl clang emits an warning for a double alias redirection, to warn the
> dnl original symbol is sed even when weak definition overrides it.
> diff --git a/elf/Makefile b/elf/Makefile
> index 393a27ef2a..4f1903391a 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -1001,13 +1001,13 @@ modules-names-tests = $(filter-out ifuncmod% tst-tlsmod%,\
> # For +depfiles in Makerules.
> extra-test-objs += tst-auditmod17.os
>
> -ifeq (yes,$(have-mtls-dialect-gnu2))
> +ifneq (no,$(have-mtls-descriptor))
> tests += tst-gnu2-tls1
> modules-names += tst-gnu2-tls1mod
> $(objpfx)tst-gnu2-tls1: $(objpfx)tst-gnu2-tls1mod.so
> tst-gnu2-tls1mod.so-no-z-defs = yes
> -CFLAGS-tst-gnu2-tls1mod.c += -mtls-dialect=gnu2
> -endif # $(have-mtls-dialect-gnu2)
> +CFLAGS-tst-gnu2-tls1mod.c += -mtls-dialect=$(have-mtls-descriptor)
> +endif # $(have-mtls-descriptor)
>
> ifeq (yes,$(have-protected-data))
> modules-names += tst-protected1moda tst-protected1modb
> @@ -2975,11 +2975,11 @@ $(objpfx)tst-tls-allocation-failure-static-patched.out: \
> $(objpfx)tst-audit-tlsdesc: $(objpfx)tst-audit-tlsdesc-mod1.so \
> $(objpfx)tst-audit-tlsdesc-mod2.so \
> $(shared-thread-library)
> -ifeq (yes,$(have-mtls-dialect-gnu2))
> +ifneq (no,$(have-mtls-descriptor))
> # The test is valid for all TLS types, but we want to exercise GNU2
> # TLS if possible.
> -CFLAGS-tst-audit-tlsdesc-mod1.c += -mtls-dialect=gnu2
> -CFLAGS-tst-audit-tlsdesc-mod2.c += -mtls-dialect=gnu2
> +CFLAGS-tst-audit-tlsdesc-mod1.c += -mtls-dialect=$(have-mtls-descriptor)
> +CFLAGS-tst-audit-tlsdesc-mod2.c += -mtls-dialect=$(have-mtls-descriptor)
> endif
> $(objpfx)tst-audit-tlsdesc-dlopen: $(shared-thread-library)
> $(objpfx)tst-audit-tlsdesc-dlopen.out: $(objpfx)tst-audit-tlsdesc-mod1.so \
> @@ -3058,11 +3058,11 @@ $(objpfx)tst-gnu2-tls2.out: \
> $(objpfx)tst-gnu2-tls2mod1.so \
> $(objpfx)tst-gnu2-tls2mod2.so
>
> -ifeq (yes,$(have-mtls-dialect-gnu2))
> -CFLAGS-tst-tlsgap-mod0.c += -mtls-dialect=gnu2
> -CFLAGS-tst-tlsgap-mod1.c += -mtls-dialect=gnu2
> -CFLAGS-tst-tlsgap-mod2.c += -mtls-dialect=gnu2
> -CFLAGS-tst-gnu2-tls2mod0.c += -mtls-dialect=gnu2
> -CFLAGS-tst-gnu2-tls2mod1.c += -mtls-dialect=gnu2
> -CFLAGS-tst-gnu2-tls2mod2.c += -mtls-dialect=gnu2
> +ifneq (no,$(have-mtls-descriptor))
> +CFLAGS-tst-tlsgap-mod0.c += -mtls-dialect=$(have-mtls-descriptor)
> +CFLAGS-tst-tlsgap-mod1.c += -mtls-dialect=$(have-mtls-descriptor)
> +CFLAGS-tst-tlsgap-mod2.c += -mtls-dialect=$(have-mtls-descriptor)
> +CFLAGS-tst-gnu2-tls2mod0.c += -mtls-dialect=$(have-mtls-descriptor)
> +CFLAGS-tst-gnu2-tls2mod1.c += -mtls-dialect=$(have-mtls-descriptor)
> +CFLAGS-tst-gnu2-tls2mod2.c += -mtls-dialect=$(have-mtls-descriptor)
> endif
> diff --git a/sysdeps/aarch64/preconfigure b/sysdeps/aarch64/preconfigure
> index d9bd1f8558..19657b627b 100644
> --- a/sysdeps/aarch64/preconfigure
> +++ b/sysdeps/aarch64/preconfigure
> @@ -2,5 +2,6 @@ case "$machine" in
> aarch64*)
> base_machine=aarch64
> machine=aarch64
> + mtls_descriptor=desc
> ;;
> esac
> diff --git a/sysdeps/arm/Makefile b/sysdeps/arm/Makefile
> index d5cea717a9..619474eca9 100644
> --- a/sysdeps/arm/Makefile
> +++ b/sysdeps/arm/Makefile
> @@ -13,15 +13,15 @@ $(objpfx)libgcc-stubs.a: $(objpfx)aeabi_unwind_cpp_pr1.os
> lib-noranlib: $(objpfx)libgcc-stubs.a
>
> ifeq ($(build-shared),yes)
> -ifeq (yes,$(have-mtls-dialect-gnu2))
> +ifneq (no,$(have-mtls-descriptor))
> tests += tst-armtlsdescloc tst-armtlsdescextnow tst-armtlsdescextlazy
> modules-names += tst-armtlsdesclocmod
> modules-names += tst-armtlsdescextlazymod tst-armtlsdescextnowmod
> CPPFLAGS-tst-armtlsdescextnowmod.c += -Dstatic=
> CPPFLAGS-tst-armtlsdescextlazymod.c += -Dstatic=
> -CFLAGS-tst-armtlsdesclocmod.c += -mtls-dialect=gnu2
> -CFLAGS-tst-armtlsdescextnowmod.c += -mtls-dialect=gnu2
> -CFLAGS-tst-armtlsdescextlazymod.c += -mtls-dialect=gnu2
> +CFLAGS-tst-armtlsdesclocmod.c += -mtls-dialect=$(have-mtls-descriptor)
> +CFLAGS-tst-armtlsdescextnowmod.c += -mtls-dialect=$(have-mtls-descriptor)
> +CFLAGS-tst-armtlsdescextlazymod.c += -mtls-dialect=$(have-mtls-descriptor)
> LDFLAGS-tst-armtlsdescextnowmod.so += -Wl,-z,now
> tst-armtlsdescloc-ENV = LD_BIND_NOW=1
> tst-armtlsdescextnow-ENV = LD_BIND_NOW=1
> --
> 2.34.1
>
LGTM.
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Thanks.
--
H.J.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-03-12 16:38 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-12 16:21 [PATCH v2 0/3] Extending TLS testing and fixing TLS gnu2 for ARM Adhemerval Zanella
2024-03-12 16:21 ` [PATCH v2 1/3] Ignore undefined symbols for -mtls-dialect=gnu2 Adhemerval Zanella
2024-03-12 16:34 ` H.J. Lu
2024-03-12 16:21 ` [PATCH v2 2/3] arm: Update _dl_tlsdesc_dynamic to preserve caller-saved registers (BZ 31372) Adhemerval Zanella
2024-03-12 16:35 ` H.J. Lu
2024-03-12 16:21 ` [PATCH v2 3/3] elf: Enable TLS descriptor tests on aarch64 Adhemerval Zanella
2024-03-12 16:38 ` H.J. Lu
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).