1 //===-- sanitizer_internal_defs.h -------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file is shared between AddressSanitizer and ThreadSanitizer. 11 // It contains macro used in run-time libraries code. 12 //===----------------------------------------------------------------------===// 13 #ifndef SANITIZER_DEFS_H 14 #define SANITIZER_DEFS_H 15 16 #include "sanitizer/common_interface_defs.h" 17 using namespace __sanitizer; // NOLINT 18 // ----------- ATTENTION ------------- 19 // This header should NOT include any other headers to avoid portability issues. 20 21 // Common defs. 22 #define INLINE static inline 23 #define INTERFACE_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE 24 #define WEAK SANITIZER_WEAK_ATTRIBUTE 25 26 // Platform-specific defs. 27 #if defined(_WIN32) 28 typedef unsigned long DWORD; // NOLINT 29 # define ALWAYS_INLINE __declspec(forceinline) 30 // FIXME(timurrrr): do we need this on Windows? 31 # define ALIAS(x) 32 # define ALIGNED(x) __declspec(align(x)) 33 # define FORMAT(f, a) 34 # define NOINLINE __declspec(noinline) 35 # define NORETURN __declspec(noreturn) 36 # define THREADLOCAL __declspec(thread) 37 # define NOTHROW 38 #else // _WIN32 39 # define ALWAYS_INLINE __attribute__((always_inline)) 40 # define ALIAS(x) __attribute__((alias(x))) 41 # define ALIGNED(x) __attribute__((aligned(x))) 42 # define FORMAT(f, a) __attribute__((format(printf, f, a))) 43 # define NOINLINE __attribute__((noinline)) 44 # define NORETURN __attribute__((noreturn)) 45 # define THREADLOCAL __thread 46 # ifdef __cplusplus 47 # define NOTHROW throw() 48 # else 49 # define NOTHROW __attribute__((__nothrow__)) 50 #endif 51 #endif // _WIN32 52 53 // We have no equivalent of these on Windows. 54 #ifndef _WIN32 55 # define LIKELY(x) __builtin_expect(!!(x), 1) 56 # define UNLIKELY(x) __builtin_expect(!!(x), 0) 57 # define UNUSED __attribute__((unused)) 58 # define USED __attribute__((used)) 59 #endif 60 61 #if defined(_WIN32) 62 typedef DWORD thread_return_t; 63 # define THREAD_CALLING_CONV __stdcall 64 #else // _WIN32 65 typedef void* thread_return_t; 66 # define THREAD_CALLING_CONV 67 #endif // _WIN32 68 typedef thread_return_t (THREAD_CALLING_CONV *thread_callback_t)(void* arg); 69 70 // If __WORDSIZE was undefined by the platform, define it in terms of the 71 // compiler built-ins __LP64__ and _WIN64. 72 #ifndef __WORDSIZE 73 # if __LP64__ || defined(_WIN64) 74 # define __WORDSIZE 64 75 # else 76 # define __WORDSIZE 32 77 # endif 78 #endif // __WORDSIZE 79 80 // NOTE: Functions below must be defined in each run-time. 81 namespace __sanitizer { 82 void NORETURN Die(); 83 void NORETURN CheckFailed(const char *file, int line, const char *cond, 84 u64 v1, u64 v2); 85 } // namespace __sanitizer 86 87 // Check macro 88 #define RAW_CHECK_MSG(expr, msg) do { \ 89 if (!(expr)) { \ 90 RawWrite(msg); \ 91 Die(); \ 92 } \ 93 } while (0) 94 95 #define RAW_CHECK(expr) RAW_CHECK_MSG(expr, #expr) 96 97 #define CHECK_IMPL(c1, op, c2) \ 98 do { \ 99 __sanitizer::u64 v1 = (u64)(c1); \ 100 __sanitizer::u64 v2 = (u64)(c2); \ 101 if (!(v1 op v2)) \ 102 __sanitizer::CheckFailed(__FILE__, __LINE__, \ 103 "(" #c1 ") " #op " (" #c2 ")", v1, v2); \ 104 } while (false) \ 105 /**/ 106 107 #define CHECK(a) CHECK_IMPL((a), !=, 0) 108 #define CHECK_EQ(a, b) CHECK_IMPL((a), ==, (b)) 109 #define CHECK_NE(a, b) CHECK_IMPL((a), !=, (b)) 110 #define CHECK_LT(a, b) CHECK_IMPL((a), <, (b)) 111 #define CHECK_LE(a, b) CHECK_IMPL((a), <=, (b)) 112 #define CHECK_GT(a, b) CHECK_IMPL((a), >, (b)) 113 #define CHECK_GE(a, b) CHECK_IMPL((a), >=, (b)) 114 115 #if TSAN_DEBUG 116 #define DCHECK(a) CHECK(a) 117 #define DCHECK_EQ(a, b) CHECK_EQ(a, b) 118 #define DCHECK_NE(a, b) CHECK_NE(a, b) 119 #define DCHECK_LT(a, b) CHECK_LT(a, b) 120 #define DCHECK_LE(a, b) CHECK_LE(a, b) 121 #define DCHECK_GT(a, b) CHECK_GT(a, b) 122 #define DCHECK_GE(a, b) CHECK_GE(a, b) 123 #else 124 #define DCHECK(a) 125 #define DCHECK_EQ(a, b) 126 #define DCHECK_NE(a, b) 127 #define DCHECK_LT(a, b) 128 #define DCHECK_LE(a, b) 129 #define DCHECK_GT(a, b) 130 #define DCHECK_GE(a, b) 131 #endif 132 133 #define UNIMPLEMENTED() CHECK("unimplemented" && 0) 134 135 #define COMPILER_CHECK(pred) IMPL_COMPILER_ASSERT(pred, __LINE__) 136 137 #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) 138 139 #define IMPL_PASTE(a, b) a##b 140 #define IMPL_COMPILER_ASSERT(pred, line) \ 141 typedef char IMPL_PASTE(assertion_failed_##_, line)[2*(int)(pred)-1]; 142 143 // Limits for integral types. We have to redefine it in case we don't 144 // have stdint.h (like in Visual Studio 9). 145 #if __WORDSIZE == 64 146 # define __INT64_C(c) c ## L 147 # define __UINT64_C(c) c ## UL 148 #else 149 # define __INT64_C(c) c ## LL 150 # define __UINT64_C(c) c ## ULL 151 #endif // __WORDSIZE == 64 152 #undef INT32_MIN 153 #define INT32_MIN (-2147483647-1) 154 #undef INT32_MAX 155 #define INT32_MAX (2147483647) 156 #undef UINT32_MAX 157 #define UINT32_MAX (4294967295U) 158 #undef INT64_MIN 159 #define INT64_MIN (-__INT64_C(9223372036854775807)-1) 160 #undef INT64_MAX 161 #define INT64_MAX (__INT64_C(9223372036854775807)) 162 #undef UINT64_MAX 163 #define UINT64_MAX (__UINT64_C(18446744073709551615)) 164 165 enum LinkerInitialized { LINKER_INITIALIZED = 0 }; 166 167 #if !defined(_WIN32) || defined(__clang__) 168 # define GET_CALLER_PC() (uptr)__builtin_return_address(0) 169 # define GET_CURRENT_FRAME() (uptr)__builtin_frame_address(0) 170 #else 171 extern "C" void* _ReturnAddress(void); 172 # pragma intrinsic(_ReturnAddress) 173 # define GET_CALLER_PC() (uptr)_ReturnAddress() 174 // CaptureStackBackTrace doesn't need to know BP on Windows. 175 // FIXME: This macro is still used when printing error reports though it's not 176 // clear if the BP value is needed in the ASan reports on Windows. 177 # define GET_CURRENT_FRAME() (uptr)0xDEADBEEF 178 #endif 179 180 #endif // SANITIZER_DEFS_H 181