[compiler-rt] r190414 - Fixup for r190410: use lazy initialization for symbolizer as some compilers emit global constructor to setup vptr
Alexey Samsonov
samsonov at google.com
Tue Sep 10 09:16:27 PDT 2013
Author: samsonov
Date: Tue Sep 10 11:16:27 2013
New Revision: 190414
URL: http://llvm.org/viewvc/llvm-project?rev=190414&view=rev
Log:
Fixup for r190410: use lazy initialization for symbolizer as some compilers emit global constructor to setup vptr
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc?rev=190414&r1=190413&r2=190414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc Tue Sep 10 11:16:27 2013
@@ -576,10 +576,20 @@ class Symbolizer : public SymbolizerInte
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
More information about the llvm-commits
mailing list