diff --git a/compiler-rt/lib/asan/asan_fake_stack.cpp b/compiler-rt/lib/asan/asan_fake_stack.cpp index 5034ea2a0e459..d243b5739a309 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.cpp +++ b/compiler-rt/lib/asan/asan_fake_stack.cpp @@ -231,17 +231,25 @@ static FakeStack* GetFakeStack() { } static FakeStack* GetFakeStackFast() { - if (FakeStack* fs = GetTLSFakeStack()) + FakeStack* fs = GetTLSFakeStack(); + if (LIKELY(fs)) return fs; if (!__asan_option_detect_stack_use_after_return) return nullptr; - return GetFakeStack(); + fs = GetFakeStack(); + if (LIKELY(fs)) + SetTLSFakeStack(fs); + return fs; } static FakeStack* GetFakeStackFastAlways() { - if (FakeStack* fs = GetTLSFakeStack()) + FakeStack* fs = GetTLSFakeStack(); + if (LIKELY(fs)) return fs; - return GetFakeStack(); + fs = GetFakeStack(); + if (LIKELY(fs)) + SetTLSFakeStack(fs); + return fs; } static ALWAYS_INLINE uptr OnMalloc(uptr class_id, uptr size) { diff --git a/compiler-rt/lib/asan/asan_fake_stack.h b/compiler-rt/lib/asan/asan_fake_stack.h index ec772c3299f00..7dedb29809d22 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.h +++ b/compiler-rt/lib/asan/asan_fake_stack.h @@ -195,7 +195,7 @@ class FakeStack { void *true_start; }; -void SetTLSFakeStack(FakeStack *fs); +void SetTLSFakeStack(FakeStack* fs); } // namespace __asan