Fixup for r190410: use lazy initialization for symbolizer as some compilers emit global constructor to setup vptr

llvm-svn: 190414
This commit is contained in:
Alexey Samsonov 2013-09-10 16:16:27 +00:00
parent 9f6581bb88
commit d397a9ba1d
1 changed files with 12 additions and 2 deletions

View File

@ -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