From a303bd701f236534577200565c70746008aadf11 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Tue, 14 Oct 2025 17:35:29 -0700 Subject: [PATCH 1/4] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?= =?UTF-8?q?itial=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.6 --- compiler-rt/lib/asan/asan_fake_stack.cpp | 41 ++++++++++++++---------- compiler-rt/lib/asan/asan_fake_stack.h | 2 +- compiler-rt/lib/asan/asan_thread.cpp | 6 ++-- compiler-rt/lib/asan/asan_thread.h | 2 +- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/compiler-rt/lib/asan/asan_fake_stack.cpp b/compiler-rt/lib/asan/asan_fake_stack.cpp index c3ed2526f0ed4..54da7bb1f3cef 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.cpp +++ b/compiler-rt/lib/asan/asan_fake_stack.cpp @@ -214,35 +214,42 @@ void FakeStack::ForEachFakeFrame(RangeIteratorCallback callback, void *arg) { #if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_FUCHSIA static THREADLOCAL FakeStack *fake_stack_tls; -FakeStack *GetTLSFakeStack() { - return fake_stack_tls; -} -void SetTLSFakeStack(FakeStack *fs) { - fake_stack_tls = fs; -} +FakeStack* GetTLSFakeStack() { return fake_stack_tls; } +static void SetTLSFakeStack(FakeStack* fs) { fake_stack_tls = fs; } +void ResetTLSFakeStack() { fake_stack_tls = nullptr; } #else -FakeStack *GetTLSFakeStack() { return 0; } -void SetTLSFakeStack(FakeStack *fs) { } +FakeStack* GetTLSFakeStack() { return 0; } +static void SetTLSFakeStack(FakeStack*) {} +void ResetTLSFakeStack() {} #endif // (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_FUCHSIA -static FakeStack *GetFakeStack() { - AsanThread *t = GetCurrentThread(); - if (!t) return nullptr; +static FakeStack* GetFakeStack() { + AsanThread* t = GetCurrentThread(); + if (!t) + return nullptr; return t->get_or_create_fake_stack(); } -static FakeStack *GetFakeStackFast() { - if (FakeStack *fs = GetTLSFakeStack()) +static FakeStack* GetFakeStackFast() { + 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()) +static FakeStack* GetFakeStackFastAlways() { + 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 50706e6e5876c..a45ec65c289a3 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.h +++ b/compiler-rt/lib/asan/asan_fake_stack.h @@ -196,7 +196,7 @@ class FakeStack { }; FakeStack *GetTLSFakeStack(); -void SetTLSFakeStack(FakeStack *fs); +void ResetTLSFakeStack(); } // namespace __asan diff --git a/compiler-rt/lib/asan/asan_thread.cpp b/compiler-rt/lib/asan/asan_thread.cpp index 2627ae1289012..0ed58bbe2a73a 100644 --- a/compiler-rt/lib/asan/asan_thread.cpp +++ b/compiler-rt/lib/asan/asan_thread.cpp @@ -163,7 +163,7 @@ void AsanThread::StartSwitchFiber(FakeStack **fake_stack_save, uptr bottom, if (fake_stack_save) *fake_stack_save = fake_stack_; fake_stack_ = nullptr; - SetTLSFakeStack(nullptr); + ResetTLSFakeStack(); // if fake_stack_save is null, the fiber will die, delete the fakestack if (!fake_stack_save && current_fake_stack) current_fake_stack->Destroy(this->tid()); @@ -177,8 +177,8 @@ void AsanThread::FinishSwitchFiber(FakeStack *fake_stack_save, uptr *bottom_old, } if (fake_stack_save) { - SetTLSFakeStack(fake_stack_save); fake_stack_ = fake_stack_save; + ResetTLSFakeStack(); } if (bottom_old) @@ -242,7 +242,7 @@ FakeStack *AsanThread::AsyncSignalSafeLazyInitFakeStack() { Max(stack_size_log, static_cast(flags()->min_uar_stack_size_log)); fake_stack_ = FakeStack::Create(stack_size_log); DCHECK_EQ(GetCurrentThread(), this); - SetTLSFakeStack(fake_stack_); + ResetTLSFakeStack(); return fake_stack_; } return nullptr; diff --git a/compiler-rt/lib/asan/asan_thread.h b/compiler-rt/lib/asan/asan_thread.h index 12f0cc7a62dae..19b7f342e1712 100644 --- a/compiler-rt/lib/asan/asan_thread.h +++ b/compiler-rt/lib/asan/asan_thread.h @@ -104,7 +104,7 @@ class AsanThread { if (!fake_stack_) return; FakeStack *t = fake_stack_; fake_stack_ = nullptr; - SetTLSFakeStack(nullptr); + ResetTLSFakeStack(); t->Destroy(tid); } From c5887f36906fda5896b0d71c451a5fd8931552fc Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Tue, 14 Oct 2025 17:48:31 -0700 Subject: [PATCH 2/4] hide GetTLSFakeStack Created using spr 1.3.6 --- compiler-rt/lib/asan/asan_fake_stack.cpp | 4 ++-- compiler-rt/lib/asan/asan_fake_stack.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/asan/asan_fake_stack.cpp b/compiler-rt/lib/asan/asan_fake_stack.cpp index 54da7bb1f3cef..283ee2a5565e8 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.cpp +++ b/compiler-rt/lib/asan/asan_fake_stack.cpp @@ -214,11 +214,11 @@ void FakeStack::ForEachFakeFrame(RangeIteratorCallback callback, void *arg) { #if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_FUCHSIA static THREADLOCAL FakeStack *fake_stack_tls; -FakeStack* GetTLSFakeStack() { return fake_stack_tls; } +static FakeStack* GetTLSFakeStack() { return fake_stack_tls; } static void SetTLSFakeStack(FakeStack* fs) { fake_stack_tls = fs; } void ResetTLSFakeStack() { fake_stack_tls = nullptr; } #else -FakeStack* GetTLSFakeStack() { return 0; } +static FakeStack* GetTLSFakeStack() { return 0; } static void SetTLSFakeStack(FakeStack*) {} void ResetTLSFakeStack() {} #endif // (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_FUCHSIA diff --git a/compiler-rt/lib/asan/asan_fake_stack.h b/compiler-rt/lib/asan/asan_fake_stack.h index a45ec65c289a3..593c1373c8ff1 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.h +++ b/compiler-rt/lib/asan/asan_fake_stack.h @@ -195,7 +195,6 @@ class FakeStack { void *true_start; }; -FakeStack *GetTLSFakeStack(); void ResetTLSFakeStack(); } // namespace __asan From 8a0fb9147c93201c432bcc28f81de67970e36724 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Tue, 14 Oct 2025 17:49:23 -0700 Subject: [PATCH 3/4] hide GetTLSFakeStack Created using spr 1.3.6 --- compiler-rt/lib/asan/asan_fake_stack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler-rt/lib/asan/asan_fake_stack.cpp b/compiler-rt/lib/asan/asan_fake_stack.cpp index 283ee2a5565e8..e8f2b5330d268 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.cpp +++ b/compiler-rt/lib/asan/asan_fake_stack.cpp @@ -218,7 +218,7 @@ static FakeStack* GetTLSFakeStack() { return fake_stack_tls; } static void SetTLSFakeStack(FakeStack* fs) { fake_stack_tls = fs; } void ResetTLSFakeStack() { fake_stack_tls = nullptr; } #else -static FakeStack* GetTLSFakeStack() { return 0; } +static FakeStack* GetTLSFakeStack() { return nullptr; } static void SetTLSFakeStack(FakeStack*) {} void ResetTLSFakeStack() {} #endif // (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_FUCHSIA From 17fbe43b998ba46497bb5d3b67d4a002695a2a5e Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Wed, 15 Oct 2025 18:20:16 -0700 Subject: [PATCH 4/4] rebase Created using spr 1.3.6 --- compiler-rt/lib/asan/asan_fake_stack.cpp | 6 ++---- compiler-rt/lib/asan/asan_fake_stack.h | 2 +- compiler-rt/lib/asan/asan_thread.cpp | 6 +++--- compiler-rt/lib/asan/asan_thread.h | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/compiler-rt/lib/asan/asan_fake_stack.cpp b/compiler-rt/lib/asan/asan_fake_stack.cpp index d3fa953f31005..d243b5739a309 100644 --- a/compiler-rt/lib/asan/asan_fake_stack.cpp +++ b/compiler-rt/lib/asan/asan_fake_stack.cpp @@ -217,12 +217,10 @@ void FakeStack::ForEachFakeFrame(RangeIteratorCallback callback, void* arg) { static THREADLOCAL FakeStack* fake_stack_tls; static FakeStack* GetTLSFakeStack() { return fake_stack_tls; } -static void SetTLSFakeStack(FakeStack* fs) { fake_stack_tls = fs; } -void ResetTLSFakeStack() { fake_stack_tls = nullptr; } +void SetTLSFakeStack(FakeStack* fs) { fake_stack_tls = fs; } #else static FakeStack* GetTLSFakeStack() { return nullptr; } -static void SetTLSFakeStack(FakeStack*) {} -void ResetTLSFakeStack() {} +void SetTLSFakeStack(FakeStack* fs) {} #endif // (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_FUCHSIA static FakeStack* GetFakeStack() { diff --git a/compiler-rt/lib/asan/asan_fake_stack.h b/compiler-rt/lib/asan/asan_fake_stack.h index 593c1373c8ff1..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 ResetTLSFakeStack(); +void SetTLSFakeStack(FakeStack* fs); } // namespace __asan diff --git a/compiler-rt/lib/asan/asan_thread.cpp b/compiler-rt/lib/asan/asan_thread.cpp index 0ed58bbe2a73a..2627ae1289012 100644 --- a/compiler-rt/lib/asan/asan_thread.cpp +++ b/compiler-rt/lib/asan/asan_thread.cpp @@ -163,7 +163,7 @@ void AsanThread::StartSwitchFiber(FakeStack **fake_stack_save, uptr bottom, if (fake_stack_save) *fake_stack_save = fake_stack_; fake_stack_ = nullptr; - ResetTLSFakeStack(); + SetTLSFakeStack(nullptr); // if fake_stack_save is null, the fiber will die, delete the fakestack if (!fake_stack_save && current_fake_stack) current_fake_stack->Destroy(this->tid()); @@ -177,8 +177,8 @@ void AsanThread::FinishSwitchFiber(FakeStack *fake_stack_save, uptr *bottom_old, } if (fake_stack_save) { + SetTLSFakeStack(fake_stack_save); fake_stack_ = fake_stack_save; - ResetTLSFakeStack(); } if (bottom_old) @@ -242,7 +242,7 @@ FakeStack *AsanThread::AsyncSignalSafeLazyInitFakeStack() { Max(stack_size_log, static_cast(flags()->min_uar_stack_size_log)); fake_stack_ = FakeStack::Create(stack_size_log); DCHECK_EQ(GetCurrentThread(), this); - ResetTLSFakeStack(); + SetTLSFakeStack(fake_stack_); return fake_stack_; } return nullptr; diff --git a/compiler-rt/lib/asan/asan_thread.h b/compiler-rt/lib/asan/asan_thread.h index 19b7f342e1712..12f0cc7a62dae 100644 --- a/compiler-rt/lib/asan/asan_thread.h +++ b/compiler-rt/lib/asan/asan_thread.h @@ -104,7 +104,7 @@ class AsanThread { if (!fake_stack_) return; FakeStack *t = fake_stack_; fake_stack_ = nullptr; - ResetTLSFakeStack(); + SetTLSFakeStack(nullptr); t->Destroy(tid); }