tsan: allow a front-end to provide default suppressions
authorDmitry Vyukov <dvyukov@google.com>
Thu, 24 Jan 2013 13:50:10 +0000 (13:50 +0000)
committerDmitry Vyukov <dvyukov@google.com>
Thu, 24 Jan 2013 13:50:10 +0000 (13:50 +0000)
llvm-svn: 173345

compiler-rt/lib/tsan/rtl/tsan_suppressions.cc
compiler-rt/lib/tsan/rtl/tsan_suppressions.h
compiler-rt/lib/tsan/tests/unit/tsan_suppressions_test.cc

index 5316f6d..112f56b 100644 (file)
 #include "tsan_mman.h"
 #include "tsan_platform.h"
 
+// Can be overriden in frontend.
+#ifndef TSAN_GO
+extern "C" const char *WEAK __tsan_default_suppressions() {
+  return 0;
+}
+#endif
+
 namespace __tsan {
 
 static Suppression *g_suppressions;
@@ -80,8 +87,7 @@ bool SuppressionMatch(char *templ, const char *str) {
   return true;
 }
 
-Suppression *SuppressionParse(const char* supp) {
-  Suppression *head = 0;
+Suppression *SuppressionParse(Suppression *head, const char* supp) {
   const char *line = supp;
   while (line) {
     while (line[0] == ' ' || line[0] == '\t')
@@ -130,8 +136,12 @@ Suppression *SuppressionParse(const char* supp) {
 }
 
 void InitializeSuppressions() {
-  char *supp = ReadFile(flags()->suppressions);
-  g_suppressions = SuppressionParse(supp);
+  const char *supp = ReadFile(flags()->suppressions);
+  g_suppressions = SuppressionParse(0, supp);
+#ifndef TSAN_GO
+  supp = __tsan_default_suppressions();
+  g_suppressions = SuppressionParse(0, supp);
+#endif
 }
 
 uptr IsSuppressed(ReportType typ, const ReportStack *stack) {
@@ -152,7 +162,8 @@ uptr IsSuppressed(ReportType typ, const ReportStack *stack) {
     for (Suppression *supp = g_suppressions; supp; supp = supp->next) {
       if (stype == supp->type &&
           (SuppressionMatch(supp->templ, frame->func) ||
-          SuppressionMatch(supp->templ, frame->file))) {
+           SuppressionMatch(supp->templ, frame->file) ||
+           SuppressionMatch(supp->templ, frame->module))) {
         DPrintf("ThreadSanitizer: matched suppression '%s'\n", supp->templ);
         return frame->pc;
       }
index 61a4cca..c588316 100644 (file)
@@ -35,7 +35,7 @@ struct Suppression {
   char *templ;
 };
 
-Suppression *SuppressionParse(const char* supp);
+Suppression *SuppressionParse(Suppression *head, const char* supp);
 bool SuppressionMatch(char *templ, const char *str);
 
 }  // namespace __tsan
index e1e0c12..decfa32 100644 (file)
@@ -20,7 +20,7 @@ namespace __tsan {
 
 TEST(Suppressions, Parse) {
   ScopedInRtl in_rtl;
-  Suppression *supp0 = SuppressionParse(
+  Suppression *supp0 = SuppressionParse(0,
     "race:foo\n"
     "  race:bar\n"  // NOLINT
     "race:baz   \n"  // NOLINT
@@ -45,7 +45,7 @@ TEST(Suppressions, Parse) {
 
 TEST(Suppressions, Parse2) {
   ScopedInRtl in_rtl;
-  Suppression *supp0 = SuppressionParse(
+  Suppression *supp0 = SuppressionParse(0,
     "          # first line comment\n"  // NOLINT
     "  race:bar        \n"  // NOLINT
     "race:baz* *baz\n"
@@ -64,7 +64,7 @@ TEST(Suppressions, Parse2) {
 
 TEST(Suppressions, Parse3) {
   ScopedInRtl in_rtl;
-  Suppression *supp0 = SuppressionParse(
+  Suppression *supp0 = SuppressionParse(0,
     "# last suppression w/o line-feed\n"
     "race:foo\n"
     "race:bar"
@@ -81,7 +81,7 @@ TEST(Suppressions, Parse3) {
 
 TEST(Suppressions, ParseType) {
   ScopedInRtl in_rtl;
-  Suppression *supp0 = SuppressionParse(
+  Suppression *supp0 = SuppressionParse(0,
     "race:foo\n"
     "thread:bar\n"
     "mutex:baz\n"