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);