mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-12 14:20:13 +00:00
bbe4bbb6e8
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>
(cherry picked from commit 33c50ef428
)
52 lines
1.2 KiB
C
52 lines
1.2 KiB
C
/* shared library to test for __tls_get_addr optimization. */
|
|
#include <stdio.h>
|
|
|
|
#include "dl-tls.h"
|
|
|
|
__thread int foo __attribute__ ((tls_model("global-dynamic")));
|
|
|
|
|
|
int
|
|
tls_get_addr_opt_test (void)
|
|
{
|
|
int result = 0;
|
|
|
|
/* Get variable using general dynamic model. */
|
|
int *ap = &foo;
|
|
if (*ap != 0)
|
|
{
|
|
printf ("foo = %d\n", *ap);
|
|
result = 1;
|
|
}
|
|
|
|
tls_index *tls_arg;
|
|
#ifdef __powerpc64__
|
|
register unsigned long thread_pointer __asm__ ("r13");
|
|
# ifdef __PCREL__
|
|
asm ("paddi %0,0,foo@got@tlsgd@pcrel,1" : "=b" (tls_arg));
|
|
# else
|
|
asm ("addi %0,2,foo@got@tlsgd" : "=b" (tls_arg));
|
|
# endif
|
|
#else
|
|
register unsigned long thread_pointer __asm__ ("r2");
|
|
asm ("bcl 20,31,1f\n1:\t"
|
|
"mflr %0\n\t"
|
|
"addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t"
|
|
"addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t"
|
|
"addi %0,%0,foo@got@tlsgd" : "=b" (tls_arg));
|
|
#endif
|
|
|
|
if (tls_arg->ti_module != 0)
|
|
{
|
|
printf ("tls_index not optimized, binutils too old?\n");
|
|
result = 1;
|
|
}
|
|
else if (tls_arg->ti_offset + thread_pointer != (unsigned long) ap)
|
|
{
|
|
printf ("tls_index->ti_offset wrong value\n");
|
|
result = 1;
|
|
}
|
|
|
|
return result;
|
|
}
|