1 //===-- sanitizer_internal_defs.h -------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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
16 #include "sanitizer_platform.h"
19 // FIXME find out what we need on Windows. __declspec(dllexport) ?
20 # define SANITIZER_INTERFACE_ATTRIBUTE
21 # define SANITIZER_WEAK_ATTRIBUTE
22 #elif defined(SANITIZER_GO)
23 # define SANITIZER_INTERFACE_ATTRIBUTE
24 # define SANITIZER_WEAK_ATTRIBUTE
26 # define SANITIZER_INTERFACE_ATTRIBUTE __attribute__((visibility("default")))
27 # define SANITIZER_WEAK_ATTRIBUTE __attribute__((weak))
30 #if SANITIZER_LINUX && !defined(SANITIZER_GO)
31 # define SANITIZER_SUPPORTS_WEAK_HOOKS 1
33 # define SANITIZER_SUPPORTS_WEAK_HOOKS 0
36 // GCC does not understand __has_feature
37 #if !defined(__has_feature)
38 # define __has_feature(x) 0
41 // For portability reasons we do not include stddef.h, stdint.h or any other
42 // system header, but we do need some basic types that are not defined
43 // in a portable way by the language itself.
44 namespace __sanitizer
{
47 // 64-bit Windows uses LLP64 data model.
48 typedef unsigned long long uptr
; // NOLINT
49 typedef signed long long sptr
; // NOLINT
51 typedef unsigned long uptr
; // NOLINT
52 typedef signed long sptr
; // NOLINT
53 #endif // defined(_WIN64)
54 #if defined(__x86_64__)
55 // Since x32 uses ILP32 data model in 64-bit hardware mode, we must use
56 // 64-bit pointer to unwind stack frame.
57 typedef unsigned long long uhwptr
; // NOLINT
59 typedef uptr uhwptr
; // NOLINT
61 typedef unsigned char u8
;
62 typedef unsigned short u16
; // NOLINT
63 typedef unsigned int u32
;
64 typedef unsigned long long u64
; // NOLINT
65 typedef signed char s8
;
66 typedef signed short s16
; // NOLINT
67 typedef signed int s32
;
68 typedef signed long long s64
; // NOLINT
71 // WARNING: OFF_T may be different from OS type off_t, depending on the value of
72 // _FILE_OFFSET_BITS. This definition of OFF_T matches the ABI of system calls
73 // like pread and mmap, as opposed to pread64 and mmap64.
74 // Mac and Linux/x86-64 are special.
75 #if SANITIZER_MAC || (SANITIZER_LINUX && defined(__x86_64__))
81 } // namespace __sanitizer
84 // Tell the tools to write their reports to "path.<pid>" instead of stderr.
85 void __sanitizer_set_report_path(const char *path
)
86 SANITIZER_INTERFACE_ATTRIBUTE
;
88 // Tell the tools to write their reports to given file descriptor instead of
90 void __sanitizer_set_report_fd(int fd
)
91 SANITIZER_INTERFACE_ATTRIBUTE
;
93 // Notify the tools that the sandbox is going to be turned on. The reserved
94 // parameter will be used in the future to hold a structure with functions
95 // that the tools may call to bypass the sandbox.
96 void __sanitizer_sandbox_on_notify(void *reserved
)
97 SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
;
99 // This function is called by the tool when it has just finished reporting
100 // an error. 'error_summary' is a one-line string that summarizes
101 // the error message. This function can be overridden by the client.
102 void __sanitizer_report_error_summary(const char *error_summary
)
103 SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
;
107 using namespace __sanitizer
; // NOLINT
108 // ----------- ATTENTION -------------
109 // This header should NOT include any other headers to avoid portability issues.
112 #define INLINE inline
113 #define INTERFACE_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
114 #define WEAK SANITIZER_WEAK_ATTRIBUTE
116 // Platform-specific defs.
117 #if defined(_MSC_VER)
118 # define ALWAYS_INLINE __forceinline
119 // FIXME(timurrrr): do we need this on Windows?
121 # define ALIGNED(x) __declspec(align(x))
122 # define FORMAT(f, a)
123 # define NOINLINE __declspec(noinline)
124 # define NORETURN __declspec(noreturn)
125 # define THREADLOCAL __declspec(thread)
127 # define LIKELY(x) (x)
128 # define UNLIKELY(x) (x)
131 # define PREFETCH(x) /* _mm_prefetch(x, _MM_HINT_NTA) */
133 # define ALWAYS_INLINE inline __attribute__((always_inline))
134 # define ALIAS(x) __attribute__((alias(x)))
135 # define ALIGNED(x) __attribute__((aligned(x)))
136 # define FORMAT(f, a) __attribute__((format(printf, f, a)))
137 # define NOINLINE __attribute__((noinline))
138 # define NORETURN __attribute__((noreturn))
139 # define THREADLOCAL __thread
140 # define NOTHROW throw()
141 # define LIKELY(x) __builtin_expect(!!(x), 1)
142 # define UNLIKELY(x) __builtin_expect(!!(x), 0)
143 # define UNUSED __attribute__((unused))
144 # define USED __attribute__((used))
145 # if defined(__i386__) || defined(__x86_64__)
146 // __builtin_prefetch(x) generates prefetchnt0 on x86
147 # define PREFETCH(x) __asm__("prefetchnta (%0)" : : "r" (x))
149 # define PREFETCH(x) __builtin_prefetch(x)
153 #if SANITIZER_WINDOWS
154 typedef unsigned long DWORD
; // NOLINT
155 typedef DWORD thread_return_t
;
156 # define THREAD_CALLING_CONV __stdcall
158 typedef void* thread_return_t
;
159 # define THREAD_CALLING_CONV
161 typedef thread_return_t (THREAD_CALLING_CONV
*thread_callback_t
)(void* arg
);
163 #if __LP64__ || defined(_WIN64)
164 # define SANITIZER_WORDSIZE 64
166 # define SANITIZER_WORDSIZE 32
169 // NOTE: Functions below must be defined in each run-time.
170 namespace __sanitizer
{
172 void NORETURN
CheckFailed(const char *file
, int line
, const char *cond
,
174 } // namespace __sanitizer
177 #define RAW_CHECK_MSG(expr, msg) do { \
184 #define RAW_CHECK(expr) RAW_CHECK_MSG(expr, #expr)
186 #define CHECK_IMPL(c1, op, c2) \
188 __sanitizer::u64 v1 = (u64)(c1); \
189 __sanitizer::u64 v2 = (u64)(c2); \
191 __sanitizer::CheckFailed(__FILE__, __LINE__, \
192 "(" #c1 ") " #op " (" #c2 ")", v1, v2); \
196 #define CHECK(a) CHECK_IMPL((a), !=, 0)
197 #define CHECK_EQ(a, b) CHECK_IMPL((a), ==, (b))
198 #define CHECK_NE(a, b) CHECK_IMPL((a), !=, (b))
199 #define CHECK_LT(a, b) CHECK_IMPL((a), <, (b))
200 #define CHECK_LE(a, b) CHECK_IMPL((a), <=, (b))
201 #define CHECK_GT(a, b) CHECK_IMPL((a), >, (b))
202 #define CHECK_GE(a, b) CHECK_IMPL((a), >=, (b))
205 #define DCHECK(a) CHECK(a)
206 #define DCHECK_EQ(a, b) CHECK_EQ(a, b)
207 #define DCHECK_NE(a, b) CHECK_NE(a, b)
208 #define DCHECK_LT(a, b) CHECK_LT(a, b)
209 #define DCHECK_LE(a, b) CHECK_LE(a, b)
210 #define DCHECK_GT(a, b) CHECK_GT(a, b)
211 #define DCHECK_GE(a, b) CHECK_GE(a, b)
214 #define DCHECK_EQ(a, b)
215 #define DCHECK_NE(a, b)
216 #define DCHECK_LT(a, b)
217 #define DCHECK_LE(a, b)
218 #define DCHECK_GT(a, b)
219 #define DCHECK_GE(a, b)
222 #define UNREACHABLE(msg) do { \
227 #define UNIMPLEMENTED() UNREACHABLE("unimplemented")
229 #define COMPILER_CHECK(pred) IMPL_COMPILER_ASSERT(pred, __LINE__)
231 #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
233 #define IMPL_PASTE(a, b) a##b
234 #define IMPL_COMPILER_ASSERT(pred, line) \
235 typedef char IMPL_PASTE(assertion_failed_##_, line)[2*(int)(pred)-1]
237 // Limits for integral types. We have to redefine it in case we don't
238 // have stdint.h (like in Visual Studio 9).
241 #if SANITIZER_WORDSIZE == 64
242 # define __INT64_C(c) c ## L
243 # define __UINT64_C(c) c ## UL
245 # define __INT64_C(c) c ## LL
246 # define __UINT64_C(c) c ## ULL
247 #endif // SANITIZER_WORDSIZE == 64
249 #define INT32_MIN (-2147483647-1)
251 #define INT32_MAX (2147483647)
253 #define UINT32_MAX (4294967295U)
255 #define INT64_MIN (-__INT64_C(9223372036854775807)-1)
257 #define INT64_MAX (__INT64_C(9223372036854775807))
259 #define UINT64_MAX (__UINT64_C(18446744073709551615))
261 enum LinkerInitialized
{ LINKER_INITIALIZED
= 0 };
263 #if !defined(_MSC_VER) || defined(__clang__)
264 # define GET_CALLER_PC() (uptr)__builtin_return_address(0)
265 # define GET_CURRENT_FRAME() (uptr)__builtin_frame_address(0)
267 extern "C" void* _ReturnAddress(void);
268 # pragma intrinsic(_ReturnAddress)
269 # define GET_CALLER_PC() (uptr)_ReturnAddress()
270 // CaptureStackBackTrace doesn't need to know BP on Windows.
271 // FIXME: This macro is still used when printing error reports though it's not
272 // clear if the BP value is needed in the ASan reports on Windows.
273 # define GET_CURRENT_FRAME() (uptr)0xDEADBEEF
276 #define HANDLE_EINTR(res, f) { \
279 } while (res == -1 && errno == EINTR); \
282 #endif // SANITIZER_DEFS_H