tsan: suppress reports against source file names as well


git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@157739 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/tsan/rtl/tsan_suppressions.cc b/lib/tsan/rtl/tsan_suppressions.cc
index a27a4bf..2c7c318 100644
--- a/lib/tsan/rtl/tsan_suppressions.cc
+++ b/lib/tsan/rtl/tsan_suppressions.cc
@@ -53,6 +53,8 @@
 }
 
 bool SuppressionMatch(char *templ, const char *str) {
+  if (str == 0 || str[0] == 0)
+    return false;
   char *tpos;
   const char *spos;
   while (templ && templ[0]) {
@@ -114,9 +116,9 @@
       s->next = head;
       head = s;
       s->type = stype;
-      s->func = (char*)internal_alloc(MBlockSuppression, end2 - line + 1);
-      internal_memcpy(s->func, line, end2 - line);
-      s->func[end2 - line] = 0;
+      s->templ = (char*)internal_alloc(MBlockSuppression, end2 - line + 1);
+      internal_memcpy(s->templ, line, end2 - line);
+      s->templ[end2 - line] = 0;
     }
     if (end[0] == 0)
       break;
@@ -145,11 +147,11 @@
   else
     return false;
   for (const ReportStack *frame = stack; frame; frame = frame->next) {
-    if (frame->func == 0)
-      continue;
     for (Suppression *supp = g_suppressions; supp; supp = supp->next) {
-      if (stype == supp->type && SuppressionMatch(supp->func, frame->func)) {
-        DPrintf("ThreadSanitizer: matched suppression '%s'\n", supp->func);
+      if (stype == supp->type ||
+          SuppressionMatch(supp->templ, frame->func) ||
+          SuppressionMatch(supp->templ, frame->file)) {
+        DPrintf("ThreadSanitizer: matched suppression '%s'\n", supp->templ);
         return true;
       }
     }
diff --git a/lib/tsan/rtl/tsan_suppressions.h b/lib/tsan/rtl/tsan_suppressions.h
index 606ca6f..29311c1 100644
--- a/lib/tsan/rtl/tsan_suppressions.h
+++ b/lib/tsan/rtl/tsan_suppressions.h
@@ -32,7 +32,7 @@
 struct Suppression {
   Suppression *next;
   SuppressionType type;
-  char *func;
+  char *templ;
 };
 
 Suppression *SuppressionParse(const char* supp);
diff --git a/lib/tsan/unit_tests/tsan_suppressions_test.cc b/lib/tsan/unit_tests/tsan_suppressions_test.cc
index 1c0ff1b..f94e529 100644
--- a/lib/tsan/unit_tests/tsan_suppressions_test.cc
+++ b/lib/tsan/unit_tests/tsan_suppressions_test.cc
@@ -29,16 +29,16 @@
   );  // NOLINT
   Suppression *supp = supp0;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "quz"));
+  EXPECT_EQ(0, strcmp(supp->templ, "quz"));
   supp = supp->next;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "baz"));
+  EXPECT_EQ(0, strcmp(supp->templ, "baz"));
   supp = supp->next;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "bar"));
+  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
   supp = supp->next;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "foo"));
+  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
   supp = supp->next;
   EXPECT_EQ((Suppression*)0, supp);
 }
@@ -54,10 +54,10 @@
   );  // NOLINT
   Suppression *supp = supp0;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "baz* *baz"));
+  EXPECT_EQ(0, strcmp(supp->templ, "baz* *baz"));
   supp = supp->next;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "bar"));
+  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
   supp = supp->next;
   EXPECT_EQ((Suppression*)0, supp);
 }
@@ -71,10 +71,10 @@
   );  // NOLINT
   Suppression *supp = supp0;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "bar"));
+  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
   supp = supp->next;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "foo"));
+  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
   supp = supp->next;
   EXPECT_EQ((Suppression*)0, supp);
 }
@@ -89,16 +89,16 @@
   );  // NOLINT
   Suppression *supp = supp0;
   EXPECT_EQ(supp->type, SuppressionSignal);
-  EXPECT_EQ(0, strcmp(supp->func, "quz"));
+  EXPECT_EQ(0, strcmp(supp->templ, "quz"));
   supp = supp->next;
   EXPECT_EQ(supp->type, SuppressionMutex);
-  EXPECT_EQ(0, strcmp(supp->func, "baz"));
+  EXPECT_EQ(0, strcmp(supp->templ, "baz"));
   supp = supp->next;
   EXPECT_EQ(supp->type, SuppressionThread);
-  EXPECT_EQ(0, strcmp(supp->func, "bar"));
+  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
   supp = supp->next;
   EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->func, "foo"));
+  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
   supp = supp->next;
   EXPECT_EQ((Suppression*)0, supp);
 }