summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_suppressions.cc16
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_suppressions.h2
-rw-r--r--compiler-rt/lib/tsan/unit_tests/tsan_suppressions_test.cc24
3 files changed, 22 insertions, 20 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc b/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc
index a27a4bf9017..2c7c318a13c 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc
@@ -53,6 +53,8 @@ static char *ReadFile(const char *filename) {
}
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 @@ Suppression *SuppressionParse(const char* supp) {
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 @@ bool IsSuppressed(ReportType typ, const ReportStack *stack) {
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/compiler-rt/lib/tsan/rtl/tsan_suppressions.h b/compiler-rt/lib/tsan/rtl/tsan_suppressions.h
index 606ca6fd49f..29311c123d6 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_suppressions.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_suppressions.h
@@ -32,7 +32,7 @@ enum SuppressionType {
struct Suppression {
Suppression *next;
SuppressionType type;
- char *func;
+ char *templ;
};
Suppression *SuppressionParse(const char* supp);
diff --git a/compiler-rt/lib/tsan/unit_tests/tsan_suppressions_test.cc b/compiler-rt/lib/tsan/unit_tests/tsan_suppressions_test.cc
index 1c0ff1bdee0..f94e529bcd2 100644
--- a/compiler-rt/lib/tsan/unit_tests/tsan_suppressions_test.cc
+++ b/compiler-rt/lib/tsan/unit_tests/tsan_suppressions_test.cc
@@ -29,16 +29,16 @@ TEST(Suppressions, Parse) {
); // 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 @@ TEST(Suppressions, Parse2) {
); // 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 @@ TEST(Suppressions, Parse3) {
); // 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 @@ TEST(Suppressions, ParseType) {
); // 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);
}
OpenPOWER on IntegriCloud