Squashed 'third_party/marl/' changes from a089b4aaf8..f4255c213b f4255c213b Disable UBSAN false-positive git-subtree-dir: third_party/marl git-subtree-split: f4255c213b88259a9631484ff6b187fcf8503a52 Change-Id: I140a0a4838fb04d72ce2d7ed2e508d4dca23214d
diff --git a/CMakeLists.txt b/CMakeLists.txt index 78ee4a3..33ff545 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -54,6 +54,7 @@ option_if_not_defined(MARL_ASAN "Build marl with address sanitizer" OFF) option_if_not_defined(MARL_MSAN "Build marl with memory sanitizer" OFF) option_if_not_defined(MARL_TSAN "Build marl with thread sanitizer" OFF) +option_if_not_defined(MARL_UBSAN "Build marl with undefined-behavior sanitizer" OFF) option_if_not_defined(MARL_INSTALL "Create marl install target" OFF) option_if_not_defined(MARL_FULL_BENCHMARK "Run benchmarks for [0 .. numLogicalCPUs] with no stepping" OFF) option_if_not_defined(MARL_FIBERS_USE_UCONTEXT "Use ucontext instead of assembly for fibers (ignored for platforms that do not support ucontext)" OFF) @@ -244,6 +245,9 @@ elseif(MARL_TSAN) target_compile_options(${target} PUBLIC "-fsanitize=thread") target_link_libraries(${target} PUBLIC "-fsanitize=thread") + elseif(MARL_UBSAN) + target_compile_options(${target} PUBLIC "-fsanitize=undefined") + target_link_libraries(${target} PUBLIC "-fsanitize=undefined") endif() if(MARL_FIBERS_USE_UCONTEXT)
diff --git a/include/marl/sanitizers.h b/include/marl/sanitizers.h index 3f26d4a..0fcfd3e 100644 --- a/include/marl/sanitizers.h +++ b/include/marl/sanitizers.h
@@ -15,67 +15,84 @@ #ifndef marl_sanitizers_h #define marl_sanitizers_h -// Define ADDRESS_SANITIZER_ENABLED to 1 if the project was built with the +// Define MARL_ADDRESS_SANITIZER_ENABLED to 1 if the project was built with the // address sanitizer enabled (-fsanitize=address). #if defined(__SANITIZE_ADDRESS__) -#define ADDRESS_SANITIZER_ENABLED 1 +#define MARL_ADDRESS_SANITIZER_ENABLED 1 #else // defined(__SANITIZE_ADDRESS__) #if defined(__clang__) #if __has_feature(address_sanitizer) -#define ADDRESS_SANITIZER_ENABLED 1 +#define MARL_ADDRESS_SANITIZER_ENABLED 1 #endif // __has_feature(address_sanitizer) #endif // defined(__clang__) #endif // defined(__SANITIZE_ADDRESS__) -// ADDRESS_SANITIZER_ONLY(X) resolves to X if ADDRESS_SANITIZER_ENABLED is -// defined to a non-zero value, otherwise ADDRESS_SANITIZER_ONLY() is stripped -// by the preprocessor. -#if ADDRESS_SANITIZER_ENABLED -#define ADDRESS_SANITIZER_ONLY(x) x +// MARL_ADDRESS_SANITIZER_ONLY(X) resolves to X if +// MARL_ADDRESS_SANITIZER_ENABLED is defined to a non-zero value, otherwise +// MARL_ADDRESS_SANITIZER_ONLY() is stripped by the preprocessor. +#if MARL_ADDRESS_SANITIZER_ENABLED +#define MARL_ADDRESS_SANITIZER_ONLY(x) x #else -#define ADDRESS_SANITIZER_ONLY(x) -#endif // ADDRESS_SANITIZER_ENABLED +#define MARL_ADDRESS_SANITIZER_ONLY(x) +#endif // MARL_ADDRESS_SANITIZER_ENABLED -// Define MEMORY_SANITIZER_ENABLED to 1 if the project was built with the memory -// sanitizer enabled (-fsanitize=memory). +// Define MARL_MEMORY_SANITIZER_ENABLED to 1 if the project was built with the +// memory sanitizer enabled (-fsanitize=memory). #if defined(__SANITIZE_MEMORY__) -#define MEMORY_SANITIZER_ENABLED 1 +#define MARL_MEMORY_SANITIZER_ENABLED 1 #else // defined(__SANITIZE_MEMORY__) #if defined(__clang__) #if __has_feature(memory_sanitizer) -#define MEMORY_SANITIZER_ENABLED 1 +#define MARL_MEMORY_SANITIZER_ENABLED 1 #endif // __has_feature(memory_sanitizer) #endif // defined(__clang__) #endif // defined(__SANITIZE_MEMORY__) -// MEMORY_SANITIZER_ONLY(X) resolves to X if MEMORY_SANITIZER_ENABLED is defined -// to a non-zero value, otherwise MEMORY_SANITIZER_ONLY() is stripped by the -// preprocessor. -#if MEMORY_SANITIZER_ENABLED -#define MEMORY_SANITIZER_ONLY(x) x +// MARL_MEMORY_SANITIZER_ONLY(X) resolves to X if MARL_MEMORY_SANITIZER_ENABLED +// is defined to a non-zero value, otherwise MARL_MEMORY_SANITIZER_ONLY() is +// stripped by the preprocessor. +#if MARL_MEMORY_SANITIZER_ENABLED +#define MARL_MEMORY_SANITIZER_ONLY(x) x #else -#define MEMORY_SANITIZER_ONLY(x) -#endif // MEMORY_SANITIZER_ENABLED +#define MARL_MEMORY_SANITIZER_ONLY(x) +#endif // MARL_MEMORY_SANITIZER_ENABLED -// Define THREAD_SANITIZER_ENABLED to 1 if the project was built with the thread -// sanitizer enabled (-fsanitize=thread). +// Define MARL_THREAD_SANITIZER_ENABLED to 1 if the project was built with the +// thread sanitizer enabled (-fsanitize=thread). #if defined(__SANITIZE_THREAD__) -#define THREAD_SANITIZER_ENABLED 1 +#define MARL_THREAD_SANITIZER_ENABLED 1 #else // defined(__SANITIZE_THREAD__) #if defined(__clang__) #if __has_feature(thread_sanitizer) -#define THREAD_SANITIZER_ENABLED 1 +#define MARL_THREAD_SANITIZER_ENABLED 1 #endif // __has_feature(thread_sanitizer) #endif // defined(__clang__) #endif // defined(__SANITIZE_THREAD__) -// THREAD_SANITIZER_ONLY(X) resolves to X if THREAD_SANITIZER_ENABLED is defined -// to a non-zero value, otherwise THREAD_SANITIZER_ONLY() is stripped by the -// preprocessor. -#if THREAD_SANITIZER_ENABLED -#define THREAD_SANITIZER_ONLY(x) x +// MARL_THREAD_SANITIZER_ONLY(X) resolves to X if MARL_THREAD_SANITIZER_ENABLED +// is defined to a non-zero value, otherwise MARL_THREAD_SANITIZER_ONLY() is +// stripped by the preprocessor. +#if MARL_THREAD_SANITIZER_ENABLED +#define MARL_THREAD_SANITIZER_ONLY(x) x #else -#define THREAD_SANITIZER_ONLY(x) -#endif // THREAD_SANITIZER_ENABLED +#define MARL_THREAD_SANITIZER_ONLY(x) +#endif // MARL_THREAD_SANITIZER_ENABLED + +// Define MARL_UNDEFINED_SANITIZER_ENABLED to 1 if the project was built with +// the undefined sanitizer enabled (-fsanitize=undefined). +#if defined(__clang__) +#if __has_feature(undefined_behavior_sanitizer) +#define MARL_UNDEFINED_SANITIZER_ENABLED 1 +#endif // __has_feature(undefined_behavior_sanitizer) +#endif // defined(__clang__) + +// MARL_UNDEFINED_SANITIZER_ONLY(X) resolves to X if +// MARL_UNDEFINED_SANITIZER_ENABLED is defined to a non-zero value, otherwise +// MARL_UNDEFINED_SANITIZER_ONLY() is stripped by the preprocessor. +#if MARL_UNDEFINED_SANITIZER_ENABLED +#define MARL_UNDEFINED_SANITIZER_ONLY(x) x +#else +#define MARL_UNDEFINED_SANITIZER_ONLY(x) +#endif // MARL_UNDEFINED_SANITIZER_ENABLED #endif // marl_sanitizers_h
diff --git a/src/marl_bench.cpp b/src/marl_bench.cpp index f3ea565..69a57d5 100644 --- a/src/marl_bench.cpp +++ b/src/marl_bench.cpp
@@ -17,17 +17,17 @@ #include "marl/sanitizers.h" int main(int argc, char** argv) { -#if ADDRESS_SANITIZER_ENABLED +#if MARL_ADDRESS_SANITIZER_ENABLED printf( "***WARNING*** Marl built with address sanitizer enabled. " "Timings will be affected\n"); #endif -#if MEMORY_SANITIZER_ENABLED +#if MARL_MEMORY_SANITIZER_ENABLED printf( "***WARNING*** Marl built with memory sanitizer enabled. " "Timings will be affected\n"); #endif -#if THREAD_SANITIZER_ENABLED +#if MARL_THREAD_SANITIZER_ENABLED printf( "***WARNING*** Marl built with thread sanitizer enabled. " "Timings will be affected\n"); @@ -47,4 +47,4 @@ x = (x >> 2) & q; } return x; -} \ No newline at end of file +}
diff --git a/src/osfiber.h b/src/osfiber.h index d328094..6f89858 100644 --- a/src/osfiber.h +++ b/src/osfiber.h
@@ -15,14 +15,14 @@ #include "marl/sanitizers.h" #ifndef MARL_USE_FIBER_STACK_GUARDS -#if !defined(NDEBUG) && !ADDRESS_SANITIZER_ENABLED +#if !defined(NDEBUG) && !MARL_ADDRESS_SANITIZER_ENABLED #define MARL_USE_FIBER_STACK_GUARDS 1 #else #define MARL_USE_FIBER_STACK_GUARDS 0 #endif #endif // MARL_USE_FIBER_STACK_GUARDS -#if MARL_USE_FIBER_STACK_GUARDS && ADDRESS_SANITIZER_ENABLED +#if MARL_USE_FIBER_STACK_GUARDS && MARL_ADDRESS_SANITIZER_ENABLED #warning "ASAN can raise spurious failures when using mmap() allocated stacks" #endif
diff --git a/src/osfiber_x64.c b/src/osfiber_x64.c index 3cc09c1..491e45b 100644 --- a/src/osfiber_x64.c +++ b/src/osfiber_x64.c
@@ -17,9 +17,12 @@ #include "osfiber_asm_x64.h" #include "marl/export.h" +#include "marl/sanitizers.h" -//You can find an explanation of this code here: https://github.com/google/marl/issues/199 +// You can find an explanation of this code here: +// https://github.com/google/marl/issues/199 +MARL_UNDEFINED_SANITIZER_ONLY(__attribute__((no_sanitize("function")))) MARL_EXPORT void marl_fiber_trampoline(void (*target)(void*), void* arg) { target(arg);