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