1e3b6d110SNico Weber #include "hwasan_thread_list.h" 2e3b6d110SNico Weber 3371e6d0fSEnna1 #include "sanitizer_common/sanitizer_placement_new.h" 468b76af8SVitaly Buka #include "sanitizer_common/sanitizer_thread_arg_retval.h" 568b76af8SVitaly Buka 6e3b6d110SNico Weber namespace __hwasan { 716a76397SVitaly Buka 8e3b6d110SNico Weber static HwasanThreadList *hwasan_thread_list; 968b76af8SVitaly Buka static ThreadArgRetval *thread_data; 10e3b6d110SNico Weber 11e3b6d110SNico Weber HwasanThreadList &hwasanThreadList() { return *hwasan_thread_list; } 1268b76af8SVitaly Buka ThreadArgRetval &hwasanThreadArgRetval() { return *thread_data; } 13e3b6d110SNico Weber 14e3b6d110SNico Weber void InitThreadList(uptr storage, uptr size) { 15f031fc35SVitaly Buka CHECK_EQ(hwasan_thread_list, nullptr); 1616a76397SVitaly Buka 17*ba66d60bSFangrui Song alignas(alignof(HwasanThreadList)) static char 18*ba66d60bSFangrui Song thread_list_placeholder[sizeof(HwasanThreadList)]; 19e3b6d110SNico Weber hwasan_thread_list = 20e3b6d110SNico Weber new (thread_list_placeholder) HwasanThreadList(storage, size); 2168b76af8SVitaly Buka 2268b76af8SVitaly Buka CHECK_EQ(thread_data, nullptr); 2368b76af8SVitaly Buka 24*ba66d60bSFangrui Song alignas(alignof(ThreadArgRetval)) static char 25*ba66d60bSFangrui Song thread_data_placeholder[sizeof(ThreadArgRetval)]; 2668b76af8SVitaly Buka thread_data = new (thread_data_placeholder) ThreadArgRetval(); 27e3b6d110SNico Weber } 28e3b6d110SNico Weber 29b18f30fbSFlorian Mayer } // namespace __hwasan 30