summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2014-12-17 23:06:36 +0000
committerKostya Serebryany <kcc@google.com>2014-12-17 23:06:36 +0000
commit20f3a52249b8cb46beafb00972d9fab1b88eb2b5 (patch)
tree74cf412e6ebb6f210cd8b416b3b8fe7f1a8b14f5 /compiler-rt/lib/sanitizer_common/sanitizer_allocator.h
parentc9d1c27d48eb2a62a4018b97b39d3e85edfef62d (diff)
downloadbcm5719-llvm-20f3a52249b8cb46beafb00972d9fab1b88eb2b5.tar.gz
bcm5719-llvm-20f3a52249b8cb46beafb00972d9fab1b88eb2b5.zip
[sanitizer] add CombinedAllocator::InitIfLinkerInitialized and use it in lsan: speeds up lsan start-up time by ~25%
llvm-svn: 224469
Diffstat (limited to 'compiler-rt/lib/sanitizer_common/sanitizer_allocator.h')
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_allocator.h30
1 files changed, 24 insertions, 6 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h b/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h
index d0ae90b018f..71930ba6b70 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h
@@ -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,
OpenPOWER on IntegriCloud