]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===-- sanitizer_test_utils.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 a part of *Sanitizer runtime. | |
11 | // Common unit tests utilities. | |
12 | // | |
13 | //===----------------------------------------------------------------------===// | |
14 | ||
15 | #ifndef SANITIZER_TEST_UTILS_H | |
16 | #define SANITIZER_TEST_UTILS_H | |
17 | ||
18 | #if defined(_WIN32) | |
92a42be0 SL |
19 | // <windows.h> should always be the first include on Windows. |
20 | # include <windows.h> | |
21 | // MSVS headers define max/min as macros, so std::max/min gets crazy. | |
22 | # undef max | |
23 | # undef min | |
24 | #endif | |
25 | ||
26 | #if !defined(SANITIZER_EXTERNAL_TEST_CONFIG) | |
27 | # define INCLUDED_FROM_SANITIZER_TEST_UTILS_H | |
28 | # include "sanitizer_test_config.h" | |
29 | # undef INCLUDED_FROM_SANITIZER_TEST_UTILS_H | |
30 | #endif | |
31 | ||
32 | #include <stdint.h> | |
33 | ||
34 | #if defined(_MSC_VER) | |
1a4d82fc | 35 | # define NOINLINE __declspec(noinline) |
92a42be0 | 36 | #else // defined(_MSC_VER) |
1a4d82fc | 37 | # define NOINLINE __attribute__((noinline)) |
92a42be0 SL |
38 | #endif // defined(_MSC_VER) |
39 | ||
40 | #if !defined(_MSC_VER) || defined(__clang__) | |
41 | # define UNUSED __attribute__((unused)) | |
1a4d82fc | 42 | # define USED __attribute__((used)) |
92a42be0 SL |
43 | #else |
44 | # define UNUSED | |
45 | # define USED | |
46 | #endif | |
1a4d82fc JJ |
47 | |
48 | #if !defined(__has_feature) | |
49 | #define __has_feature(x) 0 | |
50 | #endif | |
51 | ||
52 | #ifndef ATTRIBUTE_NO_SANITIZE_ADDRESS | |
53 | # if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) | |
54 | # define ATTRIBUTE_NO_SANITIZE_ADDRESS \ | |
55 | __attribute__((no_sanitize_address)) | |
56 | # else | |
57 | # define ATTRIBUTE_NO_SANITIZE_ADDRESS | |
58 | # endif | |
59 | #endif // ATTRIBUTE_NO_SANITIZE_ADDRESS | |
60 | ||
61 | #if __LP64__ || defined(_WIN64) | |
62 | # define SANITIZER_WORDSIZE 64 | |
63 | #else | |
64 | # define SANITIZER_WORDSIZE 32 | |
65 | #endif | |
66 | ||
67 | // Make the compiler thinks that something is going on there. | |
68 | inline void break_optimization(void *arg) { | |
92a42be0 | 69 | #if !defined(_WIN32) || defined(__clang__) |
1a4d82fc | 70 | __asm__ __volatile__("" : : "r" (arg) : "memory"); |
92a42be0 | 71 | #endif |
1a4d82fc JJ |
72 | } |
73 | ||
74 | // This function returns its parameter but in such a way that compiler | |
75 | // can not prove it. | |
76 | template<class T> | |
77 | NOINLINE | |
78 | static T Ident(T t) { | |
79 | T ret = t; | |
80 | break_optimization(&ret); | |
81 | return ret; | |
82 | } | |
83 | ||
84 | // Simple stand-alone pseudorandom number generator. | |
85 | // Current algorithm is ANSI C linear congruential PRNG. | |
86 | static inline uint32_t my_rand_r(uint32_t* state) { | |
87 | return (*state = *state * 1103515245 + 12345) >> 16; | |
88 | } | |
89 | ||
90 | static uint32_t global_seed = 0; | |
91 | ||
92 | static inline uint32_t my_rand() { | |
93 | return my_rand_r(&global_seed); | |
94 | } | |
95 | ||
96 | // Set availability of platform-specific functions. | |
97 | ||
92a42be0 | 98 | #if !defined(__APPLE__) && !defined(__ANDROID__) && !defined(_WIN32) |
1a4d82fc JJ |
99 | # define SANITIZER_TEST_HAS_POSIX_MEMALIGN 1 |
100 | #else | |
101 | # define SANITIZER_TEST_HAS_POSIX_MEMALIGN 0 | |
102 | #endif | |
103 | ||
92a42be0 SL |
104 | #if !defined(__APPLE__) && !defined(__FreeBSD__) && \ |
105 | !defined(__ANDROID__) && !defined(_WIN32) | |
1a4d82fc JJ |
106 | # define SANITIZER_TEST_HAS_MEMALIGN 1 |
107 | # define SANITIZER_TEST_HAS_PVALLOC 1 | |
108 | # define SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE 1 | |
109 | #else | |
110 | # define SANITIZER_TEST_HAS_MEMALIGN 0 | |
111 | # define SANITIZER_TEST_HAS_PVALLOC 0 | |
112 | # define SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE 0 | |
113 | #endif | |
114 | ||
115 | #if !defined(__APPLE__) | |
116 | # define SANITIZER_TEST_HAS_STRNLEN 1 | |
117 | #else | |
118 | # define SANITIZER_TEST_HAS_STRNLEN 0 | |
119 | #endif | |
120 | ||
92a42be0 SL |
121 | #if defined(__FreeBSD__) |
122 | # define SANITIZER_TEST_HAS_PRINTF_L 1 | |
123 | #else | |
124 | # define SANITIZER_TEST_HAS_PRINTF_L 0 | |
125 | #endif | |
126 | ||
1a4d82fc | 127 | #endif // SANITIZER_TEST_UTILS_H |