diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-09-10 16:16:27 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-09-10 16:16:27 +0000 |
commit | d397a9ba1d26c75459bcc3f01c8beb8c380c44bd (patch) | |
tree | ff726abde3f7cb9e3bc33a6a2fb93b7b6c088e53 | |
parent | 9f6581bb88c5e2575c0cbd07103c76a528065192 (diff) | |
download | bcm5719-llvm-d397a9ba1d26c75459bcc3f01c8beb8c380c44bd.tar.gz bcm5719-llvm-d397a9ba1d26c75459bcc3f01c8beb8c380c44bd.zip |
Fixup for r190410: use lazy initialization for symbolizer as some compilers emit global constructor to setup vptr
llvm-svn: 190414
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc | 14 |
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 |