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 | |
23 | unsigned *f(); |
24 | int 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 |
31 | static __thread unsigned ThreadLocal; |
32 | unsigned *f() { |
33 | return &ThreadLocal; |
34 | } |
35 | #endif |
36 | |