| // RUN: %clangxx %s -DBUILD_DSO -fPIC -shared -o %t.so |
| // RUN: %clangxx --std=c++11 %s -o %t |
| // RUN: %env_tool_opts=verbosity=2 %run %t 2>&1 | FileCheck %s |
| |
| // Does not call __tls_get_addr |
| // UNSUPPORTED: i386-linux |
| |
| // Do not intercept __tls_get_addr |
| // UNSUPPORTED: lsan, ubsan, android |
| |
| // FIXME: Investigate |
| // UNSUPPORTED: powerpc64 |
| |
| #include <string.h> |
| |
| #ifndef BUILD_DSO |
| |
| #include <assert.h> |
| #include <dlfcn.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| char buff[10000]; |
| |
| int main(int argc, char *argv[]) { |
| sprintf(buff, "rm -f %s.so.*", argv[0]); |
| system(buff); |
| |
| void *prev_handle = 0; |
| for (int i = 0; i < 600; ++i) { |
| sprintf(buff, "cp %s.so %s.so.%d", argv[0], argv[0], i); |
| system(buff); |
| |
| sprintf(buff, "%s.so.%d", argv[0], i); |
| void *handle = dlopen(buff, RTLD_LAZY); |
| assert(handle != 0); |
| assert(handle != prev_handle); |
| prev_handle = handle; |
| |
| typedef void (*FnType)(char c); |
| ((FnType)dlsym(handle, "StoreToTLS"))(i); |
| } |
| return 0; |
| } |
| |
| #else // BUILD_DSO |
| __thread char huge_thread_local_array[1 << 12]; |
| |
| extern "C" void StoreToTLS(char c) { |
| memset(huge_thread_local_array, c, sizeof(huge_thread_local_array)); |
| } |
| #endif // BUILD_DSO |
| |
| // CHECK: DTLS_Find [[DTLS:0x[a-f0-9]+]] {{[0-9]+}} |
| // CHECK: DTLS_NextBlock [[DTLS]] 0 |
| // CHECK: DTLS_Find [[DTLS:0x[a-f0-9]+]] {{[0-9]+}} |
| // CHECK: DTLS_NextBlock [[DTLS]] 1 |