112d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev// Test that TLS is unpoisoned on thread death.
2c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// REQUIRES: x86-target-arch
312d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev
46a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %clangxx_asan -O1 %s -pthread -o %t && %run %t 2>&1
512d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev
612d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev#include <assert.h>
712d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev#include <pthread.h>
812d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev#include <stdio.h>
912d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev
1012d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev#include <sanitizer/asan_interface.h>
1112d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev
1212d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev__thread int64_t tls_var[2];
1312d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev
1412d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveevvolatile int64_t *p_tls_var;
1512d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev
1612d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveevvoid *first(void *arg) {
1712d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  ASAN_POISON_MEMORY_REGION(&tls_var, sizeof(tls_var));
1812d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  p_tls_var = tls_var;
1912d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  return 0;
2012d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev}
2112d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev
2212d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveevvoid *second(void *arg) {
2312d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  assert(tls_var == p_tls_var);
2412d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  *p_tls_var = 1;
2512d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  return 0;
2612d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev}
2712d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev
2812d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveevint main(int argc, char *argv[]) {
2912d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  pthread_t p;
3012d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  assert(0 == pthread_create(&p, 0, first, 0));
3112d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  assert(0 == pthread_join(p, 0));
3212d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  assert(0 == pthread_create(&p, 0, second, 0));
3312d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  assert(0 == pthread_join(p, 0));
3412d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev  return 0;
3512d01bac1c09a8412546e71485a3cba2d416c0fcSergey Matveev}
36