1*58b9f456SAndroid Build Coastguard Worker // -*- C++ -*- 2*58b9f456SAndroid Build Coastguard Worker //===---------------------------- test_macros.h ---------------------------===// 3*58b9f456SAndroid Build Coastguard Worker // 4*58b9f456SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 5*58b9f456SAndroid Build Coastguard Worker // 6*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open 7*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details. 8*58b9f456SAndroid Build Coastguard Worker // 9*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 10*58b9f456SAndroid Build Coastguard Worker 11*58b9f456SAndroid Build Coastguard Worker #ifndef SUPPORT_TEST_MACROS_HPP 12*58b9f456SAndroid Build Coastguard Worker #define SUPPORT_TEST_MACROS_HPP 13*58b9f456SAndroid Build Coastguard Worker 14*58b9f456SAndroid Build Coastguard Worker #include <ciso646> // Get STL specific macros like _LIBCPP_VERSION 15*58b9f456SAndroid Build Coastguard Worker 16*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__) 17*58b9f456SAndroid Build Coastguard Worker #pragma GCC diagnostic push 18*58b9f456SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wvariadic-macros" 19*58b9f456SAndroid Build Coastguard Worker #endif 20*58b9f456SAndroid Build Coastguard Worker 21*58b9f456SAndroid Build Coastguard Worker #define TEST_CONCAT1(X, Y) X##Y 22*58b9f456SAndroid Build Coastguard Worker #define TEST_CONCAT(X, Y) TEST_CONCAT1(X, Y) 23*58b9f456SAndroid Build Coastguard Worker 24*58b9f456SAndroid Build Coastguard Worker #ifdef __has_feature 25*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_FEATURE(X) __has_feature(X) 26*58b9f456SAndroid Build Coastguard Worker #else 27*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_FEATURE(X) 0 28*58b9f456SAndroid Build Coastguard Worker #endif 29*58b9f456SAndroid Build Coastguard Worker 30*58b9f456SAndroid Build Coastguard Worker #ifndef __has_include 31*58b9f456SAndroid Build Coastguard Worker #define __has_include(...) 0 32*58b9f456SAndroid Build Coastguard Worker #endif 33*58b9f456SAndroid Build Coastguard Worker 34*58b9f456SAndroid Build Coastguard Worker #ifdef __has_extension 35*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_EXTENSION(X) __has_extension(X) 36*58b9f456SAndroid Build Coastguard Worker #else 37*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_EXTENSION(X) 0 38*58b9f456SAndroid Build Coastguard Worker #endif 39*58b9f456SAndroid Build Coastguard Worker 40*58b9f456SAndroid Build Coastguard Worker #ifdef __has_builtin 41*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_BUILTIN(X) __has_builtin(X) 42*58b9f456SAndroid Build Coastguard Worker #else 43*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_BUILTIN(X) 0 44*58b9f456SAndroid Build Coastguard Worker #endif 45*58b9f456SAndroid Build Coastguard Worker #ifdef __is_identifier 46*58b9f456SAndroid Build Coastguard Worker // '__is_identifier' returns '0' if '__x' is a reserved identifier provided by 47*58b9f456SAndroid Build Coastguard Worker // the compiler and '1' otherwise. 48*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_BUILTIN_IDENTIFIER(X) !__is_identifier(X) 49*58b9f456SAndroid Build Coastguard Worker #else 50*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_BUILTIN_IDENTIFIER(X) 0 51*58b9f456SAndroid Build Coastguard Worker #endif 52*58b9f456SAndroid Build Coastguard Worker 53*58b9f456SAndroid Build Coastguard Worker #if defined(__EDG__) 54*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_EDG 55*58b9f456SAndroid Build Coastguard Worker #elif defined(__clang__) 56*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_CLANG 57*58b9f456SAndroid Build Coastguard Worker # if defined(__apple_build_version__) 58*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_APPLE_CLANG 59*58b9f456SAndroid Build Coastguard Worker # endif 60*58b9f456SAndroid Build Coastguard Worker #elif defined(_MSC_VER) 61*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_C1XX 62*58b9f456SAndroid Build Coastguard Worker #elif defined(__GNUC__) 63*58b9f456SAndroid Build Coastguard Worker # define TEST_COMPILER_GCC 64*58b9f456SAndroid Build Coastguard Worker #endif 65*58b9f456SAndroid Build Coastguard Worker 66*58b9f456SAndroid Build Coastguard Worker #if defined(__apple_build_version__) 67*58b9f456SAndroid Build Coastguard Worker #define TEST_APPLE_CLANG_VER (__clang_major__ * 100) + __clang_minor__ 68*58b9f456SAndroid Build Coastguard Worker #elif defined(__clang_major__) 69*58b9f456SAndroid Build Coastguard Worker #define TEST_CLANG_VER (__clang_major__ * 100) + __clang_minor__ 70*58b9f456SAndroid Build Coastguard Worker #elif defined(__GNUC__) 71*58b9f456SAndroid Build Coastguard Worker #define TEST_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__) 72*58b9f456SAndroid Build Coastguard Worker #endif 73*58b9f456SAndroid Build Coastguard Worker 74*58b9f456SAndroid Build Coastguard Worker /* Make a nice name for the standard version */ 75*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_STD_VER 76*58b9f456SAndroid Build Coastguard Worker #if __cplusplus <= 199711L 77*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 3 78*58b9f456SAndroid Build Coastguard Worker #elif __cplusplus <= 201103L 79*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 11 80*58b9f456SAndroid Build Coastguard Worker #elif __cplusplus <= 201402L 81*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 14 82*58b9f456SAndroid Build Coastguard Worker #elif __cplusplus <= 201703L 83*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 17 84*58b9f456SAndroid Build Coastguard Worker #else 85*58b9f456SAndroid Build Coastguard Worker # define TEST_STD_VER 99 // greater than current standard 86*58b9f456SAndroid Build Coastguard Worker // This is deliberately different than _LIBCPP_STD_VER to discourage matching them up. 87*58b9f456SAndroid Build Coastguard Worker #endif 88*58b9f456SAndroid Build Coastguard Worker #endif 89*58b9f456SAndroid Build Coastguard Worker 90*58b9f456SAndroid Build Coastguard Worker // Attempt to deduce the GLIBC version 91*58b9f456SAndroid Build Coastguard Worker #if (defined(__has_include) && __has_include(<features.h>)) || \ 92*58b9f456SAndroid Build Coastguard Worker defined(__linux__) 93*58b9f456SAndroid Build Coastguard Worker #include <features.h> 94*58b9f456SAndroid Build Coastguard Worker #if defined(__GLIBC_PREREQ) 95*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_GLIBC 96*58b9f456SAndroid Build Coastguard Worker #define TEST_GLIBC_PREREQ(major, minor) __GLIBC_PREREQ(major, minor) 97*58b9f456SAndroid Build Coastguard Worker #endif 98*58b9f456SAndroid Build Coastguard Worker #endif 99*58b9f456SAndroid Build Coastguard Worker 100*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 11 101*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNOF(...) alignof(__VA_ARGS__) 102*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNAS(...) alignas(__VA_ARGS__) 103*58b9f456SAndroid Build Coastguard Worker #define TEST_CONSTEXPR constexpr 104*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT noexcept 105*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT_FALSE noexcept(false) 106*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT_COND(...) noexcept(__VA_ARGS__) 107*58b9f456SAndroid Build Coastguard Worker # if TEST_STD_VER >= 14 108*58b9f456SAndroid Build Coastguard Worker # define TEST_CONSTEXPR_CXX14 constexpr 109*58b9f456SAndroid Build Coastguard Worker # else 110*58b9f456SAndroid Build Coastguard Worker # define TEST_CONSTEXPR_CXX14 111*58b9f456SAndroid Build Coastguard Worker # endif 112*58b9f456SAndroid Build Coastguard Worker # if TEST_STD_VER > 14 113*58b9f456SAndroid Build Coastguard Worker # define TEST_THROW_SPEC(...) 114*58b9f456SAndroid Build Coastguard Worker # else 115*58b9f456SAndroid Build Coastguard Worker # define TEST_THROW_SPEC(...) throw(__VA_ARGS__) 116*58b9f456SAndroid Build Coastguard Worker # endif 117*58b9f456SAndroid Build Coastguard Worker #else 118*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNOF(...) __alignof(__VA_ARGS__) 119*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNAS(...) __attribute__((__aligned__(__VA_ARGS__))) 120*58b9f456SAndroid Build Coastguard Worker #define TEST_CONSTEXPR 121*58b9f456SAndroid Build Coastguard Worker #define TEST_CONSTEXPR_CXX14 122*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT throw() 123*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT_FALSE 124*58b9f456SAndroid Build Coastguard Worker #define TEST_NOEXCEPT_COND(...) 125*58b9f456SAndroid Build Coastguard Worker #define TEST_THROW_SPEC(...) throw(__VA_ARGS__) 126*58b9f456SAndroid Build Coastguard Worker #endif 127*58b9f456SAndroid Build Coastguard Worker 128*58b9f456SAndroid Build Coastguard Worker // Sniff out to see if the underling C library has C11 features 129*58b9f456SAndroid Build Coastguard Worker // Note that at this time (July 2018), MacOS X and iOS do NOT. 130*58b9f456SAndroid Build Coastguard Worker // This is cribbed from __config; but lives here as well because we can't assume libc++ 131*58b9f456SAndroid Build Coastguard Worker #if __ISO_C_VISIBLE >= 2011 || TEST_STD_VER >= 11 132*58b9f456SAndroid Build Coastguard Worker # if defined(__FreeBSD__) 133*58b9f456SAndroid Build Coastguard Worker // Specifically, FreeBSD does NOT have timespec_get, even though they have all 134*58b9f456SAndroid Build Coastguard Worker // the rest of C11 - this is PR#38495 135*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_C11_FEATURES 136*58b9f456SAndroid Build Coastguard Worker # elif defined(__Fuchsia__) 137*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_C11_FEATURES 138*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_TIMESPEC_GET 139*58b9f456SAndroid Build Coastguard Worker # elif defined(__linux__) 140*58b9f456SAndroid Build Coastguard Worker // This block preserves the old behavior used by include/__config: 141*58b9f456SAndroid Build Coastguard Worker // _LIBCPP_GLIBC_PREREQ would be defined to 0 if __GLIBC_PREREQ was not 142*58b9f456SAndroid Build Coastguard Worker // available. The configuration here may be too vague though, as Bionic, uClibc, 143*58b9f456SAndroid Build Coastguard Worker // newlib, etc may all support these features but need to be configured. 144*58b9f456SAndroid Build Coastguard Worker # if defined(TEST_GLIBC_PREREQ) 145*58b9f456SAndroid Build Coastguard Worker # if TEST_GLIBC_PREREQ(2, 17) 146*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_TIMESPEC_GET 147*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_C11_FEATURES 148*58b9f456SAndroid Build Coastguard Worker # endif 149*58b9f456SAndroid Build Coastguard Worker # elif defined(_LIBCPP_HAS_MUSL_LIBC) 150*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_C11_FEATURES 151*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_TIMESPEC_GET 152*58b9f456SAndroid Build Coastguard Worker # endif 153*58b9f456SAndroid Build Coastguard Worker # elif defined(_WIN32) 154*58b9f456SAndroid Build Coastguard Worker # if defined(_MSC_VER) && !defined(__MINGW32__) 155*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_C11_FEATURES // Using Microsoft's C Runtime library 156*58b9f456SAndroid Build Coastguard Worker # define TEST_HAS_TIMESPEC_GET 157*58b9f456SAndroid Build Coastguard Worker # endif 158*58b9f456SAndroid Build Coastguard Worker # endif 159*58b9f456SAndroid Build Coastguard Worker #endif 160*58b9f456SAndroid Build Coastguard Worker 161*58b9f456SAndroid Build Coastguard Worker /* Features that were introduced in C++14 */ 162*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 14 163*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_EXTENDED_CONSTEXPR 164*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_VARIABLE_TEMPLATES 165*58b9f456SAndroid Build Coastguard Worker #endif 166*58b9f456SAndroid Build Coastguard Worker 167*58b9f456SAndroid Build Coastguard Worker /* Features that were introduced in C++17 */ 168*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 17 169*58b9f456SAndroid Build Coastguard Worker #endif 170*58b9f456SAndroid Build Coastguard Worker 171*58b9f456SAndroid Build Coastguard Worker /* Features that were introduced after C++17 */ 172*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER > 17 173*58b9f456SAndroid Build Coastguard Worker #endif 174*58b9f456SAndroid Build Coastguard Worker 175*58b9f456SAndroid Build Coastguard Worker 176*58b9f456SAndroid Build Coastguard Worker #define TEST_ALIGNAS_TYPE(...) TEST_ALIGNAS(TEST_ALIGNOF(__VA_ARGS__)) 177*58b9f456SAndroid Build Coastguard Worker 178*58b9f456SAndroid Build Coastguard Worker #if !TEST_HAS_FEATURE(cxx_rtti) && !defined(__cpp_rtti) \ 179*58b9f456SAndroid Build Coastguard Worker && !defined(__GXX_RTTI) 180*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_RTTI 181*58b9f456SAndroid Build Coastguard Worker #endif 182*58b9f456SAndroid Build Coastguard Worker 183*58b9f456SAndroid Build Coastguard Worker #if !TEST_HAS_FEATURE(cxx_exceptions) && !defined(__cpp_exceptions) \ 184*58b9f456SAndroid Build Coastguard Worker && !defined(__EXCEPTIONS) 185*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_EXCEPTIONS 186*58b9f456SAndroid Build Coastguard Worker #endif 187*58b9f456SAndroid Build Coastguard Worker 188*58b9f456SAndroid Build Coastguard Worker #if TEST_HAS_FEATURE(address_sanitizer) || TEST_HAS_FEATURE(memory_sanitizer) || \ 189*58b9f456SAndroid Build Coastguard Worker TEST_HAS_FEATURE(thread_sanitizer) 190*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_SANITIZERS 191*58b9f456SAndroid Build Coastguard Worker #endif 192*58b9f456SAndroid Build Coastguard Worker 193*58b9f456SAndroid Build Coastguard Worker #if defined(_LIBCPP_NORETURN) 194*58b9f456SAndroid Build Coastguard Worker #define TEST_NORETURN _LIBCPP_NORETURN 195*58b9f456SAndroid Build Coastguard Worker #else 196*58b9f456SAndroid Build Coastguard Worker #define TEST_NORETURN [[noreturn]] 197*58b9f456SAndroid Build Coastguard Worker #endif 198*58b9f456SAndroid Build Coastguard Worker 199*58b9f456SAndroid Build Coastguard Worker #if defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) || \ 200*58b9f456SAndroid Build Coastguard Worker (!(TEST_STD_VER > 14 || \ 201*58b9f456SAndroid Build Coastguard Worker (defined(__cpp_aligned_new) && __cpp_aligned_new >= 201606L))) 202*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_ALIGNED_ALLOCATION 203*58b9f456SAndroid Build Coastguard Worker #endif 204*58b9f456SAndroid Build Coastguard Worker 205*58b9f456SAndroid Build Coastguard Worker #if defined(_LIBCPP_SAFE_STATIC) 206*58b9f456SAndroid Build Coastguard Worker #define TEST_SAFE_STATIC _LIBCPP_SAFE_STATIC 207*58b9f456SAndroid Build Coastguard Worker #else 208*58b9f456SAndroid Build Coastguard Worker #define TEST_SAFE_STATIC 209*58b9f456SAndroid Build Coastguard Worker #endif 210*58b9f456SAndroid Build Coastguard Worker 211*58b9f456SAndroid Build Coastguard Worker // FIXME: Fix this feature check when either (A) a compiler provides a complete 212*58b9f456SAndroid Build Coastguard Worker // implementation, or (b) a feature check macro is specified 213*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_SPACESHIP_OPERATOR 214*58b9f456SAndroid Build Coastguard Worker 215*58b9f456SAndroid Build Coastguard Worker 216*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER < 11 217*58b9f456SAndroid Build Coastguard Worker #define ASSERT_NOEXCEPT(...) 218*58b9f456SAndroid Build Coastguard Worker #define ASSERT_NOT_NOEXCEPT(...) 219*58b9f456SAndroid Build Coastguard Worker #else 220*58b9f456SAndroid Build Coastguard Worker #define ASSERT_NOEXCEPT(...) \ 221*58b9f456SAndroid Build Coastguard Worker static_assert(noexcept(__VA_ARGS__), "Operation must be noexcept") 222*58b9f456SAndroid Build Coastguard Worker 223*58b9f456SAndroid Build Coastguard Worker #define ASSERT_NOT_NOEXCEPT(...) \ 224*58b9f456SAndroid Build Coastguard Worker static_assert(!noexcept(__VA_ARGS__), "Operation must NOT be noexcept") 225*58b9f456SAndroid Build Coastguard Worker #endif 226*58b9f456SAndroid Build Coastguard Worker 227*58b9f456SAndroid Build Coastguard Worker /* Macros for testing libc++ specific behavior and extensions */ 228*58b9f456SAndroid Build Coastguard Worker #if defined(_LIBCPP_VERSION) 229*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT(...) assert(__VA_ARGS__) 230*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_STATIC_ASSERT(...) static_assert(__VA_ARGS__) 231*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT_NOEXCEPT(...) ASSERT_NOEXCEPT(__VA_ARGS__) 232*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ASSERT_NOT_NOEXCEPT(__VA_ARGS__) 233*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ONLY(...) __VA_ARGS__ 234*58b9f456SAndroid Build Coastguard Worker #else 235*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT(...) ((void)0) 236*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_STATIC_ASSERT(...) ((void)0) 237*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT_NOEXCEPT(...) ((void)0) 238*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ASSERT_NOT_NOEXCEPT(...) ((void)0) 239*58b9f456SAndroid Build Coastguard Worker #define LIBCPP_ONLY(...) ((void)0) 240*58b9f456SAndroid Build Coastguard Worker #endif 241*58b9f456SAndroid Build Coastguard Worker 242*58b9f456SAndroid Build Coastguard Worker #define TEST_IGNORE_NODISCARD (void) 243*58b9f456SAndroid Build Coastguard Worker 244*58b9f456SAndroid Build Coastguard Worker namespace test_macros_detail { 245*58b9f456SAndroid Build Coastguard Worker template <class T, class U> 246*58b9f456SAndroid Build Coastguard Worker struct is_same { enum { value = 0};} ; 247*58b9f456SAndroid Build Coastguard Worker template <class T> 248*58b9f456SAndroid Build Coastguard Worker struct is_same<T, T> { enum {value = 1}; }; 249*58b9f456SAndroid Build Coastguard Worker } // namespace test_macros_detail 250*58b9f456SAndroid Build Coastguard Worker 251*58b9f456SAndroid Build Coastguard Worker #define ASSERT_SAME_TYPE(...) \ 252*58b9f456SAndroid Build Coastguard Worker static_assert((test_macros_detail::is_same<__VA_ARGS__>::value), \ 253*58b9f456SAndroid Build Coastguard Worker "Types differ unexpectedly") 254*58b9f456SAndroid Build Coastguard Worker 255*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_HAS_NO_EXCEPTIONS 256*58b9f456SAndroid Build Coastguard Worker #define TEST_THROW(...) throw __VA_ARGS__ 257*58b9f456SAndroid Build Coastguard Worker #else 258*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__) 259*58b9f456SAndroid Build Coastguard Worker #define TEST_THROW(...) __builtin_abort() 260*58b9f456SAndroid Build Coastguard Worker #else 261*58b9f456SAndroid Build Coastguard Worker #include <stdlib.h> 262*58b9f456SAndroid Build Coastguard Worker #define TEST_THROW(...) ::abort() 263*58b9f456SAndroid Build Coastguard Worker #endif 264*58b9f456SAndroid Build Coastguard Worker #endif 265*58b9f456SAndroid Build Coastguard Worker 266*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__) 267*58b9f456SAndroid Build Coastguard Worker template <class Tp> 268*58b9f456SAndroid Build Coastguard Worker inline 269*58b9f456SAndroid Build Coastguard Worker void DoNotOptimize(Tp const& value) { 270*58b9f456SAndroid Build Coastguard Worker asm volatile("" : : "r,m"(value) : "memory"); 271*58b9f456SAndroid Build Coastguard Worker } 272*58b9f456SAndroid Build Coastguard Worker 273*58b9f456SAndroid Build Coastguard Worker template <class Tp> 274*58b9f456SAndroid Build Coastguard Worker inline void DoNotOptimize(Tp& value) { 275*58b9f456SAndroid Build Coastguard Worker #if defined(__clang__) 276*58b9f456SAndroid Build Coastguard Worker asm volatile("" : "+r,m"(value) : : "memory"); 277*58b9f456SAndroid Build Coastguard Worker #else 278*58b9f456SAndroid Build Coastguard Worker asm volatile("" : "+m,r"(value) : : "memory"); 279*58b9f456SAndroid Build Coastguard Worker #endif 280*58b9f456SAndroid Build Coastguard Worker } 281*58b9f456SAndroid Build Coastguard Worker #else 282*58b9f456SAndroid Build Coastguard Worker #include <intrin.h> 283*58b9f456SAndroid Build Coastguard Worker template <class Tp> 284*58b9f456SAndroid Build Coastguard Worker inline void DoNotOptimize(Tp const& value) { 285*58b9f456SAndroid Build Coastguard Worker const volatile void* volatile unused = __builtin_addressof(value); 286*58b9f456SAndroid Build Coastguard Worker static_cast<void>(unused); 287*58b9f456SAndroid Build Coastguard Worker _ReadWriteBarrier(); 288*58b9f456SAndroid Build Coastguard Worker } 289*58b9f456SAndroid Build Coastguard Worker #endif 290*58b9f456SAndroid Build Coastguard Worker 291*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__) 292*58b9f456SAndroid Build Coastguard Worker #define TEST_ALWAYS_INLINE __attribute__((always_inline)) 293*58b9f456SAndroid Build Coastguard Worker #define TEST_NOINLINE __attribute__((noinline)) 294*58b9f456SAndroid Build Coastguard Worker #elif defined(_MSC_VER) 295*58b9f456SAndroid Build Coastguard Worker #define TEST_ALWAYS_INLINE __forceinline 296*58b9f456SAndroid Build Coastguard Worker #define TEST_NOINLINE __declspec(noinline) 297*58b9f456SAndroid Build Coastguard Worker #else 298*58b9f456SAndroid Build Coastguard Worker #define TEST_ALWAYS_INLINE 299*58b9f456SAndroid Build Coastguard Worker #define TEST_NOINLINE 300*58b9f456SAndroid Build Coastguard Worker #endif 301*58b9f456SAndroid Build Coastguard Worker 302*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__) 303*58b9f456SAndroid Build Coastguard Worker #pragma GCC diagnostic pop 304*58b9f456SAndroid Build Coastguard Worker #endif 305*58b9f456SAndroid Build Coastguard Worker 306*58b9f456SAndroid Build Coastguard Worker #endif // SUPPORT_TEST_MACROS_HPP 307