Botan
2.19.3
Crypto and TLS for C&
src
lib
utils
compiler.h
Go to the documentation of this file.
1
/*
2
* Define useful compiler-specific macros
3
* (C) 2016 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
/* This header is included in both C++ and C (via ffi.h) and should only
9
contain macro definitions. Avoid C++ style // comments in this file.
10
*/
11
12
#ifndef BOTAN_UTIL_COMPILER_FLAGS_H_
13
#define BOTAN_UTIL_COMPILER_FLAGS_H_
14
15
/* Should we use GCC-style inline assembler? */
16
#if defined(BOTAN_BUILD_COMPILER_IS_GCC) || \
17
defined(BOTAN_BUILD_COMPILER_IS_CLANG) || \
18
defined(BOTAN_BUILD_COMPILER_IS_XLC) || \
19
defined(BOTAN_BUILD_COMPILER_IS_SUN_STUDIO)
20
21
#define BOTAN_USE_GCC_INLINE_ASM
22
#endif
23
24
/**
25
* Used to annotate API exports which are public and supported.
26
* These APIs will not be broken/removed unless strictly required for
27
* functionality or security, and only in new major versions.
28
* @param maj The major version this public API was released in
29
* @param min The minor version this public API was released in
30
*/
31
#define BOTAN_PUBLIC_API(maj,min) BOTAN_DLL
32
33
/**
34
* Used to annotate API exports which are public, but are now deprecated
35
* and which will be removed in a future major release.
36
*/
37
#define BOTAN_DEPRECATED_API(msg) BOTAN_DLL BOTAN_DEPRECATED(msg)
38
39
/**
40
* Used to annotate API exports which are public and can be used by
41
* applications if needed, but which are intentionally not documented,
42
* and which may change incompatibly in a future major version.
43
*/
44
#define BOTAN_UNSTABLE_API BOTAN_DLL
45
46
/**
47
* Used to annotate API exports which are exported but only for the
48
* purposes of testing. They should not be used by applications and
49
* may be removed or changed without notice.
50
*/
51
#define BOTAN_TEST_API BOTAN_DLL
52
53
/*
54
* Define BOTAN_GCC_VERSION
55
*/
56
#if defined(__GNUC__) && !defined(__clang__)
57
#define BOTAN_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__)
58
#else
59
#define BOTAN_GCC_VERSION 0
60
#endif
61
62
/*
63
* Define BOTAN_CLANG_VERSION
64
*/
65
#if defined(__clang__)
66
#define BOTAN_CLANG_VERSION (__clang_major__ * 10 + __clang_minor__)
67
#else
68
#define BOTAN_CLANG_VERSION 0
69
#endif
70
71
/*
72
* Define BOTAN_FUNC_ISA
73
*/
74
#if (defined(__GNUC__) && !defined(__clang__)) || (BOTAN_CLANG_VERSION > 38)
75
#define BOTAN_FUNC_ISA(isa) __attribute__ ((target(isa)))
76
#else
77
#define BOTAN_FUNC_ISA(isa)
78
#endif
79
80
/*
81
* Define BOTAN_WARN_UNUSED_RESULT
82
*/
83
#if defined(__GNUC__) || defined(__clang__)
84
#define BOTAN_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result))
85
#else
86
#define BOTAN_WARN_UNUSED_RESULT
87
#endif
88
89
/*
90
* Define BOTAN_MALLOC_FN
91
*/
92
#if defined(__ibmxl__)
93
/* XLC pretends to be both Clang and GCC, but is neither */
94
#define BOTAN_MALLOC_FN __attribute__ ((malloc))
95
#elif defined(__GNUC__)
96
#define BOTAN_MALLOC_FN __attribute__ ((malloc, alloc_size(1,2)))
97
#elif defined(_MSC_VER)
98
#define BOTAN_MALLOC_FN __declspec(restrict)
99
#else
100
#define BOTAN_MALLOC_FN
101
#endif
102
103
/*
104
* Define BOTAN_DEPRECATED
105
*/
106
#if !defined(BOTAN_NO_DEPRECATED_WARNINGS) && !defined(BOTAN_IS_BEING_BUILT) && !defined(BOTAN_AMALGAMATION_H_)
107
108
#if defined(__clang__)
109
#define BOTAN_DEPRECATED(msg) __attribute__ ((deprecated(msg)))
110
#define BOTAN_DEPRECATED_HEADER(hdr) _Pragma("message \"this header is deprecated\"")
111
#define BOTAN_FUTURE_INTERNAL_HEADER(hdr) _Pragma("message \"this header will be made internal in the future\"")
112
113
#elif defined(_MSC_VER)
114
#define BOTAN_DEPRECATED(msg) __declspec(deprecated(msg))
115
#define BOTAN_DEPRECATED_HEADER(hdr) __pragma(message("this header is deprecated"))
116
#define BOTAN_FUTURE_INTERNAL_HEADER(hdr) __pragma(message("this header will be made internal in the future"))
117
118
#elif defined(__GNUC__)
119
/* msg supported since GCC 4.5, earliest we support is 4.8 */
120
#define BOTAN_DEPRECATED(msg) __attribute__ ((deprecated(msg)))
121
#define BOTAN_DEPRECATED_HEADER(hdr) _Pragma("GCC warning \"this header is deprecated\"")
122
#define BOTAN_FUTURE_INTERNAL_HEADER(hdr) _Pragma("GCC warning \"this header will be made internal in the future\"")
123
#endif
124
125
#endif
126
127
#if !defined(BOTAN_DEPRECATED)
128
#define BOTAN_DEPRECATED(msg)
129
#endif
130
131
#if !defined(BOTAN_DEPRECATED_HEADER)
132
#define BOTAN_DEPRECATED_HEADER(hdr)
133
#endif
134
135
#if !defined(BOTAN_FUTURE_INTERNAL_HEADER)
136
#define BOTAN_FUTURE_INTERNAL_HEADER(hdr)
137
#endif
138
139
/*
140
* Define BOTAN_NORETURN
141
*/
142
#if !defined(BOTAN_NORETURN)
143
144
#if defined (__clang__) || defined (__GNUC__)
145
#define BOTAN_NORETURN __attribute__ ((__noreturn__))
146
147
#elif defined (_MSC_VER)
148
#define BOTAN_NORETURN __declspec(noreturn)
149
150
#else
151
#define BOTAN_NORETURN
152
#endif
153
154
#endif
155
156
/*
157
* Define BOTAN_THREAD_LOCAL
158
*/
159
#if !defined(BOTAN_THREAD_LOCAL)
160
161
#if defined(BOTAN_TARGET_OS_HAS_THREADS) && defined(BOTAN_TARGET_OS_HAS_THREAD_LOCAL)
162
#define BOTAN_THREAD_LOCAL thread_local
163
#else
164
#define BOTAN_THREAD_LOCAL
/**/
165
#endif
166
167
#endif
168
169
/*
170
* Define BOTAN_IF_CONSTEXPR
171
*/
172
#if !defined(BOTAN_IF_CONSTEXPR)
173
#if __cplusplus >= 201703
174
#define BOTAN_IF_CONSTEXPR if constexpr
175
#else
176
#define BOTAN_IF_CONSTEXPR if
177
#endif
178
#endif
179
180
/*
181
* Define BOTAN_PARALLEL_FOR
182
*/
183
#if !defined(BOTAN_PARALLEL_FOR)
184
185
#if defined(BOTAN_TARGET_HAS_OPENMP)
186
#define BOTAN_PARALLEL_FOR _Pragma("omp parallel for") for
187
#else
188
#define BOTAN_PARALLEL_FOR for
189
#endif
190
191
#endif
192
193
/*
194
* Define BOTAN_FORCE_INLINE
195
*/
196
#if !defined(BOTAN_FORCE_INLINE)
197
198
#if defined (__clang__) || defined (__GNUC__)
199
#define BOTAN_FORCE_INLINE __attribute__ ((__always_inline__)) inline
200
201
#elif defined (_MSC_VER)
202
#define BOTAN_FORCE_INLINE __forceinline
203
204
#else
205
#define BOTAN_FORCE_INLINE inline
206
#endif
207
208
#endif
209
210
/*
211
* Define BOTAN_PARALLEL_SIMD_FOR
212
*/
213
#if !defined(BOTAN_PARALLEL_SIMD_FOR)
214
215
#if defined(BOTAN_TARGET_HAS_OPENMP)
216
#define BOTAN_PARALLEL_SIMD_FOR _Pragma("omp simd") for
217
#elif defined(BOTAN_BUILD_COMPILER_IS_GCC) && (BOTAN_GCC_VERSION >= 490)
218
#define BOTAN_PARALLEL_SIMD_FOR _Pragma("GCC ivdep") for
219
#else
220
#define BOTAN_PARALLEL_SIMD_FOR for
221
#endif
222
223
#endif
224
225
#endif
Generated by
1.9.8