16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// Test that blacklisted functions are still contained in the stack trace.
26a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
36a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: echo "fun:*Blacklisted_Thread2*" > %t.blacklist
46a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: echo "fun:*CallTouchGlobal*" >> %t.blacklist
56a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
66a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %clangxx_tsan -O1 %s -fsanitize-blacklist=%t.blacklist -o %t
76a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %deflake %run %t 2>&1 | FileCheck %s
886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "test.h"
96a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesint Global;
116a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
126a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesvoid *Thread1(void *x) {
1386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_wait(&barrier);
146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  // CHECK: ThreadSanitizer: data race
156a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  // CHECK: Write of size 4
166a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  // CHECK: #0 Thread1{{.*}}blacklist2.cc:[[@LINE+1]]
176a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  Global++;
186a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  return NULL;
196a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
206a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesvoid TouchGlobal() {
226a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  // CHECK: Previous write of size 4
236d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  // CHECK: #0 TouchGlobal{{.*}}blacklist2.cc:[[@LINE+1]]
246a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  Global--;
256a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
266a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
276a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesvoid CallTouchGlobal() {
286a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  // CHECK: #1 CallTouchGlobal{{.*}}blacklist2.cc:[[@LINE+1]]
296a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  TouchGlobal();
306a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
316a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
326a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesvoid *Blacklisted_Thread2(void *x) {
336a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  Global--;
346a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  // CHECK: #2 Blacklisted_Thread2{{.*}}blacklist2.cc:[[@LINE+1]]
356a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  CallTouchGlobal();
3686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_wait(&barrier);
376a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  return NULL;
386a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
396a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
406a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesint main() {
4186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_init(&barrier, 2);
426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  pthread_t t[2];
436a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  pthread_create(&t[0], NULL, Thread1, NULL);
446a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  pthread_create(&t[1], NULL, Blacklisted_Thread2, NULL);
456a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  pthread_join(t[0], NULL);
466a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  pthread_join(t[1], NULL);
47c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  fprintf(stderr, "PASS\n");
486a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  return 0;
496a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
50