forked from OSchip/llvm-project
[compiler-rt][hwasan] Move Thread::Init into hwasan_linux.cpp
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. Differential Revision: https://reviews.llvm.org/D104248
This commit is contained in:
parent
79caf69cc0
commit
88d93923e6
|
@ -427,6 +427,14 @@ void HwasanOnDeadlySignal(int signo, void *info, void *context) {
|
|||
HandleDeadlySignal(info, context, GetTid(), &OnStackUnwind, nullptr);
|
||||
}
|
||||
|
||||
void Thread::InitStackAndTls() {
|
||||
uptr tls_size;
|
||||
uptr stack_size;
|
||||
GetThreadStackAndTls(IsMainThread(), &stack_bottom_, &stack_size, &tls_begin_,
|
||||
&tls_size);
|
||||
stack_top_ = stack_bottom_ + stack_size;
|
||||
tls_end_ = tls_begin_ + tls_size;
|
||||
}
|
||||
|
||||
} // namespace __hwasan
|
||||
|
||||
|
|
|
@ -44,6 +44,12 @@ void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) {
|
|||
if (auto sz = flags()->heap_history_size)
|
||||
heap_allocations_ = HeapAllocationsRingBuffer::New(sz);
|
||||
|
||||
InitStackAndTls();
|
||||
InitStackRingBuffer(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 +61,6 @@ void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) {
|
|||
// ScopedTaggingDisable needs GetCurrentThread to be set up.
|
||||
ScopedTaggingDisabler disabler;
|
||||
|
||||
uptr tls_size;
|
||||
uptr stack_size;
|
||||
GetThreadStackAndTls(IsMainThread(), &stack_bottom_, &stack_size, &tls_begin_,
|
||||
&tls_size);
|
||||
stack_top_ = stack_bottom_ + stack_size;
|
||||
tls_end_ = tls_begin_ + tls_size;
|
||||
|
||||
if (stack_bottom_) {
|
||||
int local;
|
||||
CHECK(AddrIsInStack((uptr)&local));
|
||||
|
|
|
@ -23,8 +23,13 @@ typedef __sanitizer::CompactRingBuffer<uptr> StackAllocationsRingBuffer;
|
|||
|
||||
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_; }
|
||||
|
|
Loading…
Reference in New Issue