summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
index 5a300dd4ffe..9b50e115d94 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
@@ -576,10 +576,20 @@ class Symbolizer : public SymbolizerInterface {
InternalSymbolizer *internal_symbolizer_; // Leaked.
};
-static Symbolizer symbolizer; // Linker initialized.
+static ALIGNED(64) char symbolizer_placeholder[sizeof(Symbolizer)];
+static Symbolizer *symbolizer;
SymbolizerInterface *getSymbolizer() {
- return &symbolizer;
+ static atomic_uint8_t initialized;
+ static StaticSpinMutex init_mu;
+ if (atomic_load(&initialized, memory_order_acquire) == 0) {
+ SpinMutexLock l(&init_mu);
+ if (atomic_load(&initialized, memory_order_relaxed) == 0) {
+ symbolizer = new(symbolizer_placeholder) Symbolizer();
+ atomic_store(&initialized, 1, memory_order_release);
+ }
+ }
+ return symbolizer;
}
} // namespace __sanitizer
OpenPOWER on IntegriCloud