diff options
| author | Alexey Samsonov <vonosmas@gmail.com> | 2014-08-05 00:43:23 +0000 |
|---|---|---|
| committer | Alexey Samsonov <vonosmas@gmail.com> | 2014-08-05 00:43:23 +0000 |
| commit | ae1764854ec93f0798fae1e23539215c7cd2c48d (patch) | |
| tree | 0b7351bcb29dec705d001a811479ccbdc2097ab2 | |
| parent | 02dc000331fde73866bde34a343dda8266c9b1a2 (diff) | |
| download | bcm5719-llvm-ae1764854ec93f0798fae1e23539215c7cd2c48d.tar.gz bcm5719-llvm-ae1764854ec93f0798fae1e23539215c7cd2c48d.zip | |
[Sanitizer] Turn SuppressionContext::Init() into InitIfNecessary().
Suppression context might be used in multiple sanitizers working
simultaneously (e.g. LSan and UBSan) and not knowing about each other.
llvm-svn: 214831
4 files changed, 17 insertions, 7 deletions
diff --git a/compiler-rt/lib/lsan/lsan_common.cc b/compiler-rt/lib/lsan/lsan_common.cc index 39c08a7ca7b..62fab033b38 100644 --- a/compiler-rt/lib/lsan/lsan_common.cc +++ b/compiler-rt/lib/lsan/lsan_common.cc @@ -83,10 +83,14 @@ static void InitializeFlags() { if (flags()->log_threads) Report(__VA_ARGS__); \ } while (0); +static bool suppressions_inited = false; + void InitializeSuppressions() { - SuppressionContext::Init(); + CHECK(!suppressions_inited); + SuppressionContext::InitIfNecessary(); if (&__lsan_default_suppressions) SuppressionContext::Get()->Parse(__lsan_default_suppressions()); + suppressions_inited = true; } struct RootRegion { diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_suppressions.cc b/compiler-rt/lib/sanitizer_common/sanitizer_suppressions.cc index e0056abc854..1716dcc44cb 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_suppressions.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_suppressions.cc @@ -75,8 +75,9 @@ SuppressionContext *SuppressionContext::Get() { return suppression_ctx; } -void SuppressionContext::Init() { - CHECK(!suppression_ctx); +void SuppressionContext::InitIfNecessary() { + if (suppression_ctx) + return; suppression_ctx = new(placeholder) SuppressionContext; if (common_flags()->suppressions[0] == '\0') return; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_suppressions.h b/compiler-rt/lib/sanitizer_common/sanitizer_suppressions.h index 593b7a5e849..33f7250397a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_suppressions.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_suppressions.h @@ -45,9 +45,10 @@ class SuppressionContext { const Suppression *SuppressionAt(uptr i) const; void GetMatched(InternalMmapVector<Suppression *> *matched); - // Create a SuppressionContext singleton. Not thread safe. Must be called - // early during initialization. - static void Init(); + // Create a SuppressionContext singleton if it hasn't been created earlier. + // Not thread safe. Must be called early during initialization (but after + // runtime flags are parsed). + static void InitIfNecessary(); // Returns a SuppressionContext singleton. static SuppressionContext *Get(); diff --git a/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc b/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc index 82a82644a93..aa63c92588f 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc @@ -41,12 +41,16 @@ extern "C" const char *WEAK __tsan_default_suppressions() { namespace __tsan { +static bool suppressions_inited = false; + void InitializeSuppressions() { - SuppressionContext::Init(); + CHECK(!suppressions_inited); + SuppressionContext::InitIfNecessary(); #ifndef TSAN_GO SuppressionContext::Get()->Parse(__tsan_default_suppressions()); SuppressionContext::Get()->Parse(std_suppressions); #endif + suppressions_inited = true; } SuppressionType conv(ReportType typ) { |

