[sanitizer] add CombinedAllocator::InitIfLinkerInitialized and use it in lsan: speeds...
authorKostya Serebryany <kcc@google.com>
Wed, 17 Dec 2014 23:06:36 +0000 (23:06 +0000)
committerKostya Serebryany <kcc@google.com>
Wed, 17 Dec 2014 23:06:36 +0000 (23:06 +0000)
llvm-svn: 224469

compiler-rt/lib/lsan/lsan_allocator.cc
compiler-rt/lib/sanitizer_common/sanitizer_allocator.h

index 4d0fbab..c2c2c8b 100644 (file)
@@ -47,7 +47,7 @@ static Allocator allocator;
 static THREADLOCAL AllocatorCache cache;
 
 void InitializeAllocator() {
-  allocator.Init(common_flags()->allocator_may_return_null);
+  allocator.InitIfLinkerInitialized(common_flags()->allocator_may_return_null);
 }
 
 void AllocatorThreadFinish() {
index d0ae90b..71930ba 100644 (file)
@@ -211,6 +211,7 @@ class AllocatorStats {
   void Init() {
     internal_memset(this, 0, sizeof(*this));
   }
+  void InitIfLinkerInitialized() {}
 
   void Add(AllocatorStat i, uptr v) {
     v += atomic_load(&stats_[i], memory_order_relaxed);
@@ -240,11 +241,14 @@ class AllocatorStats {
 // Global stats, used for aggregation and querying.
 class AllocatorGlobalStats : public AllocatorStats {
  public:
-  void Init() {
-    internal_memset(this, 0, sizeof(*this));
+  void InitIfLinkerInitialized() {
     next_ = this;
     prev_ = this;
   }
+  void Init() {
+    internal_memset(this, 0, sizeof(*this));
+    InitIfLinkerInitialized();
+  }
 
   void Register(AllocatorStats *s) {
     SpinMutexLock l(&mu_);
@@ -1002,12 +1006,16 @@ struct SizeClassAllocatorLocalCache {
 template <class MapUnmapCallback = NoOpMapUnmapCallback>
 class LargeMmapAllocator {
  public:
-  void Init(bool may_return_null) {
-    internal_memset(this, 0, sizeof(*this));
+  void InitIfLinkerInitialized(bool may_return_null) {
     page_size_ = GetPageSizeCached();
     atomic_store(&may_return_null_, may_return_null, memory_order_relaxed);
   }
 
+  void Init(bool may_return_null) {
+    internal_memset(this, 0, sizeof(*this));
+    InitIfLinkerInitialized(may_return_null);
+  }
+
   void *Allocate(AllocatorStats *stat, uptr size, uptr alignment) {
     CHECK(IsPowerOfTwo(alignment));
     uptr map_size = RoundUpMapSize(size);
@@ -1253,11 +1261,21 @@ template <class PrimaryAllocator, class AllocatorCache,
           class SecondaryAllocator>  // NOLINT
 class CombinedAllocator {
  public:
-  void Init(bool may_return_null) {
+  void InitCommon(bool may_return_null) {
     primary_.Init();
+    atomic_store(&may_return_null_, may_return_null, memory_order_relaxed);
+  }
+
+  void InitIfLinkerInitialized(bool may_return_null) {
+    secondary_.InitIfLinkerInitialized(may_return_null);
+    stats_.InitIfLinkerInitialized();
+    InitCommon(may_return_null);
+  }
+
+  void Init(bool may_return_null) {
     secondary_.Init(may_return_null);
     stats_.Init();
-    atomic_store(&may_return_null_, may_return_null, memory_order_relaxed);
+    InitCommon(may_return_null);
   }
 
   void *Allocate(AllocatorCache *cache, uptr size, uptr alignment,