[PATCH] D104248: [compiler-rt][hwasan] Move Thread::Init into hwasan_linux.cpp
leonardchan added inline comments. Comment at: compiler-rt/lib/hwasan/hwasan_linux.cpp:430 +void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) { + CHECK_EQ(0, unique_id_); // try to catch bad stack reuse mcgrathr wrote: > Most of this code can actually be reused for Fuchsia (just not necessarily in > Thread::Init). > It's probably better to split it up for reuse rather than just moving the > whole thing to linux-specific. So maybe something like the current patch? Then on Fuchsia we could (1) have a custom implementation of `InitStackAndTls`, (2) wrap the call to `Thread::InitStackRingBuffer` in `Thread::Init` with a `#if SANITIZER_FUCHSIA` so it's not called before thread creation, then (2) call `Thread::InitStackRingBuffer` in the `__sanitizer_thread_start_hook` hook. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D104248/new/ https://reviews.llvm.org/D104248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D104248: [compiler-rt][hwasan] Move Thread::Init into hwasan_linux.cpp
leonardchan updated this revision to Diff 351957. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D104248/new/ https://reviews.llvm.org/D104248 Files: compiler-rt/lib/hwasan/hwasan_linux.cpp compiler-rt/lib/hwasan/hwasan_thread.cpp compiler-rt/lib/hwasan/hwasan_thread.h Index: compiler-rt/lib/hwasan/hwasan_thread.h === --- compiler-rt/lib/hwasan/hwasan_thread.h +++ compiler-rt/lib/hwasan/hwasan_thread.h @@ -23,8 +23,13 @@ class Thread { public: - void Init(uptr stack_buffer_start, uptr stack_buffer_size); // Must be called from the thread itself. + void Init(uptr stack_buffer_start, uptr stack_buffer_size); void InitRandomState(); + void InitStackAndTls(); + + // Must be called from the thread itself. + void InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size); + void Destroy(); uptr stack_top() { return stack_top_; } Index: compiler-rt/lib/hwasan/hwasan_thread.cpp === --- compiler-rt/lib/hwasan/hwasan_thread.cpp +++ compiler-rt/lib/hwasan/hwasan_thread.cpp @@ -44,6 +44,11 @@ if (auto sz = flags()->heap_history_size) heap_allocations_ = HeapAllocationsRingBuffer::New(sz); + InitStackAndTls(); + InitStackAndRingBuffer(stack_buffer_start, stack_buffer_size); +} + +void Thread::InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size) { HwasanTSDThreadInit(); // Only needed with interceptors. uptr *ThreadLong = GetCurrentThreadLongPtr(); // The following implicitly sets (this) as the current thread. @@ -55,13 +60,6 @@ // ScopedTaggingDisable needs GetCurrentThread to be set up. ScopedTaggingDisabler disabler; - uptr tls_size; - uptr stack_size; - GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, - _size); - stack_top_ = stack_bottom_ + stack_size; - tls_end_ = tls_begin_ + tls_size; - if (stack_bottom_) { int local; CHECK(AddrIsInStack((uptr))); Index: compiler-rt/lib/hwasan/hwasan_linux.cpp === --- compiler-rt/lib/hwasan/hwasan_linux.cpp +++ compiler-rt/lib/hwasan/hwasan_linux.cpp @@ -427,6 +427,14 @@ HandleDeadlySignal(info, context, GetTid(), , nullptr); } +void Thread::InitStackAndTls() { + uptr tls_size; + uptr stack_size; + GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, + _size); + stack_top_ = stack_bottom_ + stack_size; + tls_end_ = tls_begin_ + tls_size; +} } // namespace __hwasan Index: compiler-rt/lib/hwasan/hwasan_thread.h === --- compiler-rt/lib/hwasan/hwasan_thread.h +++ compiler-rt/lib/hwasan/hwasan_thread.h @@ -23,8 +23,13 @@ class Thread { public: - void Init(uptr stack_buffer_start, uptr stack_buffer_size); // Must be called from the thread itself. + void Init(uptr stack_buffer_start, uptr stack_buffer_size); void InitRandomState(); + void InitStackAndTls(); + + // Must be called from the thread itself. + void InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size); + void Destroy(); uptr stack_top() { return stack_top_; } Index: compiler-rt/lib/hwasan/hwasan_thread.cpp === --- compiler-rt/lib/hwasan/hwasan_thread.cpp +++ compiler-rt/lib/hwasan/hwasan_thread.cpp @@ -44,6 +44,11 @@ if (auto sz = flags()->heap_history_size) heap_allocations_ = HeapAllocationsRingBuffer::New(sz); + InitStackAndTls(); + InitStackAndRingBuffer(stack_buffer_start, stack_buffer_size); +} + +void Thread::InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size) { HwasanTSDThreadInit(); // Only needed with interceptors. uptr *ThreadLong = GetCurrentThreadLongPtr(); // The following implicitly sets (this) as the current thread. @@ -55,13 +60,6 @@ // ScopedTaggingDisable needs GetCurrentThread to be set up. ScopedTaggingDisabler disabler; - uptr tls_size; - uptr stack_size; - GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, - _size); - stack_top_ = stack_bottom_ + stack_size; - tls_end_ = tls_begin_ + tls_size; - if (stack_bottom_) { int local; CHECK(AddrIsInStack((uptr))); Index: compiler-rt/lib/hwasan/hwasan_linux.cpp === --- compiler-rt/lib/hwasan/hwasan_linux.cpp +++ compiler-rt/lib/hwasan/hwasan_linux.cpp @@ -427,6 +427,14 @@ HandleDeadlySignal(info, context, GetTid(), , nullptr); } +void Thread::InitStackAndTls() { + uptr tls_size; + uptr stack_size; + GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, + _size); + stack_top_ = stack_bottom_ + stack_size; + tls_end_ = tls_begin_ + tls_size; +} } // namespace __hwasan
[PATCH] D104248: [compiler-rt][hwasan] Move Thread::Init into hwasan_linux.cpp
leonardchan updated this revision to Diff 351953. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D104248/new/ https://reviews.llvm.org/D104248 Files: compiler-rt/lib/hwasan/hwasan_thread.cpp compiler-rt/lib/hwasan/hwasan_thread.h Index: compiler-rt/lib/hwasan/hwasan_thread.h === --- compiler-rt/lib/hwasan/hwasan_thread.h +++ compiler-rt/lib/hwasan/hwasan_thread.h @@ -23,8 +23,13 @@ class Thread { public: - void Init(uptr stack_buffer_start, uptr stack_buffer_size); // Must be called from the thread itself. + void Init(uptr stack_buffer_start, uptr stack_buffer_size); void InitRandomState(); + void InitStackAndTls(); + + // Must be called from the thread itself. + void InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size); + void Destroy(); uptr stack_top() { return stack_top_; } Index: compiler-rt/lib/hwasan/hwasan_thread.cpp === --- compiler-rt/lib/hwasan/hwasan_thread.cpp +++ compiler-rt/lib/hwasan/hwasan_thread.cpp @@ -44,6 +44,20 @@ if (auto sz = flags()->heap_history_size) heap_allocations_ = HeapAllocationsRingBuffer::New(sz); + InitStackAndTls(); + InitStackAndRingBuffer(stack_buffer_start, stack_buffer_size); +} + +void Thread::InitStackAndTls() { + uptr tls_size; + uptr stack_size; + GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, + _size); + stack_top_ = stack_bottom_ + stack_size; + tls_end_ = tls_begin_ + tls_size; +} + +void Thread::InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size) { HwasanTSDThreadInit(); // Only needed with interceptors. uptr *ThreadLong = GetCurrentThreadLongPtr(); // The following implicitly sets (this) as the current thread. @@ -55,13 +69,6 @@ // ScopedTaggingDisable needs GetCurrentThread to be set up. ScopedTaggingDisabler disabler; - uptr tls_size; - uptr stack_size; - GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, - _size); - stack_top_ = stack_bottom_ + stack_size; - tls_end_ = tls_begin_ + tls_size; - if (stack_bottom_) { int local; CHECK(AddrIsInStack((uptr))); Index: compiler-rt/lib/hwasan/hwasan_thread.h === --- compiler-rt/lib/hwasan/hwasan_thread.h +++ compiler-rt/lib/hwasan/hwasan_thread.h @@ -23,8 +23,13 @@ class Thread { public: - void Init(uptr stack_buffer_start, uptr stack_buffer_size); // Must be called from the thread itself. + void Init(uptr stack_buffer_start, uptr stack_buffer_size); void InitRandomState(); + void InitStackAndTls(); + + // Must be called from the thread itself. + void InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size); + void Destroy(); uptr stack_top() { return stack_top_; } Index: compiler-rt/lib/hwasan/hwasan_thread.cpp === --- compiler-rt/lib/hwasan/hwasan_thread.cpp +++ compiler-rt/lib/hwasan/hwasan_thread.cpp @@ -44,6 +44,20 @@ if (auto sz = flags()->heap_history_size) heap_allocations_ = HeapAllocationsRingBuffer::New(sz); + InitStackAndTls(); + InitStackAndRingBuffer(stack_buffer_start, stack_buffer_size); +} + +void Thread::InitStackAndTls() { + uptr tls_size; + uptr stack_size; + GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, + _size); + stack_top_ = stack_bottom_ + stack_size; + tls_end_ = tls_begin_ + tls_size; +} + +void Thread::InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size) { HwasanTSDThreadInit(); // Only needed with interceptors. uptr *ThreadLong = GetCurrentThreadLongPtr(); // The following implicitly sets (this) as the current thread. @@ -55,13 +69,6 @@ // ScopedTaggingDisable needs GetCurrentThread to be set up. ScopedTaggingDisabler disabler; - uptr tls_size; - uptr stack_size; - GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, - _size); - stack_top_ = stack_bottom_ + stack_size; - tls_end_ = tls_begin_ + tls_size; - if (stack_bottom_) { int local; CHECK(AddrIsInStack((uptr))); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D104248: [compiler-rt][hwasan] Move Thread::Init into hwasan_linux.cpp
mcgrathr added inline comments. Comment at: compiler-rt/lib/hwasan/hwasan_linux.cpp:430 +void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) { + CHECK_EQ(0, unique_id_); // try to catch bad stack reuse Most of this code can actually be reused for Fuchsia (just not necessarily in Thread::Init). It's probably better to split it up for reuse rather than just moving the whole thing to linux-specific. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D104248/new/ https://reviews.llvm.org/D104248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D104248: [compiler-rt][hwasan] Move Thread::Init into hwasan_linux.cpp
leonardchan created this revision. leonardchan added reviewers: eugenis, vitalybuka, pcc. leonardchan added a project: Sanitizers. Herald added a subscriber: dberris. leonardchan requested review of this revision. Herald added a subscriber: Sanitizers. This allows for other implementations to define their own version of `Thread::Init`. This will be the case for Fuchsia where much of the thread initialization can be broken up between different thread hooks (`__sanitizer_before_thread_create_hook`, `__sanitizer_thread_create_hook`, `__sanitizer_thread_start_hook`). Namely, setting up the heap ring buffer and stack info and can be setup before thread creation. The stack ring buffer can also be setup before thread creation, but storing it into `__hwasan_tls` can only be done on the thread start hook since it's only then we can access `__hwasan_tls` for that thread correctly. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D104248 Files: compiler-rt/lib/hwasan/hwasan_linux.cpp compiler-rt/lib/hwasan/hwasan_thread.cpp Index: compiler-rt/lib/hwasan/hwasan_thread.cpp === --- compiler-rt/lib/hwasan/hwasan_thread.cpp +++ compiler-rt/lib/hwasan/hwasan_thread.cpp @@ -34,51 +34,6 @@ stack_allocations_->push(0); } -void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) { - CHECK_EQ(0, unique_id_); // try to catch bad stack reuse - CHECK_EQ(0, stack_top_); - CHECK_EQ(0, stack_bottom_); - - static u64 unique_id; - unique_id_ = unique_id++; - if (auto sz = flags()->heap_history_size) -heap_allocations_ = HeapAllocationsRingBuffer::New(sz); - - HwasanTSDThreadInit(); // Only needed with interceptors. - uptr *ThreadLong = GetCurrentThreadLongPtr(); - // The following implicitly sets (this) as the current thread. - stack_allocations_ = new (ThreadLong) - StackAllocationsRingBuffer((void *)stack_buffer_start, stack_buffer_size); - // Check that it worked. - CHECK_EQ(GetCurrentThread(), this); - - // ScopedTaggingDisable needs GetCurrentThread to be set up. - ScopedTaggingDisabler disabler; - - uptr tls_size; - uptr stack_size; - GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, - _size); - stack_top_ = stack_bottom_ + stack_size; - tls_end_ = tls_begin_ + tls_size; - - if (stack_bottom_) { -int local; -CHECK(AddrIsInStack((uptr))); -CHECK(MemIsApp(stack_bottom_)); -CHECK(MemIsApp(stack_top_ - 1)); - } - - if (flags()->verbose_threads) { -if (IsMainThread()) { - Printf("sizeof(Thread): %zd sizeof(HeapRB): %zd sizeof(StackRB): %zd\n", - sizeof(Thread), heap_allocations_->SizeInBytes(), - stack_allocations_->size() * sizeof(uptr)); -} -Print("Creating : "); - } -} - void Thread::ClearShadowForThreadStackAndTLS() { if (stack_top_ != stack_bottom_) TagMemory(stack_bottom_, stack_top_ - stack_bottom_, 0); Index: compiler-rt/lib/hwasan/hwasan_linux.cpp === --- compiler-rt/lib/hwasan/hwasan_linux.cpp +++ compiler-rt/lib/hwasan/hwasan_linux.cpp @@ -427,6 +427,50 @@ HandleDeadlySignal(info, context, GetTid(), , nullptr); } +void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) { + CHECK_EQ(0, unique_id_); // try to catch bad stack reuse + CHECK_EQ(0, stack_top_); + CHECK_EQ(0, stack_bottom_); + + static u64 unique_id; + unique_id_ = unique_id++; + if (auto sz = flags()->heap_history_size) +heap_allocations_ = HeapAllocationsRingBuffer::New(sz); + + HwasanTSDThreadInit(); // Only needed with interceptors. + uptr *ThreadLong = GetCurrentThreadLongPtr(); + // The following implicitly sets (this) as the current thread. + stack_allocations_ = new (ThreadLong) + StackAllocationsRingBuffer((void *)stack_buffer_start, stack_buffer_size); + // Check that it worked. + CHECK_EQ(GetCurrentThread(), this); + + // ScopedTaggingDisable needs GetCurrentThread to be set up. + ScopedTaggingDisabler disabler; + + uptr tls_size; + uptr stack_size; + GetThreadStackAndTls(IsMainThread(), _bottom_, _size, _begin_, + _size); + stack_top_ = stack_bottom_ + stack_size; + tls_end_ = tls_begin_ + tls_size; + + if (stack_bottom_) { +int local; +CHECK(AddrIsInStack((uptr))); +CHECK(MemIsApp(stack_bottom_)); +CHECK(MemIsApp(stack_top_ - 1)); + } + + if (flags()->verbose_threads) { +if (IsMainThread()) { + Printf("sizeof(Thread): %zd sizeof(HeapRB): %zd sizeof(StackRB): %zd\n", + sizeof(Thread), heap_allocations_->SizeInBytes(), + stack_allocations_->size() * sizeof(uptr)); +} +Print("Creating : "); + } +} } // namespace __hwasan ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits