diff --git a/compiler-rt/lib/gwp_asan/CMakeLists.txt b/compiler-rt/lib/gwp_asan/CMakeLists.txt --- a/compiler-rt/lib/gwp_asan/CMakeLists.txt +++ b/compiler-rt/lib/gwp_asan/CMakeLists.txt @@ -12,6 +12,7 @@ guarded_pool_allocator.cpp random.cpp stack_trace_compressor.cpp + utilities.cpp ) set(GWP_ASAN_HEADERS diff --git a/compiler-rt/lib/gwp_asan/platform_specific/utilities_posix.cpp b/compiler-rt/lib/gwp_asan/platform_specific/utilities_posix.cpp --- a/compiler-rt/lib/gwp_asan/platform_specific/utilities_posix.cpp +++ b/compiler-rt/lib/gwp_asan/platform_specific/utilities_posix.cpp @@ -19,72 +19,14 @@ #endif namespace gwp_asan { - +void die(const char *Message) { #ifdef __BIONIC__ -void Check(bool Condition, const char *Message) { - if (Condition) - return; if (&android_set_abort_message != nullptr) android_set_abort_message(Message); abort(); -} #else // __BIONIC__ -void Check(bool Condition, const char *Message) { - if (Condition) - return; fprintf(stderr, "%s", Message); __builtin_trap(); -} -#endif // __BIONIC__ - -// See `bionic/tests/malloc_test.cpp` in the Android source for documentation -// regarding their alignment guarantees. We always round up to the closest -// 8-byte window. As GWP-ASan's malloc(X) can always get exactly an X-sized -// allocation, an allocation that rounds up to 16-bytes will always be given a -// 16-byte aligned allocation. -static size_t alignBionic(size_t RealAllocationSize) { - if (RealAllocationSize % 8 == 0) - return RealAllocationSize; - return RealAllocationSize + 8 - (RealAllocationSize % 8); -} - -static size_t alignPowerOfTwo(size_t RealAllocationSize) { - if (RealAllocationSize <= 2) - return RealAllocationSize; - if (RealAllocationSize <= 4) - return 4; - if (RealAllocationSize <= 8) - return 8; - if (RealAllocationSize % 16 == 0) - return RealAllocationSize; - return RealAllocationSize + 16 - (RealAllocationSize % 16); -} - -#ifdef __BIONIC__ -static constexpr AlignmentStrategy PlatformDefaultAlignment = - AlignmentStrategy::BIONIC; -#else // __BIONIC__ -static constexpr AlignmentStrategy PlatformDefaultAlignment = - AlignmentStrategy::POWER_OF_TWO; #endif // __BIONIC__ - -size_t rightAlignedAllocationSize(size_t RealAllocationSize, - AlignmentStrategy Align) { - assert(RealAllocationSize > 0); - if (Align == AlignmentStrategy::DEFAULT) - Align = PlatformDefaultAlignment; - - switch (Align) { - case AlignmentStrategy::BIONIC: - return alignBionic(RealAllocationSize); - case AlignmentStrategy::POWER_OF_TWO: - return alignPowerOfTwo(RealAllocationSize); - case AlignmentStrategy::PERFECT: - return RealAllocationSize; - case AlignmentStrategy::DEFAULT: - __builtin_unreachable(); - } - __builtin_unreachable(); } - } // namespace gwp_asan diff --git a/compiler-rt/lib/gwp_asan/utilities.h b/compiler-rt/lib/gwp_asan/utilities.h --- a/compiler-rt/lib/gwp_asan/utilities.h +++ b/compiler-rt/lib/gwp_asan/utilities.h @@ -12,12 +12,17 @@ #include "gwp_asan/definitions.h" #include -#include namespace gwp_asan { -// Checks that `Condition` is true, otherwise fails in a platform-specific way -// with `Message`. -void Check(bool Condition, const char *Message); +// Terminates in a platform-specific way with `Message`. +void die(const char *Message); + +// Checks that `Condition` is true, otherwise dies with `Message`. +GWP_ASAN_ALWAYS_INLINE void Check(bool Condition, const char *Message) { + if (Condition) + return; + die(Message); +} enum class AlignmentStrategy { // Default => POWER_OF_TWO on most platforms, BIONIC for Android Bionic. diff --git a/compiler-rt/lib/gwp_asan/platform_specific/utilities_posix.cpp b/compiler-rt/lib/gwp_asan/utilities.cpp copy from compiler-rt/lib/gwp_asan/platform_specific/utilities_posix.cpp copy to compiler-rt/lib/gwp_asan/utilities.cpp --- a/compiler-rt/lib/gwp_asan/platform_specific/utilities_posix.cpp +++ b/compiler-rt/lib/gwp_asan/utilities.cpp @@ -1,4 +1,4 @@ -//===-- utilities_posix.cpp -------------------------------------*- C++ -*-===// +//===-- utilities.cpp -------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,37 +6,11 @@ // //===----------------------------------------------------------------------===// -#include "gwp_asan/definitions.h" #include "gwp_asan/utilities.h" #include -#ifdef __BIONIC__ -#include -extern "C" GWP_ASAN_WEAK void android_set_abort_message(const char *); -#else // __BIONIC__ -#include -#endif - namespace gwp_asan { - -#ifdef __BIONIC__ -void Check(bool Condition, const char *Message) { - if (Condition) - return; - if (&android_set_abort_message != nullptr) - android_set_abort_message(Message); - abort(); -} -#else // __BIONIC__ -void Check(bool Condition, const char *Message) { - if (Condition) - return; - fprintf(stderr, "%s", Message); - __builtin_trap(); -} -#endif // __BIONIC__ - // See `bionic/tests/malloc_test.cpp` in the Android source for documentation // regarding their alignment guarantees. We always round up to the closest // 8-byte window. As GWP-ASan's malloc(X) can always get exactly an X-sized @@ -86,5 +60,4 @@ } __builtin_unreachable(); } - } // namespace gwp_asan