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