sanitizer_internal_defs.h revision d7ed1f09f316628b2d981a1d8c2cf0f5af30e90e
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#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 165enum 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 171extern "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