aboutsummaryrefslogtreecommitdiff
path: root/elf/tst-tls1.c
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2021-08-16 09:59:30 -0700
committerFangrui Song <maskray@google.com>2021-08-16 09:59:30 -0700
commit33c50ef42878b07ee6ead8b3f1a81d8c2c74697c (patch)
tree80906e254be99c7a3005cdc5f1dbeb1cafd0643a /elf/tst-tls1.c
parentcbb2aa337bc3a5f1cb9936781c3a7f5036d4262e (diff)
downloadglibc-33c50ef42878b07ee6ead8b3f1a81d8c2c74697c.zip
glibc-33c50ef42878b07ee6ead8b3f1a81d8c2c74697c.tar.gz
glibc-33c50ef42878b07ee6ead8b3f1a81d8c2c74697c.tar.bz2
elf: Drop elf/tls-macros.h in favor of __thread and tls_model attributes [BZ #28152] [BZ #28205]
elf/tls-macros.h was added for TLS testing when GCC did not support __thread. __thread and tls_model attributes are mature now and have been used by many newer tests. Also delete tst-tls2.c which tests .tls_common (unused by modern GCC and unsupported by Clang/LLD). .tls_common and .tbss definition are almost identical after linking, so the runtime test doesn't add additional coverage. Assembler and linker tests should be on the binutils side. When LLD 13.0.0 is allowed in configure.ac (https://sourceware.org/pipermail/libc-alpha/2021-August/129866.html), `make check` result is on par with glibc built with GNU ld on aarch64 and x86_64. As a future clean-up, TLS_GD/TLS_LD/TLS_IE/TLS_IE macros can be removed from sysdeps/*/tls-macros.h. We can add optional -mtls-dialect={gnu2,trad} tests to ensure coverage. Tested on aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
Diffstat (limited to 'elf/tst-tls1.c')
-rw-r--r--elf/tst-tls1.c64
1 files changed, 25 insertions, 39 deletions
diff --git a/elf/tst-tls1.c b/elf/tst-tls1.c
index c31da56..b341221 100644
--- a/elf/tst-tls1.c
+++ b/elf/tst-tls1.c
@@ -1,13 +1,14 @@
/* glibc test for TLS in ld.so. */
#include <stdio.h>
-#include "tls-macros.h"
-
-
-/* Two common 'int' variables in TLS. */
-COMMON_INT_DEF(foo);
-COMMON_INT_DEF(bar);
+__thread int foo, bar __attribute__ ((tls_model("local-exec")));
+extern __thread int foo_gd asm ("foo") __attribute__ ((tls_model("global-dynamic")));
+extern __thread int foo_ld asm ("foo") __attribute__ ((tls_model("local-dynamic")));
+extern __thread int foo_ie asm ("foo") __attribute__ ((tls_model("initial-exec")));
+extern __thread int bar_gd asm ("bar") __attribute__ ((tls_model("global-dynamic")));
+extern __thread int bar_ld asm ("bar") __attribute__ ((tls_model("local-dynamic")));
+extern __thread int bar_ie asm ("bar") __attribute__ ((tls_model("initial-exec")));
static int
do_test (void)
@@ -18,63 +19,48 @@ do_test (void)
/* Set the variable using the local exec model. */
puts ("set bar to 1 (LE)");
- ap = TLS_LE (bar);
- *ap = 1;
+ bar = 1;
/* Get variables using initial exec model. */
fputs ("get sum of foo and bar (IE)", stdout);
- ap = TLS_IE (foo);
- bp = TLS_IE (bar);
+ ap = &foo_ie;
+ bp = &bar_ie;
printf (" = %d\n", *ap + *bp);
result |= *ap + *bp != 1;
- if (*ap != 0)
- {
- printf ("foo = %d\n", *ap);
- result = 1;
- }
- if (*bp != 1)
+ if (*ap != 0 || *bp != 1)
{
- printf ("bar = %d\n", *bp);
+ printf ("foo = %d\nbar = %d\n", *ap, *bp);
result = 1;
}
- /* Get variables using local dynamic model. */
- fputs ("get sum of foo and bar (LD)", stdout);
- ap = TLS_LD (foo);
- bp = TLS_LD (bar);
+ /* Get variables using local dynamic model or TLSDESC. */
+ fputs ("get sum of foo and bar (LD or TLSDESC)", stdout);
+ ap = &foo_ld;
+ bp = &bar_ld;
printf (" = %d\n", *ap + *bp);
result |= *ap + *bp != 1;
- if (*ap != 0)
- {
- printf ("foo = %d\n", *ap);
- result = 1;
- }
- if (*bp != 1)
+ if (*ap != 0 || *bp != 1)
{
- printf ("bar = %d\n", *bp);
+ printf ("foo = %d\nbar = %d\n", *ap, *bp);
result = 1;
}
- /* Get variables using generic dynamic model. */
- fputs ("get sum of foo and bar (GD)", stdout);
- ap = TLS_GD (foo);
- bp = TLS_GD (bar);
+ /* Get variables using general dynamic model or TLSDESC. */
+ fputs ("get sum of foo and bar (GD or TLSDESC)", stdout);
+ ap = &foo_gd;
+ bp = &bar_gd;
printf (" = %d\n", *ap + *bp);
result |= *ap + *bp != 1;
- if (*ap != 0)
- {
- printf ("foo = %d\n", *ap);
- result = 1;
- }
- if (*bp != 1)
+ if (*ap != 0 || *bp != 1)
{
- printf ("bar = %d\n", *bp);
+ printf ("foo = %d\nbar = %d\n", *ap, *bp);
result = 1;
}
+
return result;
}