10b57cec5SDimitry Andric //===-- sanitizer_internal_defs.h -------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file is shared between AddressSanitizer and ThreadSanitizer. 100b57cec5SDimitry Andric // It contains macro used in run-time libraries code. 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric #ifndef SANITIZER_DEFS_H 130b57cec5SDimitry Andric #define SANITIZER_DEFS_H 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric #include "sanitizer_platform.h" 1606c3fb27SDimitry Andric #include "sanitizer_redefine_builtins.h" 170b57cec5SDimitry Andric 185f757f3fSDimitry Andric // GCC does not understand __has_feature. 195f757f3fSDimitry Andric #if !defined(__has_feature) 205f757f3fSDimitry Andric #define __has_feature(x) 0 215f757f3fSDimitry Andric #endif 225f757f3fSDimitry Andric 230b57cec5SDimitry Andric #ifndef SANITIZER_DEBUG 240b57cec5SDimitry Andric # define SANITIZER_DEBUG 0 250b57cec5SDimitry Andric #endif 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric #define SANITIZER_STRINGIFY_(S) #S 280b57cec5SDimitry Andric #define SANITIZER_STRINGIFY(S) SANITIZER_STRINGIFY_(S) 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric // Only use SANITIZER_*ATTRIBUTE* before the function return type! 310b57cec5SDimitry Andric #if SANITIZER_WINDOWS 320b57cec5SDimitry Andric #if SANITIZER_IMPORT_INTERFACE 330b57cec5SDimitry Andric # define SANITIZER_INTERFACE_ATTRIBUTE __declspec(dllimport) 340b57cec5SDimitry Andric #else 350b57cec5SDimitry Andric # define SANITIZER_INTERFACE_ATTRIBUTE __declspec(dllexport) 360b57cec5SDimitry Andric #endif 370b57cec5SDimitry Andric # define SANITIZER_WEAK_ATTRIBUTE 387a6dacacSDimitry Andric # define SANITIZER_WEAK_IMPORT 390b57cec5SDimitry Andric #elif SANITIZER_GO 400b57cec5SDimitry Andric # define SANITIZER_INTERFACE_ATTRIBUTE 410b57cec5SDimitry Andric # define SANITIZER_WEAK_ATTRIBUTE 427a6dacacSDimitry Andric # define SANITIZER_WEAK_IMPORT 430b57cec5SDimitry Andric #else 440b57cec5SDimitry Andric # define SANITIZER_INTERFACE_ATTRIBUTE __attribute__((visibility("default"))) 450b57cec5SDimitry Andric # define SANITIZER_WEAK_ATTRIBUTE __attribute__((weak)) 467a6dacacSDimitry Andric # if SANITIZER_APPLE 477a6dacacSDimitry Andric # define SANITIZER_WEAK_IMPORT extern "C" __attribute((weak_import)) 487a6dacacSDimitry Andric # else 497a6dacacSDimitry Andric # define SANITIZER_WEAK_IMPORT extern "C" SANITIZER_WEAK_ATTRIBUTE 507a6dacacSDimitry Andric # endif // SANITIZER_APPLE 517a6dacacSDimitry Andric #endif // SANITIZER_WINDOWS 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric //--------------------------- WEAK FUNCTIONS ---------------------------------// 540b57cec5SDimitry Andric // When working with weak functions, to simplify the code and make it more 550b57cec5SDimitry Andric // portable, when possible define a default implementation using this macro: 560b57cec5SDimitry Andric // 570b57cec5SDimitry Andric // SANITIZER_INTERFACE_WEAK_DEF(<return_type>, <name>, <parameter list>) 580b57cec5SDimitry Andric // 590b57cec5SDimitry Andric // For example: 600b57cec5SDimitry Andric // SANITIZER_INTERFACE_WEAK_DEF(bool, compare, int a, int b) { return a > b; } 610b57cec5SDimitry Andric // 620b57cec5SDimitry Andric #if SANITIZER_WINDOWS 630b57cec5SDimitry Andric #include "sanitizer_win_defs.h" 640b57cec5SDimitry Andric # define SANITIZER_INTERFACE_WEAK_DEF(ReturnType, Name, ...) \ 650b57cec5SDimitry Andric WIN_WEAK_EXPORT_DEF(ReturnType, Name, __VA_ARGS__) 660b57cec5SDimitry Andric #else 670b57cec5SDimitry Andric # define SANITIZER_INTERFACE_WEAK_DEF(ReturnType, Name, ...) \ 680b57cec5SDimitry Andric extern "C" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE \ 690b57cec5SDimitry Andric ReturnType Name(__VA_ARGS__) 700b57cec5SDimitry Andric #endif 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric // SANITIZER_SUPPORTS_WEAK_HOOKS means that we support real weak functions that 730b57cec5SDimitry Andric // will evaluate to a null pointer when not defined. 740b57cec5SDimitry Andric #ifndef SANITIZER_SUPPORTS_WEAK_HOOKS 750b57cec5SDimitry Andric #if (SANITIZER_LINUX || SANITIZER_SOLARIS) && !SANITIZER_GO 760b57cec5SDimitry Andric # define SANITIZER_SUPPORTS_WEAK_HOOKS 1 770b57cec5SDimitry Andric // Before Xcode 4.5, the Darwin linker doesn't reliably support undefined 780b57cec5SDimitry Andric // weak symbols. Mac OS X 10.9/Darwin 13 is the first release only supported 790b57cec5SDimitry Andric // by Xcode >= 4.5. 8081ad6265SDimitry Andric #elif SANITIZER_APPLE && \ 810b57cec5SDimitry Andric __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1090 && !SANITIZER_GO 820b57cec5SDimitry Andric # define SANITIZER_SUPPORTS_WEAK_HOOKS 1 830b57cec5SDimitry Andric #else 840b57cec5SDimitry Andric # define SANITIZER_SUPPORTS_WEAK_HOOKS 0 850b57cec5SDimitry Andric #endif 860b57cec5SDimitry Andric #endif // SANITIZER_SUPPORTS_WEAK_HOOKS 870b57cec5SDimitry Andric // For some weak hooks that will be called very often and we want to avoid the 880b57cec5SDimitry Andric // overhead of executing the default implementation when it is not necessary, 890b57cec5SDimitry Andric // we can use the flag SANITIZER_SUPPORTS_WEAK_HOOKS to only define the default 900b57cec5SDimitry Andric // implementation for platforms that doesn't support weak symbols. For example: 910b57cec5SDimitry Andric // 920b57cec5SDimitry Andric // #if !SANITIZER_SUPPORT_WEAK_HOOKS 930b57cec5SDimitry Andric // SANITIZER_INTERFACE_WEAK_DEF(bool, compare_hook, int a, int b) { 940b57cec5SDimitry Andric // return a > b; 950b57cec5SDimitry Andric // } 960b57cec5SDimitry Andric // #endif 970b57cec5SDimitry Andric // 980b57cec5SDimitry Andric // And then use it as: if (compare_hook) compare_hook(a, b); 990b57cec5SDimitry Andric //----------------------------------------------------------------------------// 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric // We can use .preinit_array section on Linux to call sanitizer initialization 1030b57cec5SDimitry Andric // functions very early in the process startup (unless PIC macro is defined). 1040b57cec5SDimitry Andric // 1050b57cec5SDimitry Andric // On FreeBSD, .preinit_array functions are called with rtld_bind_lock writer 1060b57cec5SDimitry Andric // lock held. It will lead to dead lock if unresolved PLT functions (which helds 1070b57cec5SDimitry Andric // rtld_bind_lock reader lock) are called inside .preinit_array functions. 1080b57cec5SDimitry Andric // 1090b57cec5SDimitry Andric // FIXME: do we have anything like this on Mac? 1100b57cec5SDimitry Andric #ifndef SANITIZER_CAN_USE_PREINIT_ARRAY 111e8d8bef9SDimitry Andric #if (SANITIZER_LINUX || SANITIZER_FUCHSIA || SANITIZER_NETBSD) && !defined(PIC) 1120b57cec5SDimitry Andric #define SANITIZER_CAN_USE_PREINIT_ARRAY 1 1130b57cec5SDimitry Andric // Before Solaris 11.4, .preinit_array is fully supported only with GNU ld. 1140b57cec5SDimitry Andric // FIXME: Check for those conditions. 1150b57cec5SDimitry Andric #elif SANITIZER_SOLARIS && !defined(PIC) 1160b57cec5SDimitry Andric # define SANITIZER_CAN_USE_PREINIT_ARRAY 1 1170b57cec5SDimitry Andric #else 1180b57cec5SDimitry Andric # define SANITIZER_CAN_USE_PREINIT_ARRAY 0 1190b57cec5SDimitry Andric #endif 1200b57cec5SDimitry Andric #endif // SANITIZER_CAN_USE_PREINIT_ARRAY 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric // GCC does not understand __has_feature 1230b57cec5SDimitry Andric #if !defined(__has_feature) 1240b57cec5SDimitry Andric # define __has_feature(x) 0 1250b57cec5SDimitry Andric #endif 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric // Older GCCs do not understand __has_attribute. 1280b57cec5SDimitry Andric #if !defined(__has_attribute) 1290b57cec5SDimitry Andric # define __has_attribute(x) 0 1300b57cec5SDimitry Andric #endif 1310b57cec5SDimitry Andric 132349cc55cSDimitry Andric #if !defined(__has_cpp_attribute) 133349cc55cSDimitry Andric # define __has_cpp_attribute(x) 0 134349cc55cSDimitry Andric #endif 135349cc55cSDimitry Andric 1360b57cec5SDimitry Andric // For portability reasons we do not include stddef.h, stdint.h or any other 1370b57cec5SDimitry Andric // system header, but we do need some basic types that are not defined 1380b57cec5SDimitry Andric // in a portable way by the language itself. 1390b57cec5SDimitry Andric namespace __sanitizer { 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric #if defined(_WIN64) 1420b57cec5SDimitry Andric // 64-bit Windows uses LLP64 data model. 14368d75effSDimitry Andric typedef unsigned long long uptr; 14468d75effSDimitry Andric typedef signed long long sptr; 1450b57cec5SDimitry Andric #else 14681ad6265SDimitry Andric # if (SANITIZER_WORDSIZE == 64) || SANITIZER_APPLE || SANITIZER_WINDOWS 14768d75effSDimitry Andric typedef unsigned long uptr; 14868d75effSDimitry Andric typedef signed long sptr; 149349cc55cSDimitry Andric # else 150349cc55cSDimitry Andric typedef unsigned int uptr; 151349cc55cSDimitry Andric typedef signed int sptr; 152349cc55cSDimitry Andric # endif 1530b57cec5SDimitry Andric #endif // defined(_WIN64) 1540b57cec5SDimitry Andric #if defined(__x86_64__) 1550b57cec5SDimitry Andric // Since x32 uses ILP32 data model in 64-bit hardware mode, we must use 1560b57cec5SDimitry Andric // 64-bit pointer to unwind stack frame. 15768d75effSDimitry Andric typedef unsigned long long uhwptr; 1580b57cec5SDimitry Andric #else 15968d75effSDimitry Andric typedef uptr uhwptr; 1600b57cec5SDimitry Andric #endif 1610b57cec5SDimitry Andric typedef unsigned char u8; 16268d75effSDimitry Andric typedef unsigned short u16; 1630b57cec5SDimitry Andric typedef unsigned int u32; 16468d75effSDimitry Andric typedef unsigned long long u64; 1650b57cec5SDimitry Andric typedef signed char s8; 16668d75effSDimitry Andric typedef signed short s16; 1670b57cec5SDimitry Andric typedef signed int s32; 16868d75effSDimitry Andric typedef signed long long s64; 1690b57cec5SDimitry Andric #if SANITIZER_WINDOWS 1700b57cec5SDimitry Andric // On Windows, files are HANDLE, which is a synonim of void*. 1710b57cec5SDimitry Andric // Use void* to avoid including <windows.h> everywhere. 1720b57cec5SDimitry Andric typedef void* fd_t; 1730b57cec5SDimitry Andric typedef unsigned error_t; 1740b57cec5SDimitry Andric #else 1750b57cec5SDimitry Andric typedef int fd_t; 1760b57cec5SDimitry Andric typedef int error_t; 1770b57cec5SDimitry Andric #endif 1780b57cec5SDimitry Andric #if SANITIZER_SOLARIS && !defined(_LP64) 1790b57cec5SDimitry Andric typedef long pid_t; 1800b57cec5SDimitry Andric #else 1810b57cec5SDimitry Andric typedef int pid_t; 1820b57cec5SDimitry Andric #endif 1830b57cec5SDimitry Andric 18481ad6265SDimitry Andric #if SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_APPLE || \ 1850b57cec5SDimitry Andric (SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64)) || \ 18681ad6265SDimitry Andric (SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID) || \ 187349cc55cSDimitry Andric (SANITIZER_LINUX && (defined(__x86_64__) || defined(__hexagon__))) 1880b57cec5SDimitry Andric typedef u64 OFF_T; 1890b57cec5SDimitry Andric #else 1900b57cec5SDimitry Andric typedef uptr OFF_T; 1910b57cec5SDimitry Andric #endif 1920b57cec5SDimitry Andric typedef u64 OFF64_T; 1930b57cec5SDimitry Andric 1940fca6ea1SDimitry Andric #ifdef __SIZE_TYPE__ 1950fca6ea1SDimitry Andric typedef __SIZE_TYPE__ usize; 1960b57cec5SDimitry Andric #else 197*6c4b055cSDimitry Andric // Since we use this for operator new, usize must match the real size_t, but on 198*6c4b055cSDimitry Andric // 32-bit Windows the definition of uptr does not actually match uintptr_t or 199*6c4b055cSDimitry Andric // size_t because we are working around typedef mismatches for the (S)SIZE_T 200*6c4b055cSDimitry Andric // types used in interception.h. 201*6c4b055cSDimitry Andric // Until the definition of uptr has been fixed we have to special case Win32. 202*6c4b055cSDimitry Andric # if SANITIZER_WINDOWS && SANITIZER_WORDSIZE == 32 203*6c4b055cSDimitry Andric typedef unsigned int usize; 204*6c4b055cSDimitry Andric # else 2050fca6ea1SDimitry Andric typedef uptr usize; 2060b57cec5SDimitry Andric # endif 207*6c4b055cSDimitry Andric #endif 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andric typedef u64 tid_t; 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric // ----------- ATTENTION ------------- 2120b57cec5SDimitry Andric // This header should NOT include any other headers to avoid portability issues. 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric // Common defs. 2150b57cec5SDimitry Andric #define INTERFACE_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE 2160b57cec5SDimitry Andric #define SANITIZER_WEAK_DEFAULT_IMPL \ 2170b57cec5SDimitry Andric extern "C" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE NOINLINE 2180b57cec5SDimitry Andric #define SANITIZER_WEAK_CXX_DEFAULT_IMPL \ 2190b57cec5SDimitry Andric extern "C++" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE NOINLINE 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andric // Platform-specific defs. 2220b57cec5SDimitry Andric #if defined(_MSC_VER) 2230b57cec5SDimitry Andric # define ALWAYS_INLINE __forceinline 2240b57cec5SDimitry Andric // FIXME(timurrrr): do we need this on Windows? 2250b57cec5SDimitry Andric # define ALIAS(x) 2260b57cec5SDimitry Andric # define ALIGNED(x) __declspec(align(x)) 2270b57cec5SDimitry Andric # define FORMAT(f, a) 2280b57cec5SDimitry Andric # define NOINLINE __declspec(noinline) 2290b57cec5SDimitry Andric # define NORETURN __declspec(noreturn) 2300b57cec5SDimitry Andric # define THREADLOCAL __declspec(thread) 2310b57cec5SDimitry Andric # define LIKELY(x) (x) 2320b57cec5SDimitry Andric # define UNLIKELY(x) (x) 2330b57cec5SDimitry Andric # define PREFETCH(x) /* _mm_prefetch(x, _MM_HINT_NTA) */ (void)0 2340b57cec5SDimitry Andric # define WARN_UNUSED_RESULT 2350b57cec5SDimitry Andric #else // _MSC_VER 2360b57cec5SDimitry Andric # define ALWAYS_INLINE inline __attribute__((always_inline)) 23706c3fb27SDimitry Andric # define ALIAS(x) __attribute__((alias(SANITIZER_STRINGIFY(x)))) 2380b57cec5SDimitry Andric // Please only use the ALIGNED macro before the type. 2390b57cec5SDimitry Andric // Using ALIGNED after the variable declaration is not portable! 2400b57cec5SDimitry Andric # define ALIGNED(x) __attribute__((aligned(x))) 2410b57cec5SDimitry Andric # define FORMAT(f, a) __attribute__((format(printf, f, a))) 2420b57cec5SDimitry Andric # define NOINLINE __attribute__((noinline)) 2430b57cec5SDimitry Andric # define NORETURN __attribute__((noreturn)) 2440b57cec5SDimitry Andric # define THREADLOCAL __thread 2450b57cec5SDimitry Andric # define LIKELY(x) __builtin_expect(!!(x), 1) 2460b57cec5SDimitry Andric # define UNLIKELY(x) __builtin_expect(!!(x), 0) 2470b57cec5SDimitry Andric # if defined(__i386__) || defined(__x86_64__) 2480b57cec5SDimitry Andric // __builtin_prefetch(x) generates prefetchnt0 on x86 2490b57cec5SDimitry Andric # define PREFETCH(x) __asm__("prefetchnta (%0)" : : "r" (x)) 2500b57cec5SDimitry Andric # else 2510b57cec5SDimitry Andric # define PREFETCH(x) __builtin_prefetch(x) 2520b57cec5SDimitry Andric # endif 2530b57cec5SDimitry Andric # define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 2540b57cec5SDimitry Andric #endif // _MSC_VER 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric #if !defined(_MSC_VER) || defined(__clang__) 2570b57cec5SDimitry Andric # define UNUSED __attribute__((unused)) 2580b57cec5SDimitry Andric # define USED __attribute__((used)) 2590b57cec5SDimitry Andric #else 2600b57cec5SDimitry Andric # define UNUSED 2610b57cec5SDimitry Andric # define USED 2620b57cec5SDimitry Andric #endif 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric #if !defined(_MSC_VER) || defined(__clang__) || MSC_PREREQ(1900) 2650b57cec5SDimitry Andric # define NOEXCEPT noexcept 2660b57cec5SDimitry Andric #else 2670b57cec5SDimitry Andric # define NOEXCEPT throw() 2680b57cec5SDimitry Andric #endif 2690b57cec5SDimitry Andric 270349cc55cSDimitry Andric #if __has_cpp_attribute(clang::fallthrough) 271349cc55cSDimitry Andric # define FALLTHROUGH [[clang::fallthrough]] 27281ad6265SDimitry Andric #elif __has_cpp_attribute(fallthrough) 27381ad6265SDimitry Andric # define FALLTHROUGH [[fallthrough]] 274349cc55cSDimitry Andric #else 275349cc55cSDimitry Andric # define FALLTHROUGH 276349cc55cSDimitry Andric #endif 277349cc55cSDimitry Andric 27806c3fb27SDimitry Andric #if __has_attribute(uninitialized) 27906c3fb27SDimitry Andric # define UNINITIALIZED __attribute__((uninitialized)) 28006c3fb27SDimitry Andric #else 28106c3fb27SDimitry Andric # define UNINITIALIZED 28206c3fb27SDimitry Andric #endif 28306c3fb27SDimitry Andric 2840b57cec5SDimitry Andric // Unaligned versions of basic types. 2850b57cec5SDimitry Andric typedef ALIGNED(1) u16 uu16; 2860b57cec5SDimitry Andric typedef ALIGNED(1) u32 uu32; 2870b57cec5SDimitry Andric typedef ALIGNED(1) u64 uu64; 2880b57cec5SDimitry Andric typedef ALIGNED(1) s16 us16; 2890b57cec5SDimitry Andric typedef ALIGNED(1) s32 us32; 2900b57cec5SDimitry Andric typedef ALIGNED(1) s64 us64; 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric #if SANITIZER_WINDOWS 2930b57cec5SDimitry Andric } // namespace __sanitizer 29468d75effSDimitry Andric typedef unsigned long DWORD; 2950b57cec5SDimitry Andric namespace __sanitizer { 2960b57cec5SDimitry Andric typedef DWORD thread_return_t; 2970b57cec5SDimitry Andric # define THREAD_CALLING_CONV __stdcall 2980b57cec5SDimitry Andric #else // _WIN32 2990b57cec5SDimitry Andric typedef void* thread_return_t; 3000b57cec5SDimitry Andric # define THREAD_CALLING_CONV 3010b57cec5SDimitry Andric #endif // _WIN32 3020b57cec5SDimitry Andric typedef thread_return_t (THREAD_CALLING_CONV *thread_callback_t)(void* arg); 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric // NOTE: Functions below must be defined in each run-time. 3050b57cec5SDimitry Andric void NORETURN Die(); 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andric void NORETURN CheckFailed(const char *file, int line, const char *cond, 3080b57cec5SDimitry Andric u64 v1, u64 v2); 3090b57cec5SDimitry Andric 3100b57cec5SDimitry Andric // Check macro 311349cc55cSDimitry Andric #define RAW_CHECK_MSG(expr, msg, ...) \ 312349cc55cSDimitry Andric do { \ 3130b57cec5SDimitry Andric if (UNLIKELY(!(expr))) { \ 314349cc55cSDimitry Andric const char* msgs[] = {msg, __VA_ARGS__}; \ 315349cc55cSDimitry Andric for (const char* m : msgs) RawWrite(m); \ 3160b57cec5SDimitry Andric Die(); \ 3170b57cec5SDimitry Andric } \ 3180b57cec5SDimitry Andric } while (0) 3190b57cec5SDimitry Andric 320349cc55cSDimitry Andric #define RAW_CHECK(expr) RAW_CHECK_MSG(expr, #expr "\n", ) 321349cc55cSDimitry Andric #define RAW_CHECK_VA(expr, ...) RAW_CHECK_MSG(expr, #expr "\n", __VA_ARGS__) 3220b57cec5SDimitry Andric 3230b57cec5SDimitry Andric #define CHECK_IMPL(c1, op, c2) \ 3240b57cec5SDimitry Andric do { \ 3250b57cec5SDimitry Andric __sanitizer::u64 v1 = (__sanitizer::u64)(c1); \ 3260b57cec5SDimitry Andric __sanitizer::u64 v2 = (__sanitizer::u64)(c2); \ 3270b57cec5SDimitry Andric if (UNLIKELY(!(v1 op v2))) \ 3280b57cec5SDimitry Andric __sanitizer::CheckFailed(__FILE__, __LINE__, \ 3290b57cec5SDimitry Andric "(" #c1 ") " #op " (" #c2 ")", v1, v2); \ 3300b57cec5SDimitry Andric } while (false) \ 3310b57cec5SDimitry Andric /**/ 3320b57cec5SDimitry Andric 3330b57cec5SDimitry Andric #define CHECK(a) CHECK_IMPL((a), !=, 0) 3340b57cec5SDimitry Andric #define CHECK_EQ(a, b) CHECK_IMPL((a), ==, (b)) 3350b57cec5SDimitry Andric #define CHECK_NE(a, b) CHECK_IMPL((a), !=, (b)) 3360b57cec5SDimitry Andric #define CHECK_LT(a, b) CHECK_IMPL((a), <, (b)) 3370b57cec5SDimitry Andric #define CHECK_LE(a, b) CHECK_IMPL((a), <=, (b)) 3380b57cec5SDimitry Andric #define CHECK_GT(a, b) CHECK_IMPL((a), >, (b)) 3390b57cec5SDimitry Andric #define CHECK_GE(a, b) CHECK_IMPL((a), >=, (b)) 3400b57cec5SDimitry Andric 3410b57cec5SDimitry Andric #if SANITIZER_DEBUG 3420b57cec5SDimitry Andric #define DCHECK(a) CHECK(a) 3430b57cec5SDimitry Andric #define DCHECK_EQ(a, b) CHECK_EQ(a, b) 3440b57cec5SDimitry Andric #define DCHECK_NE(a, b) CHECK_NE(a, b) 3450b57cec5SDimitry Andric #define DCHECK_LT(a, b) CHECK_LT(a, b) 3460b57cec5SDimitry Andric #define DCHECK_LE(a, b) CHECK_LE(a, b) 3470b57cec5SDimitry Andric #define DCHECK_GT(a, b) CHECK_GT(a, b) 3480b57cec5SDimitry Andric #define DCHECK_GE(a, b) CHECK_GE(a, b) 3490b57cec5SDimitry Andric #else 3500b57cec5SDimitry Andric #define DCHECK(a) 3510b57cec5SDimitry Andric #define DCHECK_EQ(a, b) 3520b57cec5SDimitry Andric #define DCHECK_NE(a, b) 3530b57cec5SDimitry Andric #define DCHECK_LT(a, b) 3540b57cec5SDimitry Andric #define DCHECK_LE(a, b) 3550b57cec5SDimitry Andric #define DCHECK_GT(a, b) 3560b57cec5SDimitry Andric #define DCHECK_GE(a, b) 3570b57cec5SDimitry Andric #endif 3580b57cec5SDimitry Andric 3590b57cec5SDimitry Andric #define UNREACHABLE(msg) do { \ 3600b57cec5SDimitry Andric CHECK(0 && msg); \ 3610b57cec5SDimitry Andric Die(); \ 3620b57cec5SDimitry Andric } while (0) 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andric #define UNIMPLEMENTED() UNREACHABLE("unimplemented") 3650b57cec5SDimitry Andric 366e8d8bef9SDimitry Andric #define COMPILER_CHECK(pred) static_assert(pred, "") 3670b57cec5SDimitry Andric 3680b57cec5SDimitry Andric #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric // Limits for integral types. We have to redefine it in case we don't 3710b57cec5SDimitry Andric // have stdint.h (like in Visual Studio 9). 3720b57cec5SDimitry Andric #undef __INT64_C 3730b57cec5SDimitry Andric #undef __UINT64_C 3740b57cec5SDimitry Andric #if SANITIZER_WORDSIZE == 64 3750b57cec5SDimitry Andric # define __INT64_C(c) c ## L 3760b57cec5SDimitry Andric # define __UINT64_C(c) c ## UL 3770b57cec5SDimitry Andric #else 3780b57cec5SDimitry Andric # define __INT64_C(c) c ## LL 3790b57cec5SDimitry Andric # define __UINT64_C(c) c ## ULL 3800b57cec5SDimitry Andric #endif // SANITIZER_WORDSIZE == 64 3810b57cec5SDimitry Andric #undef INT32_MIN 3820b57cec5SDimitry Andric #define INT32_MIN (-2147483647-1) 3830b57cec5SDimitry Andric #undef INT32_MAX 3840b57cec5SDimitry Andric #define INT32_MAX (2147483647) 3850b57cec5SDimitry Andric #undef UINT32_MAX 3860b57cec5SDimitry Andric #define UINT32_MAX (4294967295U) 3870b57cec5SDimitry Andric #undef INT64_MIN 3880b57cec5SDimitry Andric #define INT64_MIN (-__INT64_C(9223372036854775807)-1) 3890b57cec5SDimitry Andric #undef INT64_MAX 3900b57cec5SDimitry Andric #define INT64_MAX (__INT64_C(9223372036854775807)) 3910b57cec5SDimitry Andric #undef UINT64_MAX 3920b57cec5SDimitry Andric #define UINT64_MAX (__UINT64_C(18446744073709551615)) 3930b57cec5SDimitry Andric #undef UINTPTR_MAX 3940b57cec5SDimitry Andric #if SANITIZER_WORDSIZE == 64 3950b57cec5SDimitry Andric # define UINTPTR_MAX (18446744073709551615UL) 3960b57cec5SDimitry Andric #else 3970b57cec5SDimitry Andric # define UINTPTR_MAX (4294967295U) 3980b57cec5SDimitry Andric #endif // SANITIZER_WORDSIZE == 64 3990b57cec5SDimitry Andric 4000b57cec5SDimitry Andric enum LinkerInitialized { LINKER_INITIALIZED = 0 }; 4010b57cec5SDimitry Andric 4020b57cec5SDimitry Andric #if !defined(_MSC_VER) || defined(__clang__) 4030b57cec5SDimitry Andric # define GET_CALLER_PC() \ 404bdd1243dSDimitry Andric ((__sanitizer::uptr)__builtin_extract_return_addr( \ 405bdd1243dSDimitry Andric __builtin_return_address(0))) 406bdd1243dSDimitry Andric # define GET_CURRENT_FRAME() ((__sanitizer::uptr)__builtin_frame_address(0)) 4070b57cec5SDimitry Andric inline void Trap() { 4080b57cec5SDimitry Andric __builtin_trap(); 4090b57cec5SDimitry Andric } 4100b57cec5SDimitry Andric #else 4110b57cec5SDimitry Andric extern "C" void* _ReturnAddress(void); 4120b57cec5SDimitry Andric extern "C" void* _AddressOfReturnAddress(void); 4130b57cec5SDimitry Andric # pragma intrinsic(_ReturnAddress) 4140b57cec5SDimitry Andric # pragma intrinsic(_AddressOfReturnAddress) 415bdd1243dSDimitry Andric # define GET_CALLER_PC() ((__sanitizer::uptr)_ReturnAddress()) 4160b57cec5SDimitry Andric // CaptureStackBackTrace doesn't need to know BP on Windows. 4170b57cec5SDimitry Andric # define GET_CURRENT_FRAME() \ 4180b57cec5SDimitry Andric (((__sanitizer::uptr)_AddressOfReturnAddress()) + sizeof(__sanitizer::uptr)) 4190b57cec5SDimitry Andric 4200b57cec5SDimitry Andric extern "C" void __ud2(void); 4210b57cec5SDimitry Andric # pragma intrinsic(__ud2) 4220b57cec5SDimitry Andric inline void Trap() { 4230b57cec5SDimitry Andric __ud2(); 4240b57cec5SDimitry Andric } 4250b57cec5SDimitry Andric #endif 4260b57cec5SDimitry Andric 4270b57cec5SDimitry Andric #define HANDLE_EINTR(res, f) \ 4280b57cec5SDimitry Andric { \ 4290b57cec5SDimitry Andric int rverrno; \ 4300b57cec5SDimitry Andric do { \ 4310b57cec5SDimitry Andric res = (f); \ 4320b57cec5SDimitry Andric } while (internal_iserror(res, &rverrno) && rverrno == EINTR); \ 4330b57cec5SDimitry Andric } 4340b57cec5SDimitry Andric 4350b57cec5SDimitry Andric // Forces the compiler to generate a frame pointer in the function. 4360b57cec5SDimitry Andric #define ENABLE_FRAME_POINTER \ 4370b57cec5SDimitry Andric do { \ 4380b57cec5SDimitry Andric volatile __sanitizer::uptr enable_fp; \ 4390b57cec5SDimitry Andric enable_fp = GET_CURRENT_FRAME(); \ 4400b57cec5SDimitry Andric (void)enable_fp; \ 4410b57cec5SDimitry Andric } while (0) 4420b57cec5SDimitry Andric 443349cc55cSDimitry Andric // Internal thread identifier allocated by ThreadRegistry. 444349cc55cSDimitry Andric typedef u32 Tid; 445349cc55cSDimitry Andric constexpr Tid kInvalidTid = -1; 446349cc55cSDimitry Andric constexpr Tid kMainTid = 0; 447349cc55cSDimitry Andric 448349cc55cSDimitry Andric // Stack depot stack identifier. 449349cc55cSDimitry Andric typedef u32 StackID; 450349cc55cSDimitry Andric const StackID kInvalidStackID = 0; 451fe6060f1SDimitry Andric 4520b57cec5SDimitry Andric } // namespace __sanitizer 4530b57cec5SDimitry Andric 45468d75effSDimitry Andric namespace __asan { 45568d75effSDimitry Andric using namespace __sanitizer; 45668d75effSDimitry Andric } 45768d75effSDimitry Andric namespace __dsan { 45868d75effSDimitry Andric using namespace __sanitizer; 45968d75effSDimitry Andric } 46068d75effSDimitry Andric namespace __dfsan { 46168d75effSDimitry Andric using namespace __sanitizer; 46268d75effSDimitry Andric } 46368d75effSDimitry Andric namespace __lsan { 46468d75effSDimitry Andric using namespace __sanitizer; 46568d75effSDimitry Andric } 46668d75effSDimitry Andric namespace __msan { 46768d75effSDimitry Andric using namespace __sanitizer; 46868d75effSDimitry Andric } 46968d75effSDimitry Andric namespace __hwasan { 47068d75effSDimitry Andric using namespace __sanitizer; 47168d75effSDimitry Andric } 47268d75effSDimitry Andric namespace __tsan { 47368d75effSDimitry Andric using namespace __sanitizer; 47468d75effSDimitry Andric } 47568d75effSDimitry Andric namespace __scudo { 47668d75effSDimitry Andric using namespace __sanitizer; 47768d75effSDimitry Andric } 47868d75effSDimitry Andric namespace __ubsan { 47968d75effSDimitry Andric using namespace __sanitizer; 48068d75effSDimitry Andric } 48168d75effSDimitry Andric namespace __xray { 48268d75effSDimitry Andric using namespace __sanitizer; 48368d75effSDimitry Andric } 48468d75effSDimitry Andric namespace __interception { 48568d75effSDimitry Andric using namespace __sanitizer; 48668d75effSDimitry Andric } 48768d75effSDimitry Andric namespace __hwasan { 48868d75effSDimitry Andric using namespace __sanitizer; 48968d75effSDimitry Andric } 490e8d8bef9SDimitry Andric namespace __memprof { 491e8d8bef9SDimitry Andric using namespace __sanitizer; 492e8d8bef9SDimitry Andric } 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andric #endif // SANITIZER_DEFS_H 495