[compiler-rt][hwasan] Add InitState options to thread initialization
Similar to InitOptions in asan, we can use this optional struct for initializing some members thread objects before they are created. On linux, this is unused and can remain undefined. On fuchsia, this will just be the stack bounds. Differential Revision: https://reviews.llvm.org/D104553
This commit is contained in:
parent
fb9f9497dc
commit
b06fbdeae7
@ -428,7 +428,7 @@ void HwasanOnDeadlySignal(int signo, void *info, void *context) {
|
||||
HandleDeadlySignal(info, context, GetTid(), &OnStackUnwind, nullptr);
|
||||
}
|
||||
|
||||
void Thread::InitStackAndTls() {
|
||||
void Thread::InitStackAndTls(const InitState *) {
|
||||
uptr tls_size;
|
||||
uptr stack_size;
|
||||
GetThreadStackAndTls(IsMainThread(), &stack_bottom_, &stack_size, &tls_begin_,
|
||||
|
||||
@ -34,7 +34,8 @@ void Thread::InitRandomState() {
|
||||
stack_allocations_->push(0);
|
||||
}
|
||||
|
||||
void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) {
|
||||
void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size,
|
||||
const InitState *state) {
|
||||
CHECK_EQ(0, unique_id_); // try to catch bad stack reuse
|
||||
CHECK_EQ(0, stack_top_);
|
||||
CHECK_EQ(0, stack_bottom_);
|
||||
@ -44,7 +45,7 @@ void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) {
|
||||
if (auto sz = flags()->heap_history_size)
|
||||
heap_allocations_ = HeapAllocationsRingBuffer::New(sz);
|
||||
|
||||
InitStackAndTls();
|
||||
InitStackAndTls(state);
|
||||
InitStackRingBuffer(stack_buffer_start, stack_buffer_size);
|
||||
}
|
||||
|
||||
|
||||
@ -23,9 +23,13 @@ typedef __sanitizer::CompactRingBuffer<uptr> StackAllocationsRingBuffer;
|
||||
|
||||
class Thread {
|
||||
public:
|
||||
void Init(uptr stack_buffer_start, uptr stack_buffer_size);
|
||||
// These are optional parameters that can be passed to Init.
|
||||
struct InitState;
|
||||
|
||||
void Init(uptr stack_buffer_start, uptr stack_buffer_size,
|
||||
const InitState *state = nullptr);
|
||||
void InitRandomState();
|
||||
void InitStackAndTls();
|
||||
void InitStackAndTls(const InitState *state = nullptr);
|
||||
|
||||
// Must be called from the thread itself.
|
||||
void InitStackRingBuffer(uptr stack_buffer_start, uptr stack_buffer_size);
|
||||
|
||||
@ -85,7 +85,7 @@ class HwasanThreadList {
|
||||
RoundUpTo(ring_buffer_size_ + sizeof(Thread), ring_buffer_size_ * 2);
|
||||
}
|
||||
|
||||
Thread *CreateCurrentThread() {
|
||||
Thread *CreateCurrentThread(const Thread::InitState *state = nullptr) {
|
||||
Thread *t = nullptr;
|
||||
{
|
||||
SpinMutexLock l(&free_list_mutex_);
|
||||
@ -104,7 +104,7 @@ class HwasanThreadList {
|
||||
SpinMutexLock l(&live_list_mutex_);
|
||||
live_list_.push_back(t);
|
||||
}
|
||||
t->Init((uptr)t - ring_buffer_size_, ring_buffer_size_);
|
||||
t->Init((uptr)t - ring_buffer_size_, ring_buffer_size_, state);
|
||||
AddThreadStats(t);
|
||||
return t;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user