15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Test that blacklisted functions are still contained in the stack trace. 25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: echo "fun:*Blacklisted_Thread2*" > %t.blacklist 45d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: echo "fun:*CallTouchGlobal*" >> %t.blacklist 55d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_tsan -O1 %s -fsanitize-blacklist=%t.blacklist -o %t 75d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %deflake %run %t 2>&1 | FileCheck %s 85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <pthread.h> 95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <stdio.h> 105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <unistd.h> 115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint Global; 135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *Thread1(void *x) { 155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines sleep(1); 165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: ThreadSanitizer: data race 175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: Write of size 4 185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: #0 Thread1{{.*}}blacklist2.cc:[[@LINE+1]] 195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines Global++; 205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return NULL; 215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid TouchGlobal() { 245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: Previous write of size 4 255d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: #0 TouchGlobal(){{.*}}blacklist2.cc:[[@LINE+1]] 265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines Global--; 275d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 285d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 295d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid CallTouchGlobal() { 305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: #1 CallTouchGlobal{{.*}}blacklist2.cc:[[@LINE+1]] 315d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines TouchGlobal(); 325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 335d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 345d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *Blacklisted_Thread2(void *x) { 355d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines Global--; 365d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: #2 Blacklisted_Thread2{{.*}}blacklist2.cc:[[@LINE+1]] 375d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines CallTouchGlobal(); 385d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return NULL; 395d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 405d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 415d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint main() { 425d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_t t[2]; 435d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_create(&t[0], NULL, Thread1, NULL); 445d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_create(&t[1], NULL, Blacklisted_Thread2, NULL); 455d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_join(t[0], NULL); 465d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_join(t[1], NULL); 475d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines printf("PASS\n"); 485d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return 0; 495d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 50