diff options
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_suppressions.cc | 21 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_suppressions.h | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/tests/unit/tsan_suppressions_test.cc | 8 |
3 files changed, 21 insertions, 10 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc b/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc index 5316f6db6a0..112f56baa48 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc @@ -19,6 +19,13 @@ #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; } diff --git a/compiler-rt/lib/tsan/rtl/tsan_suppressions.h b/compiler-rt/lib/tsan/rtl/tsan_suppressions.h index 61a4cca9d17..c5883167058 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_suppressions.h +++ b/compiler-rt/lib/tsan/rtl/tsan_suppressions.h @@ -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 diff --git a/compiler-rt/lib/tsan/tests/unit/tsan_suppressions_test.cc b/compiler-rt/lib/tsan/tests/unit/tsan_suppressions_test.cc index e1e0c12c004..decfa3214d2 100644 --- a/compiler-rt/lib/tsan/tests/unit/tsan_suppressions_test.cc +++ b/compiler-rt/lib/tsan/tests/unit/tsan_suppressions_test.cc @@ -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" |

