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