diff options
author | Kuba Brecka <kuba.brecka@gmail.com> | 2014-11-29 14:18:05 +0000 |
---|---|---|
committer | Kuba Brecka <kuba.brecka@gmail.com> | 2014-11-29 14:18:05 +0000 |
commit | c1b9903422e9e8e8a80e9e6d298db191c08e7e7d (patch) | |
tree | 7cfc6fc6adb177c827209365ca633906fca3cac1 | |
parent | 58fc35cb4794a3129f5d11f63ce01f1e16484ad7 (diff) | |
download | compiler-rt-c1b9903422e9e8e8a80e9e6d298db191c08e7e7d.tar.gz |
Add a HasSuppressionType method into SuppressionContext
Extending SuppressionContext to add a HasSuppressionType method that tells whether a certain suppression type is currently used or not. It's a step to implement issue suppressions for ASan, see http://reviews.llvm.org/D6280.
Reviewed at http://reviews.llvm.org/D6443
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@222954 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/sanitizer_common/sanitizer_suppressions.cc | 11 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_suppressions.h | 4 | ||||
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_suppressions_test.cc | 10 |
3 files changed, 24 insertions, 1 deletions
diff --git a/lib/sanitizer_common/sanitizer_suppressions.cc b/lib/sanitizer_common/sanitizer_suppressions.cc index 7f76693e5..2d6f76a85 100644 --- a/lib/sanitizer_common/sanitizer_suppressions.cc +++ b/lib/sanitizer_common/sanitizer_suppressions.cc @@ -70,6 +70,10 @@ bool TemplateMatch(char *templ, const char *str) { ALIGNED(64) static char placeholder[sizeof(SuppressionContext)]; static SuppressionContext *suppression_ctx = 0; +SuppressionContext::SuppressionContext() : suppressions_(1), can_parse_(true) { + internal_memset(has_suppresson_type_, 0, sizeof(has_suppresson_type_)); +} + SuppressionContext *SuppressionContext::Get() { CHECK(suppression_ctx); return suppression_ctx; @@ -96,6 +100,8 @@ void SuppressionContext::InitIfNecessary() { bool SuppressionContext::Match(const char *str, SuppressionType type, Suppression **s) { + if (!has_suppresson_type_[type]) + return false; can_parse_ = false; uptr i; for (i = 0; i < suppressions_.size(); i++) @@ -151,6 +157,7 @@ void SuppressionContext::Parse(const char *str) { s.hit_count = 0; s.weight = 0; suppressions_.push_back(s); + has_suppresson_type_[s.type] = true; } if (end[0] == 0) break; @@ -162,6 +169,10 @@ uptr SuppressionContext::SuppressionCount() const { return suppressions_.size(); } +bool SuppressionContext::HasSuppressionType(SuppressionType type) const { + return has_suppresson_type_[type]; +} + const Suppression *SuppressionContext::SuppressionAt(uptr i) const { CHECK_LT(i, suppressions_.size()); return &suppressions_[i]; diff --git a/lib/sanitizer_common/sanitizer_suppressions.h b/lib/sanitizer_common/sanitizer_suppressions.h index 37fd3c4f0..897ea4f72 100644 --- a/lib/sanitizer_common/sanitizer_suppressions.h +++ b/lib/sanitizer_common/sanitizer_suppressions.h @@ -43,6 +43,7 @@ class SuppressionContext { void Parse(const char *str); bool Match(const char* str, SuppressionType type, Suppression **s); uptr SuppressionCount() const; + bool HasSuppressionType(SuppressionType type) const; const Suppression *SuppressionAt(uptr i) const; void GetMatched(InternalMmapVector<Suppression *> *matched); @@ -54,8 +55,9 @@ class SuppressionContext { static SuppressionContext *Get(); private: - SuppressionContext() : suppressions_(1), can_parse_(true) {} + SuppressionContext(); InternalMmapVector<Suppression> suppressions_; + bool has_suppresson_type_[SuppressionTypeCount]; bool can_parse_; friend class SuppressionContextTest; diff --git a/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc b/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc index 2a1e356b9..272e50b14 100644 --- a/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc +++ b/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc @@ -153,4 +153,14 @@ TEST_F(SuppressionContextTest, ParseType) { EXPECT_EQ(0, strcmp((*Suppressions())[0].templ, "foo")); } +TEST_F(SuppressionContextTest, HasSuppressionType) { + ctx_->Parse( + "race:foo\n" + "thread:bar\n"); + EXPECT_TRUE(ctx_->HasSuppressionType(SuppressionRace)); + EXPECT_TRUE(ctx_->HasSuppressionType(SuppressionThread)); + EXPECT_FALSE(ctx_->HasSuppressionType(SuppressionMutex)); + EXPECT_FALSE(ctx_->HasSuppressionType(SuppressionSignal)); +} + } // namespace __sanitizer |