xref: /llvm-project/compiler-rt/test/msan/tls_reuse.cpp (revision d21b3d346af2f6189638d853182e389555e7ccb9)
1*d21b3d34SFangrui Song // RUN: %clangxx_msan -O0 %s -o %t && %run %t
2*d21b3d34SFangrui Song 
3*d21b3d34SFangrui Song // Check that when TLS block is reused between threads, its shadow is cleaned.
4*d21b3d34SFangrui Song 
5*d21b3d34SFangrui Song #include <pthread.h>
6*d21b3d34SFangrui Song #include <stdio.h>
7*d21b3d34SFangrui Song 
8*d21b3d34SFangrui Song int __thread x;
9*d21b3d34SFangrui Song 
ThreadFn(void *)10*d21b3d34SFangrui Song void *ThreadFn(void *) {
11*d21b3d34SFangrui Song   if (!x)
12*d21b3d34SFangrui Song     printf("zzz\n");
13*d21b3d34SFangrui Song   int y;
14*d21b3d34SFangrui Song   int * volatile p = &y;
15*d21b3d34SFangrui Song   x = *p;
16*d21b3d34SFangrui Song   return 0;
17*d21b3d34SFangrui Song }
18*d21b3d34SFangrui Song 
main(void)19*d21b3d34SFangrui Song int main(void) {
20*d21b3d34SFangrui Song   pthread_t t;
21*d21b3d34SFangrui Song   for (int i = 0; i < 100; ++i) {
22*d21b3d34SFangrui Song     pthread_create(&t, 0, ThreadFn, 0);
23*d21b3d34SFangrui Song     pthread_join(t, 0);
24*d21b3d34SFangrui Song   }
25*d21b3d34SFangrui Song   return 0;
26*d21b3d34SFangrui Song }
27