[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