Finally drop the 'static' from INLINE and ALWAYS_INLINE
[blocksruntime.git] / lib / sanitizer_common / sanitizer_internal_defs.h
blob6ee21f02fe179f7dc17ea38efd6d462ce81ecef1
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
16 #include "sanitizer_platform.h"
18 #if SANITIZER_WINDOWS
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
25 #else
26 # define SANITIZER_INTERFACE_ATTRIBUTE __attribute__((visibility("default")))
27 # define SANITIZER_WEAK_ATTRIBUTE __attribute__((weak))
28 #endif
30 #if SANITIZER_LINUX && !defined(SANITIZER_GO)
31 # define SANITIZER_SUPPORTS_WEAK_HOOKS 1
32 #else
33 # define SANITIZER_SUPPORTS_WEAK_HOOKS 0
34 #endif
36 // GCC does not understand __has_feature
37 #if !defined(__has_feature)
38 # define __has_feature(x) 0
39 #endif
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 {
46 #if defined(_WIN64)
47 // 64-bit Windows uses LLP64 data model.
48 typedef unsigned long long uptr; // NOLINT
49 typedef signed long long sptr; // NOLINT
50 #else
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
58 #else
59 typedef uptr uhwptr; // NOLINT
60 #endif
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
69 typedef int fd_t;
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__))
76 typedef u64 OFF_T;
77 #else
78 typedef uptr OFF_T;
79 #endif
80 typedef u64 OFF64_T;
81 } // namespace __sanitizer
83 extern "C" {
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
89 // stderr.
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;
104 } // extern "C"
107 using namespace __sanitizer; // NOLINT
108 // ----------- ATTENTION -------------
109 // This header should NOT include any other headers to avoid portability issues.
111 // Common defs.
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?
120 # define ALIAS(x)
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)
126 # define NOTHROW
127 # define LIKELY(x) (x)
128 # define UNLIKELY(x) (x)
129 # define UNUSED
130 # define USED
131 # define PREFETCH(x) /* _mm_prefetch(x, _MM_HINT_NTA) */
132 #else // _MSC_VER
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))
148 # else
149 # define PREFETCH(x) __builtin_prefetch(x)
150 # endif
151 #endif // _MSC_VER
153 #if SANITIZER_WINDOWS
154 typedef unsigned long DWORD; // NOLINT
155 typedef DWORD thread_return_t;
156 # define THREAD_CALLING_CONV __stdcall
157 #else // _WIN32
158 typedef void* thread_return_t;
159 # define THREAD_CALLING_CONV
160 #endif // _WIN32
161 typedef thread_return_t (THREAD_CALLING_CONV *thread_callback_t)(void* arg);
163 #if __LP64__ || defined(_WIN64)
164 # define SANITIZER_WORDSIZE 64
165 #else
166 # define SANITIZER_WORDSIZE 32
167 #endif
169 // NOTE: Functions below must be defined in each run-time.
170 namespace __sanitizer {
171 void NORETURN Die();
172 void NORETURN CheckFailed(const char *file, int line, const char *cond,
173 u64 v1, u64 v2);
174 } // namespace __sanitizer
176 // Check macro
177 #define RAW_CHECK_MSG(expr, msg) do { \
178 if (!(expr)) { \
179 RawWrite(msg); \
180 Die(); \
182 } while (0)
184 #define RAW_CHECK(expr) RAW_CHECK_MSG(expr, #expr)
186 #define CHECK_IMPL(c1, op, c2) \
187 do { \
188 __sanitizer::u64 v1 = (u64)(c1); \
189 __sanitizer::u64 v2 = (u64)(c2); \
190 if (!(v1 op v2)) \
191 __sanitizer::CheckFailed(__FILE__, __LINE__, \
192 "(" #c1 ") " #op " (" #c2 ")", v1, v2); \
193 } while (false) \
194 /**/
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))
204 #if TSAN_DEBUG
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)
212 #else
213 #define DCHECK(a)
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)
220 #endif
222 #define UNREACHABLE(msg) do { \
223 CHECK(0 && msg); \
224 Die(); \
225 } while (0)
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).
239 #undef __INT64_C
240 #undef __UINT64_C
241 #if SANITIZER_WORDSIZE == 64
242 # define __INT64_C(c) c ## L
243 # define __UINT64_C(c) c ## UL
244 #else
245 # define __INT64_C(c) c ## LL
246 # define __UINT64_C(c) c ## ULL
247 #endif // SANITIZER_WORDSIZE == 64
248 #undef INT32_MIN
249 #define INT32_MIN (-2147483647-1)
250 #undef INT32_MAX
251 #define INT32_MAX (2147483647)
252 #undef UINT32_MAX
253 #define UINT32_MAX (4294967295U)
254 #undef INT64_MIN
255 #define INT64_MIN (-__INT64_C(9223372036854775807)-1)
256 #undef INT64_MAX
257 #define INT64_MAX (__INT64_C(9223372036854775807))
258 #undef UINT64_MAX
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)
266 #else
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
274 #endif
276 #define HANDLE_EINTR(res, f) { \
277 do { \
278 res = (f); \
279 } while (res == -1 && errno == EINTR); \
282 #endif // SANITIZER_DEFS_H