• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The Marl Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef marl_sanitizers_h
16 #define marl_sanitizers_h
17 
18 // Define ADDRESS_SANITIZER_ENABLED to 1 if the project was built with the
19 // address sanitizer enabled (-fsanitize=address).
20 #if defined(__SANITIZE_ADDRESS__)
21 #define ADDRESS_SANITIZER_ENABLED 1
22 #else  // defined(__SANITIZE_ADDRESS__)
23 #if defined(__clang__)
24 #if __has_feature(address_sanitizer)
25 #define ADDRESS_SANITIZER_ENABLED 1
26 #endif  // __has_feature(address_sanitizer)
27 #endif  // defined(__clang__)
28 #endif  // defined(__SANITIZE_ADDRESS__)
29 
30 // ADDRESS_SANITIZER_ONLY(X) resolves to X if ADDRESS_SANITIZER_ENABLED is
31 // defined to a non-zero value, otherwise ADDRESS_SANITIZER_ONLY() is stripped
32 // by the preprocessor.
33 #if ADDRESS_SANITIZER_ENABLED
34 #define ADDRESS_SANITIZER_ONLY(x) x
35 #else
36 #define ADDRESS_SANITIZER_ONLY(x)
37 #endif  // ADDRESS_SANITIZER_ENABLED
38 
39 // Define MEMORY_SANITIZER_ENABLED to 1 if the project was built with the memory
40 // sanitizer enabled (-fsanitize=memory).
41 #if defined(__SANITIZE_MEMORY__)
42 #define MEMORY_SANITIZER_ENABLED 1
43 #else  // defined(__SANITIZE_MEMORY__)
44 #if defined(__clang__)
45 #if __has_feature(memory_sanitizer)
46 #define MEMORY_SANITIZER_ENABLED 1
47 #endif  // __has_feature(memory_sanitizer)
48 #endif  // defined(__clang__)
49 #endif  // defined(__SANITIZE_MEMORY__)
50 
51 // MEMORY_SANITIZER_ONLY(X) resolves to X if MEMORY_SANITIZER_ENABLED is defined
52 // to a non-zero value, otherwise MEMORY_SANITIZER_ONLY() is stripped by the
53 // preprocessor.
54 #if MEMORY_SANITIZER_ENABLED
55 #define MEMORY_SANITIZER_ONLY(x) x
56 #else
57 #define MEMORY_SANITIZER_ONLY(x)
58 #endif  // MEMORY_SANITIZER_ENABLED
59 
60 // Define THREAD_SANITIZER_ENABLED to 1 if the project was built with the thread
61 // sanitizer enabled (-fsanitize=thread).
62 #if defined(__SANITIZE_THREAD__)
63 #define THREAD_SANITIZER_ENABLED 1
64 #else  // defined(__SANITIZE_THREAD__)
65 #if defined(__clang__)
66 #if __has_feature(thread_sanitizer)
67 #define THREAD_SANITIZER_ENABLED 1
68 #endif  // __has_feature(thread_sanitizer)
69 #endif  // defined(__clang__)
70 #endif  // defined(__SANITIZE_THREAD__)
71 
72 // THREAD_SANITIZER_ONLY(X) resolves to X if THREAD_SANITIZER_ENABLED is defined
73 // to a non-zero value, otherwise THREAD_SANITIZER_ONLY() is stripped by the
74 // preprocessor.
75 #if THREAD_SANITIZER_ENABLED
76 #define THREAD_SANITIZER_ONLY(x) x
77 #else
78 #define THREAD_SANITIZER_ONLY(x)
79 #endif  // THREAD_SANITIZER_ENABLED
80 
81 #endif  // marl_sanitizers_h
82