sanitizer_internal_defs.h revision b46941a1d23012491a7a8a52718cacbde3c19ba1
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" 17using 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) 28typedef 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) 62typedef DWORD thread_return_t; 63# define THREAD_CALLING_CONV __stdcall 64#else // _WIN32 65typedef void* thread_return_t; 66# define THREAD_CALLING_CONV 67#endif // _WIN32 68typedef 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. 81namespace __sanitizer { 82void NORETURN Die(); 83void 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#undef __INT64_C 146#undef __UINT64_C 147#if __WORDSIZE == 64 148# define __INT64_C(c) c ## L 149# define __UINT64_C(c) c ## UL 150#else 151# define __INT64_C(c) c ## LL 152# define __UINT64_C(c) c ## ULL 153#endif // __WORDSIZE == 64 154#undef INT32_MIN 155#define INT32_MIN (-2147483647-1) 156#undef INT32_MAX 157#define INT32_MAX (2147483647) 158#undef UINT32_MAX 159#define UINT32_MAX (4294967295U) 160#undef INT64_MIN 161#define INT64_MIN (-__INT64_C(9223372036854775807)-1) 162#undef INT64_MAX 163#define INT64_MAX (__INT64_C(9223372036854775807)) 164#undef UINT64_MAX 165#define UINT64_MAX (__UINT64_C(18446744073709551615)) 166 167enum LinkerInitialized { LINKER_INITIALIZED = 0 }; 168 169#if !defined(_MSC_VER) || defined(__clang__) 170# define GET_CALLER_PC() (uptr)__builtin_return_address(0) 171# define GET_CURRENT_FRAME() (uptr)__builtin_frame_address(0) 172#else 173extern "C" void* _ReturnAddress(void); 174# pragma intrinsic(_ReturnAddress) 175# define GET_CALLER_PC() (uptr)_ReturnAddress() 176// CaptureStackBackTrace doesn't need to know BP on Windows. 177// FIXME: This macro is still used when printing error reports though it's not 178// clear if the BP value is needed in the ASan reports on Windows. 179# define GET_CURRENT_FRAME() (uptr)0xDEADBEEF 180#endif 181 182#endif // SANITIZER_DEFS_H 183