diff options
author | Kostya Serebryany <kcc@google.com> | 2013-09-13 06:04:18 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2013-09-13 06:04:18 +0000 |
commit | 096413ba3b4ef6ab921d6655b6f06839c7c4dc16 (patch) | |
tree | 70c909911eedcd5932dcef0512b21992e8e86025 /compiler-rt | |
parent | 77caab4d7b36edacfa73b7d25e1762800623ee78 (diff) | |
download | bcm5719-llvm-096413ba3b4ef6ab921d6655b6f06839c7c4dc16.tar.gz bcm5719-llvm-096413ba3b4ef6ab921d6655b6f06839c7c4dc16.zip |
[asan] use TLS on Linux to get the FakeStack. Saves 15% performance
llvm-svn: 190661
Diffstat (limited to 'compiler-rt')
-rw-r--r-- | compiler-rt/lib/asan/asan_fake_stack.cc | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/compiler-rt/lib/asan/asan_fake_stack.cc b/compiler-rt/lib/asan/asan_fake_stack.cc index 28da918d760..8edfd41a8a9 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.cc +++ b/compiler-rt/lib/asan/asan_fake_stack.cc @@ -122,10 +122,25 @@ NOINLINE void FakeStack::GC(uptr real_stack) { needs_gc_ = false; } -ALWAYS_INLINE uptr OnMalloc(uptr class_id, uptr size, uptr real_stack) { +static FakeStack *GetFakeStack() { AsanThread *t = GetCurrentThread(); - if (!t) return real_stack; - FakeStack *fs = t->fake_stack(); + if (!t) return 0; + return t->fake_stack(); +} + +static FakeStack *GetFakeStackFast() { +#if SANITIZER_LINUX + static THREADLOCAL FakeStack *fake_stack; + if (!fake_stack) + fake_stack = GetFakeStack(); + return fake_stack; +#else + return GetFakeStack(); +#endif +} + +ALWAYS_INLINE uptr OnMalloc(uptr class_id, uptr size, uptr real_stack) { + FakeStack *fs = GetFakeStackFast(); if (!fs) return real_stack; FakeFrame *ff = fs->Allocate(fs->stack_size_log(), class_id, real_stack); uptr ptr = reinterpret_cast<uptr>(ff); @@ -136,9 +151,7 @@ ALWAYS_INLINE uptr OnMalloc(uptr class_id, uptr size, uptr real_stack) { ALWAYS_INLINE void OnFree(uptr ptr, uptr class_id, uptr size, uptr real_stack) { if (ptr == real_stack) return; - AsanThread *t = GetCurrentThread(); - if (!t) return; - FakeStack *fs = t->fake_stack(); + FakeStack *fs = GetFakeStackFast(); // Must not be 0. FakeFrame *ff = reinterpret_cast<FakeFrame *>(ptr); fs->Deallocate(ff, fs->stack_size_log(), class_id, real_stack); SetShadow(ptr, size, class_id, kMagic8); |