blob: 2d55f28ef2e73f58f284482ce30679b4c51fd160 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ZIRCON_SYSTEM_ULIB_C_SCUDO_GWP_ASAN_PLATFORM_TLS_SLOT_H_
#define ZIRCON_SYSTEM_ULIB_C_SCUDO_GWP_ASAN_PLATFORM_TLS_SLOT_H_
#include "threads_impl.h"
// GWP_ASAN_PLATFORM_TLS_HEADER tells the gwp_asan sources to include this file
// and call this function instead of using a `thread_local` variable of its
// own.
//
// TODO(https://fxbug.dev/42142757): Our current combined libc/dynamic linker
// implementation does not allow libc itself to have any `thread_local`
// variables of its own. In future, a different dynamic linker implementation
// will likely remove this restriction and having gwp_asan use a (hidden
// visibility) `thread_local` variable will work fine.
namespace gwp_asan {
// This header is always included in a context where ThreadLocalPackedVariables
// has already been declared.
inline ThreadLocalPackedVariables* getThreadLocals() {
auto* ptr = &__pthread_self()->gwp_asan_tsd;
static_assert(sizeof(*ptr) >= sizeof(ThreadLocalPackedVariables));
static_assert(alignof(decltype(*ptr)) >= alignof(ThreadLocalPackedVariables));
return reinterpret_cast<ThreadLocalPackedVariables*>(ptr);
}
} // namespace gwp_asan
#endif // ZIRCON_SYSTEM_ULIB_C_SCUDO_GWP_ASAN_PLATFORM_TLS_SLOT_H_