summaryrefslogtreecommitdiffstats
path: root/compiler-rt
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2013-09-13 06:04:18 +0000
committerKostya Serebryany <kcc@google.com>2013-09-13 06:04:18 +0000
commit096413ba3b4ef6ab921d6655b6f06839c7c4dc16 (patch)
tree70c909911eedcd5932dcef0512b21992e8e86025 /compiler-rt
parent77caab4d7b36edacfa73b7d25e1762800623ee78 (diff)
downloadbcm5719-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.cc25
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);
OpenPOWER on IntegriCloud