summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Samsonov <vonosmas@gmail.com>2014-08-05 00:43:23 +0000
committerAlexey Samsonov <vonosmas@gmail.com>2014-08-05 00:43:23 +0000
commitae1764854ec93f0798fae1e23539215c7cd2c48d (patch)
tree0b7351bcb29dec705d001a811479ccbdc2097ab2
parent02dc000331fde73866bde34a343dda8266c9b1a2 (diff)
downloadbcm5719-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
-rw-r--r--compiler-rt/lib/lsan/lsan_common.cc6
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_suppressions.cc5
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_suppressions.h7
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_suppressions.cc6
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) {
OpenPOWER on IntegriCloud