//===-- common.h ------------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // This file contains code that is common between the crash handler and the // GuardedPoolAllocator. #ifndef GWP_ASAN_COMMON_H_ #define GWP_ASAN_COMMON_H_ #include "gwp_asan/definitions.h" #include "gwp_asan/options.h" #include <stddef.h> #include <stdint.h> namespace gwp_asan { // Magic header that resides in the AllocatorState so that GWP-ASan bugreports // can be understood by tools at different versions. Out-of-process crash // handlers, like crashpad on Fuchsia, take the raw contents of the // AllocationMetatada array and the AllocatorState, and shove them into the // minidump. Online unpacking of these structs needs to know from which version // of GWP-ASan it's extracting the information, as the structures are not // stable. struct AllocatorVersionMagic { … }; enum class Error : uint8_t { … }; const char *ErrorToString(const Error &E); static constexpr uint64_t kInvalidThreadID = …; // Get the current thread ID, or kInvalidThreadID if failure. Note: This // implementation is platform-specific. uint64_t getThreadID(); // This struct contains all the metadata recorded about a single allocation made // by GWP-ASan. If `AllocationMetadata.Addr` is zero, the metadata is non-valid. struct AllocationMetadata { … }; // This holds the state that's shared between the GWP-ASan allocator and the // crash handler. This, in conjunction with the Metadata array, forms the entire // set of information required for understanding a GWP-ASan crash. struct AllocatorState { … }; // Below are various compile-time checks that the layout of the internal // GWP-ASan structures are undisturbed. If they are disturbed, the version magic // number needs to be increased by one, and the asserts need to be updated. // Out-of-process crash handlers, like breakpad/crashpad, may copy the internal // GWP-ASan structures into a minidump for offline reconstruction of the crash. // In order to accomplish this, the offline reconstructor needs to know the // version of GWP-ASan internal structures that it's unpacking (along with the // architecture-specific layout info, which is left as an exercise to the crash // handler). static_assert …; static_assert …; #if defined(__x86_64__) static_assert …; static_assert …; static_assert …; static_assert …; #elif defined(__aarch64__) static_assert(sizeof(AllocatorState) == 56, ""); static_assert(offsetof(AllocatorState, FailureAddress) == 48, ""); static_assert(sizeof(AllocationMetadata) == 568, ""); static_assert(offsetof(AllocationMetadata, IsDeallocated) == 560, ""); #elif defined(__i386__) static_assert(sizeof(AllocatorState) == 32, ""); static_assert(offsetof(AllocatorState, FailureAddress) == 28, ""); static_assert(sizeof(AllocationMetadata) == 548, ""); static_assert(offsetof(AllocationMetadata, IsDeallocated) == 544, ""); #elif defined(__arm__) static_assert(sizeof(AllocatorState) == 32, ""); static_assert(offsetof(AllocatorState, FailureAddress) == 28, ""); static_assert(sizeof(AllocationMetadata) == 560, ""); static_assert(offsetof(AllocationMetadata, IsDeallocated) == 552, ""); #endif // defined($ARCHITECTURE) } // namespace gwp_asan #endif // GWP_ASAN_COMMON_H_