1// REQUIRES: asan-64-bits
2// Regression test: __tls_get_addr interceptor must recognize static TLS.
3//
4// RUN: %clangxx_asan -DSHARED %s -shared -o %t-so.so -fPIC
5// RUN: %clangxx_asan %s -ldl -pthread -o %t %t-so.so
6// RUN: %env_asan_opts=verbosity=2 %run %t 2>&1 | FileCheck %s
7
8// CHECK: before
9// CHECK: __tls_get_addr: static tls
10// CHECK: after
11
12// XFAIL: target=aarch64{{.*}}
13// binutils 2.26 has a change that causes this test to fail on powerpc64.
14// UNSUPPORTED: target=powerpc64{{.*}}
15
16/// We call __tls_get_addr early in GetTls to work around an issue for glibc<2.25,
17/// so we don't get a log for f().
18// REQUIRES: glibc-2.27
19
20#ifndef SHARED
21#include <stdio.h>
22
23unsigned *f();
24int main(int argc, char *argv[]) {
25 fprintf(stderr, format: "before\n");
26 f();
27 fprintf(stderr, format: "after\n");
28 return 0;
29}
30#else // SHARED
31static __thread unsigned ThreadLocal;
32unsigned *f() {
33 return &ThreadLocal;
34}
35#endif
36

source code of compiler-rt/test/asan/TestCases/Linux/static_tls.cpp