Botan 2.19.2
Crypto and TLS for C&
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