xref: /openbsd-src/gnu/llvm/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===-- sanitizer_internal_defs.h -------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is shared between AddressSanitizer and ThreadSanitizer.
103cab2bb3Spatrick // It contains macro used in run-time libraries code.
113cab2bb3Spatrick //===----------------------------------------------------------------------===//
123cab2bb3Spatrick #ifndef SANITIZER_DEFS_H
133cab2bb3Spatrick #define SANITIZER_DEFS_H
143cab2bb3Spatrick 
153cab2bb3Spatrick #include "sanitizer_platform.h"
163cab2bb3Spatrick 
173cab2bb3Spatrick #ifndef SANITIZER_DEBUG
183cab2bb3Spatrick # define SANITIZER_DEBUG 0
193cab2bb3Spatrick #endif
203cab2bb3Spatrick 
213cab2bb3Spatrick #define SANITIZER_STRINGIFY_(S) #S
223cab2bb3Spatrick #define SANITIZER_STRINGIFY(S) SANITIZER_STRINGIFY_(S)
233cab2bb3Spatrick 
243cab2bb3Spatrick // Only use SANITIZER_*ATTRIBUTE* before the function return type!
253cab2bb3Spatrick #if SANITIZER_WINDOWS
263cab2bb3Spatrick #if SANITIZER_IMPORT_INTERFACE
273cab2bb3Spatrick # define SANITIZER_INTERFACE_ATTRIBUTE __declspec(dllimport)
283cab2bb3Spatrick #else
293cab2bb3Spatrick # define SANITIZER_INTERFACE_ATTRIBUTE __declspec(dllexport)
303cab2bb3Spatrick #endif
313cab2bb3Spatrick # define SANITIZER_WEAK_ATTRIBUTE
323cab2bb3Spatrick #elif SANITIZER_GO
333cab2bb3Spatrick # define SANITIZER_INTERFACE_ATTRIBUTE
343cab2bb3Spatrick # define SANITIZER_WEAK_ATTRIBUTE
353cab2bb3Spatrick #else
363cab2bb3Spatrick # define SANITIZER_INTERFACE_ATTRIBUTE __attribute__((visibility("default")))
373cab2bb3Spatrick # define SANITIZER_WEAK_ATTRIBUTE  __attribute__((weak))
383cab2bb3Spatrick #endif
393cab2bb3Spatrick 
403cab2bb3Spatrick // TLS is handled differently on different platforms
413cab2bb3Spatrick #if SANITIZER_LINUX || SANITIZER_NETBSD || \
42d89ec533Spatrick   SANITIZER_FREEBSD
433cab2bb3Spatrick # define SANITIZER_TLS_INITIAL_EXEC_ATTRIBUTE \
443cab2bb3Spatrick     __attribute__((tls_model("initial-exec"))) thread_local
453cab2bb3Spatrick #else
463cab2bb3Spatrick # define SANITIZER_TLS_INITIAL_EXEC_ATTRIBUTE
473cab2bb3Spatrick #endif
483cab2bb3Spatrick 
493cab2bb3Spatrick //--------------------------- WEAK FUNCTIONS ---------------------------------//
503cab2bb3Spatrick // When working with weak functions, to simplify the code and make it more
513cab2bb3Spatrick // portable, when possible define a default implementation using this macro:
523cab2bb3Spatrick //
533cab2bb3Spatrick // SANITIZER_INTERFACE_WEAK_DEF(<return_type>, <name>, <parameter list>)
543cab2bb3Spatrick //
553cab2bb3Spatrick // For example:
563cab2bb3Spatrick //   SANITIZER_INTERFACE_WEAK_DEF(bool, compare, int a, int b) { return a > b; }
573cab2bb3Spatrick //
583cab2bb3Spatrick #if SANITIZER_WINDOWS
593cab2bb3Spatrick #include "sanitizer_win_defs.h"
603cab2bb3Spatrick # define SANITIZER_INTERFACE_WEAK_DEF(ReturnType, Name, ...)                   \
613cab2bb3Spatrick   WIN_WEAK_EXPORT_DEF(ReturnType, Name, __VA_ARGS__)
623cab2bb3Spatrick #else
633cab2bb3Spatrick # define SANITIZER_INTERFACE_WEAK_DEF(ReturnType, Name, ...)                   \
643cab2bb3Spatrick   extern "C" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE            \
653cab2bb3Spatrick   ReturnType Name(__VA_ARGS__)
663cab2bb3Spatrick #endif
673cab2bb3Spatrick 
683cab2bb3Spatrick // SANITIZER_SUPPORTS_WEAK_HOOKS means that we support real weak functions that
693cab2bb3Spatrick // will evaluate to a null pointer when not defined.
703cab2bb3Spatrick #ifndef SANITIZER_SUPPORTS_WEAK_HOOKS
713cab2bb3Spatrick #if (SANITIZER_LINUX || SANITIZER_SOLARIS) && !SANITIZER_GO
723cab2bb3Spatrick # define SANITIZER_SUPPORTS_WEAK_HOOKS 1
733cab2bb3Spatrick // Before Xcode 4.5, the Darwin linker doesn't reliably support undefined
743cab2bb3Spatrick // weak symbols.  Mac OS X 10.9/Darwin 13 is the first release only supported
753cab2bb3Spatrick // by Xcode >= 4.5.
76*810390e3Srobert #elif SANITIZER_APPLE && \
773cab2bb3Spatrick     __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1090 && !SANITIZER_GO
783cab2bb3Spatrick # define SANITIZER_SUPPORTS_WEAK_HOOKS 1
793cab2bb3Spatrick #else
803cab2bb3Spatrick # define SANITIZER_SUPPORTS_WEAK_HOOKS 0
813cab2bb3Spatrick #endif
823cab2bb3Spatrick #endif // SANITIZER_SUPPORTS_WEAK_HOOKS
833cab2bb3Spatrick // For some weak hooks that will be called very often and we want to avoid the
843cab2bb3Spatrick // overhead of executing the default implementation when it is not necessary,
853cab2bb3Spatrick // we can use the flag SANITIZER_SUPPORTS_WEAK_HOOKS to only define the default
863cab2bb3Spatrick // implementation for platforms that doesn't support weak symbols. For example:
873cab2bb3Spatrick //
883cab2bb3Spatrick //   #if !SANITIZER_SUPPORT_WEAK_HOOKS
893cab2bb3Spatrick //     SANITIZER_INTERFACE_WEAK_DEF(bool, compare_hook, int a, int b) {
903cab2bb3Spatrick //       return a > b;
913cab2bb3Spatrick //     }
923cab2bb3Spatrick //   #endif
933cab2bb3Spatrick //
943cab2bb3Spatrick // And then use it as: if (compare_hook) compare_hook(a, b);
953cab2bb3Spatrick //----------------------------------------------------------------------------//
963cab2bb3Spatrick 
973cab2bb3Spatrick 
983cab2bb3Spatrick // We can use .preinit_array section on Linux to call sanitizer initialization
993cab2bb3Spatrick // functions very early in the process startup (unless PIC macro is defined).
1003cab2bb3Spatrick //
1013cab2bb3Spatrick // On FreeBSD, .preinit_array functions are called with rtld_bind_lock writer
1023cab2bb3Spatrick // lock held. It will lead to dead lock if unresolved PLT functions (which helds
1033cab2bb3Spatrick // rtld_bind_lock reader lock) are called inside .preinit_array functions.
1043cab2bb3Spatrick //
1053cab2bb3Spatrick // FIXME: do we have anything like this on Mac?
1063cab2bb3Spatrick #ifndef SANITIZER_CAN_USE_PREINIT_ARRAY
107d89ec533Spatrick #if (SANITIZER_LINUX || SANITIZER_FUCHSIA || SANITIZER_NETBSD) && !defined(PIC)
1083cab2bb3Spatrick #define SANITIZER_CAN_USE_PREINIT_ARRAY 1
1093cab2bb3Spatrick // Before Solaris 11.4, .preinit_array is fully supported only with GNU ld.
1103cab2bb3Spatrick // FIXME: Check for those conditions.
1113cab2bb3Spatrick #elif SANITIZER_SOLARIS && !defined(PIC)
1123cab2bb3Spatrick # define SANITIZER_CAN_USE_PREINIT_ARRAY 1
1133cab2bb3Spatrick #else
1143cab2bb3Spatrick # define SANITIZER_CAN_USE_PREINIT_ARRAY 0
1153cab2bb3Spatrick #endif
1163cab2bb3Spatrick #endif  // SANITIZER_CAN_USE_PREINIT_ARRAY
1173cab2bb3Spatrick 
1183cab2bb3Spatrick // GCC does not understand __has_feature
1193cab2bb3Spatrick #if !defined(__has_feature)
1203cab2bb3Spatrick # define __has_feature(x) 0
1213cab2bb3Spatrick #endif
1223cab2bb3Spatrick 
1233cab2bb3Spatrick // Older GCCs do not understand __has_attribute.
1243cab2bb3Spatrick #if !defined(__has_attribute)
1253cab2bb3Spatrick # define __has_attribute(x) 0
1263cab2bb3Spatrick #endif
1273cab2bb3Spatrick 
128*810390e3Srobert #if !defined(__has_cpp_attribute)
129*810390e3Srobert #  define __has_cpp_attribute(x) 0
130*810390e3Srobert #endif
131*810390e3Srobert 
1323cab2bb3Spatrick // For portability reasons we do not include stddef.h, stdint.h or any other
1333cab2bb3Spatrick // system header, but we do need some basic types that are not defined
1343cab2bb3Spatrick // in a portable way by the language itself.
1353cab2bb3Spatrick namespace __sanitizer {
1363cab2bb3Spatrick 
1373cab2bb3Spatrick #if defined(_WIN64)
1383cab2bb3Spatrick // 64-bit Windows uses LLP64 data model.
1393cab2bb3Spatrick typedef unsigned long long uptr;
1403cab2bb3Spatrick typedef signed long long sptr;
1413cab2bb3Spatrick #else
142*810390e3Srobert #  if (SANITIZER_WORDSIZE == 64) || SANITIZER_APPLE || SANITIZER_WINDOWS
1433cab2bb3Spatrick typedef unsigned long uptr;
1443cab2bb3Spatrick typedef signed long sptr;
145*810390e3Srobert #  else
146*810390e3Srobert typedef unsigned int uptr;
147*810390e3Srobert typedef signed int sptr;
148*810390e3Srobert #  endif
1493cab2bb3Spatrick #endif  // defined(_WIN64)
1503cab2bb3Spatrick #if defined(__x86_64__)
1513cab2bb3Spatrick // Since x32 uses ILP32 data model in 64-bit hardware mode, we must use
1523cab2bb3Spatrick // 64-bit pointer to unwind stack frame.
1533cab2bb3Spatrick typedef unsigned long long uhwptr;
1543cab2bb3Spatrick #else
1553cab2bb3Spatrick typedef uptr uhwptr;
1563cab2bb3Spatrick #endif
1573cab2bb3Spatrick typedef unsigned char u8;
1583cab2bb3Spatrick typedef unsigned short u16;
1593cab2bb3Spatrick typedef unsigned int u32;
1603cab2bb3Spatrick typedef unsigned long long u64;
1613cab2bb3Spatrick typedef signed char s8;
1623cab2bb3Spatrick typedef signed short s16;
1633cab2bb3Spatrick typedef signed int s32;
1643cab2bb3Spatrick typedef signed long long s64;
1653cab2bb3Spatrick #if SANITIZER_WINDOWS
1663cab2bb3Spatrick // On Windows, files are HANDLE, which is a synonim of void*.
1673cab2bb3Spatrick // Use void* to avoid including <windows.h> everywhere.
1683cab2bb3Spatrick typedef void* fd_t;
1693cab2bb3Spatrick typedef unsigned error_t;
1703cab2bb3Spatrick #else
1713cab2bb3Spatrick typedef int fd_t;
1723cab2bb3Spatrick typedef int error_t;
1733cab2bb3Spatrick #endif
1743cab2bb3Spatrick #if SANITIZER_SOLARIS && !defined(_LP64)
1753cab2bb3Spatrick typedef long pid_t;
1763cab2bb3Spatrick #else
1773cab2bb3Spatrick typedef int pid_t;
1783cab2bb3Spatrick #endif
1793cab2bb3Spatrick 
180*810390e3Srobert #if SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_APPLE ||             \
1813cab2bb3Spatrick     (SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64)) || \
182*810390e3Srobert     (SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID) ||        \
183*810390e3Srobert     (SANITIZER_LINUX && (defined(__x86_64__) || defined(__hexagon__)))
1843cab2bb3Spatrick typedef u64 OFF_T;
1853cab2bb3Spatrick #else
1863cab2bb3Spatrick typedef uptr OFF_T;
1873cab2bb3Spatrick #endif
1883cab2bb3Spatrick typedef u64  OFF64_T;
1893cab2bb3Spatrick 
190*810390e3Srobert #if (SANITIZER_WORDSIZE == 64) || SANITIZER_APPLE
1913cab2bb3Spatrick typedef uptr operator_new_size_type;
1923cab2bb3Spatrick #else
193d89ec533Spatrick # if defined(__s390__) && !defined(__s390x__)
1943cab2bb3Spatrick // Special case: 31-bit s390 has unsigned long as size_t.
1953cab2bb3Spatrick typedef unsigned long operator_new_size_type;
1963cab2bb3Spatrick # else
1973cab2bb3Spatrick typedef u32 operator_new_size_type;
1983cab2bb3Spatrick # endif
1993cab2bb3Spatrick #endif
2003cab2bb3Spatrick 
2013cab2bb3Spatrick typedef u64 tid_t;
2023cab2bb3Spatrick 
2033cab2bb3Spatrick // ----------- ATTENTION -------------
2043cab2bb3Spatrick // This header should NOT include any other headers to avoid portability issues.
2053cab2bb3Spatrick 
2063cab2bb3Spatrick // Common defs.
2073cab2bb3Spatrick #define INTERFACE_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
2083cab2bb3Spatrick #define SANITIZER_WEAK_DEFAULT_IMPL \
2093cab2bb3Spatrick   extern "C" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE NOINLINE
2103cab2bb3Spatrick #define SANITIZER_WEAK_CXX_DEFAULT_IMPL \
2113cab2bb3Spatrick   extern "C++" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE NOINLINE
2123cab2bb3Spatrick 
2133cab2bb3Spatrick // Platform-specific defs.
2143cab2bb3Spatrick #if defined(_MSC_VER)
2153cab2bb3Spatrick # define ALWAYS_INLINE __forceinline
2163cab2bb3Spatrick // FIXME(timurrrr): do we need this on Windows?
2173cab2bb3Spatrick # define ALIAS(x)
2183cab2bb3Spatrick # define ALIGNED(x) __declspec(align(x))
2193cab2bb3Spatrick # define FORMAT(f, a)
2203cab2bb3Spatrick # define NOINLINE __declspec(noinline)
2213cab2bb3Spatrick # define NORETURN __declspec(noreturn)
2223cab2bb3Spatrick # define THREADLOCAL   __declspec(thread)
2233cab2bb3Spatrick # define LIKELY(x) (x)
2243cab2bb3Spatrick # define UNLIKELY(x) (x)
2253cab2bb3Spatrick # define PREFETCH(x) /* _mm_prefetch(x, _MM_HINT_NTA) */ (void)0
2263cab2bb3Spatrick # define WARN_UNUSED_RESULT
2273cab2bb3Spatrick #else  // _MSC_VER
2283cab2bb3Spatrick # define ALWAYS_INLINE inline __attribute__((always_inline))
2293cab2bb3Spatrick # define ALIAS(x) __attribute__((alias(x)))
2303cab2bb3Spatrick // Please only use the ALIGNED macro before the type.
2313cab2bb3Spatrick // Using ALIGNED after the variable declaration is not portable!
2323cab2bb3Spatrick # define ALIGNED(x) __attribute__((aligned(x)))
2333cab2bb3Spatrick # define FORMAT(f, a)  __attribute__((format(printf, f, a)))
2343cab2bb3Spatrick # define NOINLINE __attribute__((noinline))
2353cab2bb3Spatrick # define NORETURN  __attribute__((noreturn))
2363cab2bb3Spatrick # define THREADLOCAL   __thread
2373cab2bb3Spatrick # define LIKELY(x)     __builtin_expect(!!(x), 1)
2383cab2bb3Spatrick # define UNLIKELY(x)   __builtin_expect(!!(x), 0)
2393cab2bb3Spatrick # if defined(__i386__) || defined(__x86_64__)
2403cab2bb3Spatrick // __builtin_prefetch(x) generates prefetchnt0 on x86
2413cab2bb3Spatrick #  define PREFETCH(x) __asm__("prefetchnta (%0)" : : "r" (x))
2423cab2bb3Spatrick # else
2433cab2bb3Spatrick #  define PREFETCH(x) __builtin_prefetch(x)
2443cab2bb3Spatrick # endif
2453cab2bb3Spatrick # define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
2463cab2bb3Spatrick #endif  // _MSC_VER
2473cab2bb3Spatrick 
2483cab2bb3Spatrick #if !defined(_MSC_VER) || defined(__clang__)
2493cab2bb3Spatrick # define UNUSED __attribute__((unused))
2503cab2bb3Spatrick # define USED __attribute__((used))
2513cab2bb3Spatrick #else
2523cab2bb3Spatrick # define UNUSED
2533cab2bb3Spatrick # define USED
2543cab2bb3Spatrick #endif
2553cab2bb3Spatrick 
2563cab2bb3Spatrick #if !defined(_MSC_VER) || defined(__clang__) || MSC_PREREQ(1900)
2573cab2bb3Spatrick # define NOEXCEPT noexcept
2583cab2bb3Spatrick #else
2593cab2bb3Spatrick # define NOEXCEPT throw()
2603cab2bb3Spatrick #endif
2613cab2bb3Spatrick 
262*810390e3Srobert #if __has_cpp_attribute(clang::fallthrough)
263*810390e3Srobert #  define FALLTHROUGH [[clang::fallthrough]]
264*810390e3Srobert #elif __has_cpp_attribute(fallthrough)
265*810390e3Srobert #  define FALLTHROUGH [[fallthrough]]
266*810390e3Srobert #else
267*810390e3Srobert #  define FALLTHROUGH
268*810390e3Srobert #endif
269*810390e3Srobert 
2703cab2bb3Spatrick // Unaligned versions of basic types.
2713cab2bb3Spatrick typedef ALIGNED(1) u16 uu16;
2723cab2bb3Spatrick typedef ALIGNED(1) u32 uu32;
2733cab2bb3Spatrick typedef ALIGNED(1) u64 uu64;
2743cab2bb3Spatrick typedef ALIGNED(1) s16 us16;
2753cab2bb3Spatrick typedef ALIGNED(1) s32 us32;
2763cab2bb3Spatrick typedef ALIGNED(1) s64 us64;
2773cab2bb3Spatrick 
2783cab2bb3Spatrick #if SANITIZER_WINDOWS
2793cab2bb3Spatrick }  // namespace __sanitizer
2803cab2bb3Spatrick typedef unsigned long DWORD;
2813cab2bb3Spatrick namespace __sanitizer {
2823cab2bb3Spatrick typedef DWORD thread_return_t;
2833cab2bb3Spatrick # define THREAD_CALLING_CONV __stdcall
2843cab2bb3Spatrick #else  // _WIN32
2853cab2bb3Spatrick typedef void* thread_return_t;
2863cab2bb3Spatrick # define THREAD_CALLING_CONV
2873cab2bb3Spatrick #endif  // _WIN32
2883cab2bb3Spatrick typedef thread_return_t (THREAD_CALLING_CONV *thread_callback_t)(void* arg);
2893cab2bb3Spatrick 
2903cab2bb3Spatrick // NOTE: Functions below must be defined in each run-time.
2913cab2bb3Spatrick void NORETURN Die();
2923cab2bb3Spatrick 
2933cab2bb3Spatrick void NORETURN CheckFailed(const char *file, int line, const char *cond,
2943cab2bb3Spatrick                           u64 v1, u64 v2);
2953cab2bb3Spatrick 
2963cab2bb3Spatrick // Check macro
297*810390e3Srobert #define RAW_CHECK_MSG(expr, msg, ...)          \
298*810390e3Srobert   do {                                         \
2993cab2bb3Spatrick     if (UNLIKELY(!(expr))) {                   \
300*810390e3Srobert       const char* msgs[] = {msg, __VA_ARGS__}; \
301*810390e3Srobert       for (const char* m : msgs) RawWrite(m);  \
3023cab2bb3Spatrick       Die();                                   \
3033cab2bb3Spatrick     }                                          \
3043cab2bb3Spatrick   } while (0)
3053cab2bb3Spatrick 
306*810390e3Srobert #define RAW_CHECK(expr) RAW_CHECK_MSG(expr, #expr "\n", )
307*810390e3Srobert #define RAW_CHECK_VA(expr, ...) RAW_CHECK_MSG(expr, #expr "\n", __VA_ARGS__)
3083cab2bb3Spatrick 
3093cab2bb3Spatrick #define CHECK_IMPL(c1, op, c2) \
3103cab2bb3Spatrick   do { \
3113cab2bb3Spatrick     __sanitizer::u64 v1 = (__sanitizer::u64)(c1); \
3123cab2bb3Spatrick     __sanitizer::u64 v2 = (__sanitizer::u64)(c2); \
3133cab2bb3Spatrick     if (UNLIKELY(!(v1 op v2))) \
3143cab2bb3Spatrick       __sanitizer::CheckFailed(__FILE__, __LINE__, \
3153cab2bb3Spatrick         "(" #c1 ") " #op " (" #c2 ")", v1, v2); \
3163cab2bb3Spatrick   } while (false) \
3173cab2bb3Spatrick /**/
3183cab2bb3Spatrick 
3193cab2bb3Spatrick #define CHECK(a)       CHECK_IMPL((a), !=, 0)
3203cab2bb3Spatrick #define CHECK_EQ(a, b) CHECK_IMPL((a), ==, (b))
3213cab2bb3Spatrick #define CHECK_NE(a, b) CHECK_IMPL((a), !=, (b))
3223cab2bb3Spatrick #define CHECK_LT(a, b) CHECK_IMPL((a), <,  (b))
3233cab2bb3Spatrick #define CHECK_LE(a, b) CHECK_IMPL((a), <=, (b))
3243cab2bb3Spatrick #define CHECK_GT(a, b) CHECK_IMPL((a), >,  (b))
3253cab2bb3Spatrick #define CHECK_GE(a, b) CHECK_IMPL((a), >=, (b))
3263cab2bb3Spatrick 
3273cab2bb3Spatrick #if SANITIZER_DEBUG
3283cab2bb3Spatrick #define DCHECK(a)       CHECK(a)
3293cab2bb3Spatrick #define DCHECK_EQ(a, b) CHECK_EQ(a, b)
3303cab2bb3Spatrick #define DCHECK_NE(a, b) CHECK_NE(a, b)
3313cab2bb3Spatrick #define DCHECK_LT(a, b) CHECK_LT(a, b)
3323cab2bb3Spatrick #define DCHECK_LE(a, b) CHECK_LE(a, b)
3333cab2bb3Spatrick #define DCHECK_GT(a, b) CHECK_GT(a, b)
3343cab2bb3Spatrick #define DCHECK_GE(a, b) CHECK_GE(a, b)
3353cab2bb3Spatrick #else
3363cab2bb3Spatrick #define DCHECK(a)
3373cab2bb3Spatrick #define DCHECK_EQ(a, b)
3383cab2bb3Spatrick #define DCHECK_NE(a, b)
3393cab2bb3Spatrick #define DCHECK_LT(a, b)
3403cab2bb3Spatrick #define DCHECK_LE(a, b)
3413cab2bb3Spatrick #define DCHECK_GT(a, b)
3423cab2bb3Spatrick #define DCHECK_GE(a, b)
3433cab2bb3Spatrick #endif
3443cab2bb3Spatrick 
3453cab2bb3Spatrick #define UNREACHABLE(msg) do { \
3463cab2bb3Spatrick   CHECK(0 && msg); \
3473cab2bb3Spatrick   Die(); \
3483cab2bb3Spatrick } while (0)
3493cab2bb3Spatrick 
3503cab2bb3Spatrick #define UNIMPLEMENTED() UNREACHABLE("unimplemented")
3513cab2bb3Spatrick 
352d89ec533Spatrick #define COMPILER_CHECK(pred) static_assert(pred, "")
3533cab2bb3Spatrick 
3543cab2bb3Spatrick #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
3553cab2bb3Spatrick 
3563cab2bb3Spatrick // Limits for integral types. We have to redefine it in case we don't
3573cab2bb3Spatrick // have stdint.h (like in Visual Studio 9).
3583cab2bb3Spatrick #undef __INT64_C
3593cab2bb3Spatrick #undef __UINT64_C
3603cab2bb3Spatrick #if SANITIZER_WORDSIZE == 64
3613cab2bb3Spatrick # define __INT64_C(c)  c ## L
3623cab2bb3Spatrick # define __UINT64_C(c) c ## UL
3633cab2bb3Spatrick #else
3643cab2bb3Spatrick # define __INT64_C(c)  c ## LL
3653cab2bb3Spatrick # define __UINT64_C(c) c ## ULL
3663cab2bb3Spatrick #endif  // SANITIZER_WORDSIZE == 64
3673cab2bb3Spatrick #undef INT32_MIN
3683cab2bb3Spatrick #define INT32_MIN              (-2147483647-1)
3693cab2bb3Spatrick #undef INT32_MAX
3703cab2bb3Spatrick #define INT32_MAX              (2147483647)
3713cab2bb3Spatrick #undef UINT32_MAX
3723cab2bb3Spatrick #define UINT32_MAX             (4294967295U)
3733cab2bb3Spatrick #undef INT64_MIN
3743cab2bb3Spatrick #define INT64_MIN              (-__INT64_C(9223372036854775807)-1)
3753cab2bb3Spatrick #undef INT64_MAX
3763cab2bb3Spatrick #define INT64_MAX              (__INT64_C(9223372036854775807))
3773cab2bb3Spatrick #undef UINT64_MAX
3783cab2bb3Spatrick #define UINT64_MAX             (__UINT64_C(18446744073709551615))
3793cab2bb3Spatrick #undef UINTPTR_MAX
3803cab2bb3Spatrick #if SANITIZER_WORDSIZE == 64
3813cab2bb3Spatrick # define UINTPTR_MAX           (18446744073709551615UL)
3823cab2bb3Spatrick #else
3833cab2bb3Spatrick # define UINTPTR_MAX           (4294967295U)
3843cab2bb3Spatrick #endif  // SANITIZER_WORDSIZE == 64
3853cab2bb3Spatrick 
3863cab2bb3Spatrick enum LinkerInitialized { LINKER_INITIALIZED = 0 };
3873cab2bb3Spatrick 
3883cab2bb3Spatrick #if !defined(_MSC_VER) || defined(__clang__)
3893cab2bb3Spatrick #  define GET_CALLER_PC()                              \
390*810390e3Srobert     ((__sanitizer::uptr)__builtin_extract_return_addr( \
391*810390e3Srobert         __builtin_return_address(0)))
392*810390e3Srobert #  define GET_CURRENT_FRAME() ((__sanitizer::uptr)__builtin_frame_address(0))
Trap()3933cab2bb3Spatrick inline void Trap() {
3943cab2bb3Spatrick   __builtin_trap();
3953cab2bb3Spatrick }
3963cab2bb3Spatrick #else
3973cab2bb3Spatrick extern "C" void* _ReturnAddress(void);
3983cab2bb3Spatrick extern "C" void* _AddressOfReturnAddress(void);
3993cab2bb3Spatrick # pragma intrinsic(_ReturnAddress)
4003cab2bb3Spatrick # pragma intrinsic(_AddressOfReturnAddress)
401*810390e3Srobert #  define GET_CALLER_PC() ((__sanitizer::uptr)_ReturnAddress())
4023cab2bb3Spatrick // CaptureStackBackTrace doesn't need to know BP on Windows.
4033cab2bb3Spatrick #  define GET_CURRENT_FRAME() \
4043cab2bb3Spatrick     (((__sanitizer::uptr)_AddressOfReturnAddress()) + sizeof(__sanitizer::uptr))
4053cab2bb3Spatrick 
4063cab2bb3Spatrick extern "C" void __ud2(void);
4073cab2bb3Spatrick #  pragma intrinsic(__ud2)
Trap()4083cab2bb3Spatrick inline void Trap() {
4093cab2bb3Spatrick   __ud2();
4103cab2bb3Spatrick }
4113cab2bb3Spatrick #endif
4123cab2bb3Spatrick 
4133cab2bb3Spatrick #define HANDLE_EINTR(res, f)                                       \
4143cab2bb3Spatrick   {                                                                \
4153cab2bb3Spatrick     int rverrno;                                                   \
4163cab2bb3Spatrick     do {                                                           \
4173cab2bb3Spatrick       res = (f);                                                   \
4183cab2bb3Spatrick     } while (internal_iserror(res, &rverrno) && rverrno == EINTR); \
4193cab2bb3Spatrick   }
4203cab2bb3Spatrick 
4213cab2bb3Spatrick // Forces the compiler to generate a frame pointer in the function.
4223cab2bb3Spatrick #define ENABLE_FRAME_POINTER              \
4233cab2bb3Spatrick   do {                                    \
4243cab2bb3Spatrick     volatile __sanitizer::uptr enable_fp; \
4253cab2bb3Spatrick     enable_fp = GET_CURRENT_FRAME();      \
4263cab2bb3Spatrick     (void)enable_fp;                      \
4273cab2bb3Spatrick   } while (0)
4283cab2bb3Spatrick 
429*810390e3Srobert // Internal thread identifier allocated by ThreadRegistry.
430*810390e3Srobert typedef u32 Tid;
431*810390e3Srobert constexpr Tid kInvalidTid = -1;
432*810390e3Srobert constexpr Tid kMainTid = 0;
433*810390e3Srobert 
434*810390e3Srobert // Stack depot stack identifier.
435*810390e3Srobert typedef u32 StackID;
436*810390e3Srobert const StackID kInvalidStackID = 0;
437d89ec533Spatrick 
4383cab2bb3Spatrick }  // namespace __sanitizer
4393cab2bb3Spatrick 
4403cab2bb3Spatrick namespace __asan {
4413cab2bb3Spatrick using namespace __sanitizer;
4423cab2bb3Spatrick }
4433cab2bb3Spatrick namespace __dsan {
4443cab2bb3Spatrick using namespace __sanitizer;
4453cab2bb3Spatrick }
4463cab2bb3Spatrick namespace __dfsan {
4473cab2bb3Spatrick using namespace __sanitizer;
4483cab2bb3Spatrick }
4493cab2bb3Spatrick namespace __lsan {
4503cab2bb3Spatrick using namespace __sanitizer;
4513cab2bb3Spatrick }
4523cab2bb3Spatrick namespace __msan {
4533cab2bb3Spatrick using namespace __sanitizer;
4543cab2bb3Spatrick }
4553cab2bb3Spatrick namespace __hwasan {
4563cab2bb3Spatrick using namespace __sanitizer;
4573cab2bb3Spatrick }
4583cab2bb3Spatrick namespace __tsan {
4593cab2bb3Spatrick using namespace __sanitizer;
4603cab2bb3Spatrick }
4613cab2bb3Spatrick namespace __scudo {
4623cab2bb3Spatrick using namespace __sanitizer;
4633cab2bb3Spatrick }
4643cab2bb3Spatrick namespace __ubsan {
4653cab2bb3Spatrick using namespace __sanitizer;
4663cab2bb3Spatrick }
4673cab2bb3Spatrick namespace __xray {
4683cab2bb3Spatrick using namespace __sanitizer;
4693cab2bb3Spatrick }
4703cab2bb3Spatrick namespace __interception {
4713cab2bb3Spatrick using namespace __sanitizer;
4723cab2bb3Spatrick }
4733cab2bb3Spatrick namespace __hwasan {
4743cab2bb3Spatrick using namespace __sanitizer;
4753cab2bb3Spatrick }
476d89ec533Spatrick namespace __memprof {
477d89ec533Spatrick using namespace __sanitizer;
478d89ec533Spatrick }
4793cab2bb3Spatrick 
4803cab2bb3Spatrick #endif  // SANITIZER_DEFS_H
481