1 | /* |
2 | Copyright (c) 2005-2019 Intel Corporation |
3 | |
4 | Licensed under the Apache License, Version 2.0 (the "License"); |
5 | you may not use this file except in compliance with the License. |
6 | You may obtain a copy of the License at |
7 | |
8 | http://www.apache.org/licenses/LICENSE-2.0 |
9 | |
10 | Unless required by applicable law or agreed to in writing, software |
11 | distributed under the License is distributed on an "AS IS" BASIS, |
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | See the License for the specific language governing permissions and |
14 | limitations under the License. |
15 | */ |
16 | |
17 | #ifndef __TBB_tbb_config_H |
18 | #define __TBB_tbb_config_H |
19 | |
20 | /** This header is supposed to contain macro definitions and C style comments only. |
21 | The macros defined here are intended to control such aspects of TBB build as |
22 | - presence of compiler features |
23 | - compilation modes |
24 | - feature sets |
25 | - known compiler/platform issues |
26 | **/ |
27 | |
28 | /* This macro marks incomplete code or comments describing ideas which are considered for the future. |
29 | * See also for plain comment with TODO and FIXME marks for small improvement opportunities. |
30 | */ |
31 | #define __TBB_TODO 0 |
32 | |
33 | /* Check which standard library we use. */ |
34 | /* __TBB_SYMBOL is defined only while processing exported symbols list where C++ is not allowed. */ |
35 | #if !defined(__TBB_SYMBOL) && !__TBB_CONFIG_PREPROC_ONLY |
36 | #include <cstddef> |
37 | #endif |
38 | |
39 | // Note that when ICC or Clang is in use, __TBB_GCC_VERSION might not fully match |
40 | // the actual GCC version on the system. |
41 | #define __TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) |
42 | |
43 | // Prior to GCC 7, GNU libstdc++ did not have a convenient version macro. |
44 | // Therefore we use different ways to detect its version. |
45 | #ifdef TBB_USE_GLIBCXX_VERSION |
46 | // The version is explicitly specified in our public TBB_USE_GLIBCXX_VERSION macro. |
47 | // Its format should match the __TBB_GCC_VERSION above, e.g. 70301 for libstdc++ coming with GCC 7.3.1. |
48 | #define __TBB_GLIBCXX_VERSION TBB_USE_GLIBCXX_VERSION |
49 | #elif _GLIBCXX_RELEASE && _GLIBCXX_RELEASE != __GNUC__ |
50 | // Reported versions of GCC and libstdc++ do not match; trust the latter |
51 | #define __TBB_GLIBCXX_VERSION (_GLIBCXX_RELEASE*10000) |
52 | #elif __GLIBCPP__ || __GLIBCXX__ |
53 | // The version macro is not defined or matches the GCC version; use __TBB_GCC_VERSION |
54 | #define __TBB_GLIBCXX_VERSION __TBB_GCC_VERSION |
55 | #endif |
56 | |
57 | #if __clang__ |
58 | // according to clang documentation, version can be vendor specific |
59 | #define __TBB_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) |
60 | #endif |
61 | |
62 | /** Target OS is either iOS* or iOS* simulator **/ |
63 | #if __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ |
64 | #define __TBB_IOS 1 |
65 | #endif |
66 | |
67 | #if __APPLE__ |
68 | #if __INTEL_COMPILER && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1099 \ |
69 | && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101000 |
70 | // ICC does not correctly set the macro if -mmacosx-min-version is not specified |
71 | #define __TBB_MACOS_TARGET_VERSION (100000 + 10*(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 1000)) |
72 | #else |
73 | #define __TBB_MACOS_TARGET_VERSION __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ |
74 | #endif |
75 | #endif |
76 | |
77 | /** Preprocessor symbols to determine HW architecture **/ |
78 | |
79 | #if _WIN32||_WIN64 |
80 | # if defined(_M_X64)||defined(__x86_64__) // the latter for MinGW support |
81 | # define __TBB_x86_64 1 |
82 | # elif defined(_M_IA64) |
83 | # define __TBB_ipf 1 |
84 | # elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support |
85 | # define __TBB_x86_32 1 |
86 | # else |
87 | # define __TBB_generic_arch 1 |
88 | # endif |
89 | #else /* Assume generic Unix */ |
90 | # if !__linux__ && !__APPLE__ |
91 | # define __TBB_generic_os 1 |
92 | # endif |
93 | # if __TBB_IOS |
94 | # define __TBB_generic_arch 1 |
95 | # elif __x86_64__ |
96 | # define __TBB_x86_64 1 |
97 | # elif __ia64__ |
98 | # define __TBB_ipf 1 |
99 | # elif __i386__||__i386 // __i386 is for Sun OS |
100 | # define __TBB_x86_32 1 |
101 | # else |
102 | # define __TBB_generic_arch 1 |
103 | # endif |
104 | #endif |
105 | |
106 | #if __MIC__ || __MIC2__ |
107 | #define __TBB_DEFINE_MIC 1 |
108 | #endif |
109 | |
110 | #define __TBB_TSX_AVAILABLE ((__TBB_x86_32 || __TBB_x86_64) && !__TBB_DEFINE_MIC) |
111 | |
112 | /** Presence of compiler features **/ |
113 | |
114 | #if __INTEL_COMPILER == 9999 && __INTEL_COMPILER_BUILD_DATE == 20110811 |
115 | /* Intel(R) Composer XE 2011 Update 6 incorrectly sets __INTEL_COMPILER. Fix it. */ |
116 | #undef __INTEL_COMPILER |
117 | #define __INTEL_COMPILER 1210 |
118 | #endif |
119 | |
120 | #if __clang__ && !__INTEL_COMPILER |
121 | #define __TBB_USE_OPTIONAL_RTTI __has_feature(cxx_rtti) |
122 | #elif defined(_CPPRTTI) |
123 | #define __TBB_USE_OPTIONAL_RTTI 1 |
124 | #else |
125 | #define __TBB_USE_OPTIONAL_RTTI (__GXX_RTTI || __RTTI || __INTEL_RTTI__) |
126 | #endif |
127 | |
128 | #if __TBB_GCC_VERSION >= 40400 && !defined(__INTEL_COMPILER) |
129 | /** warning suppression pragmas available in GCC since 4.4 **/ |
130 | #define __TBB_GCC_WARNING_SUPPRESSION_PRESENT 1 |
131 | #endif |
132 | |
133 | /* Select particular features of C++11 based on compiler version. |
134 | ICC 12.1 (Linux*), GCC 4.3 and higher, clang 2.9 and higher |
135 | set __GXX_EXPERIMENTAL_CXX0X__ in c++11 mode. |
136 | |
137 | Compilers that mimics other compilers (ICC, clang) must be processed before |
138 | compilers they mimic (GCC, MSVC). |
139 | |
140 | TODO: The following conditions should be extended when new compilers/runtimes |
141 | support added. |
142 | */ |
143 | |
144 | /** |
145 | __TBB_CPP11_PRESENT macro indicates that the compiler supports vast majority of C++11 features. |
146 | Depending on the compiler, some features might still be unsupported or work incorrectly. |
147 | Use it when enabling C++11 features individually is not practical, and be aware that |
148 | some "good enough" compilers might be excluded. **/ |
149 | #define __TBB_CPP11_PRESENT (__cplusplus >= 201103L || _MSC_VER >= 1900) |
150 | |
151 | #define __TBB_CPP17_FALLTHROUGH_PRESENT (__cplusplus >= 201703L) |
152 | #define __TBB_FALLTHROUGH_PRESENT (__TBB_GCC_VERSION >= 70000 && !__INTEL_COMPILER) |
153 | |
154 | /** C++11 mode detection macros for Intel(R) C++ Compiler (enabled by -std=c++XY option): |
155 | __INTEL_CXX11_MODE__ for version >=13.0 (not available for ICC 15.0 if -std=c++14 is used), |
156 | __STDC_HOSTED__ for version >=12.0 (useful only on Windows), |
157 | __GXX_EXPERIMENTAL_CXX0X__ for version >=12.0 on Linux and macOS. **/ |
158 | #if __INTEL_COMPILER && !__INTEL_CXX11_MODE__ |
159 | // __INTEL_CXX11_MODE__ is not set, try to deduce it |
160 | #define __INTEL_CXX11_MODE__ (__GXX_EXPERIMENTAL_CXX0X__ || (_MSC_VER && __STDC_HOSTED__)) |
161 | #endif |
162 | |
163 | #if __INTEL_COMPILER && (!_MSC_VER || __INTEL_CXX11_MODE__) |
164 | // On Windows, C++11 features supported by Visual Studio 2010 and higher are enabled by default, |
165 | // so in absence of /Qstd= use MSVC branch for feature detection. |
166 | // On other platforms, no -std= means C++03. |
167 | |
168 | #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT (__INTEL_CXX11_MODE__ && __VARIADIC_TEMPLATES) |
169 | // Both r-value reference support in compiler and std::move/std::forward |
170 | // presence in C++ standard library is checked. |
171 | #define __TBB_CPP11_RVALUE_REF_PRESENT ((_MSC_VER >= 1700 || __GXX_EXPERIMENTAL_CXX0X__ && (__TBB_GLIBCXX_VERSION >= 40500 || _LIBCPP_VERSION)) && __INTEL_COMPILER >= 1400) |
172 | #define __TBB_IMPLICIT_MOVE_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400 && (_MSC_VER >= 1900 || __TBB_GCC_VERSION >= 40600 || __clang__)) |
173 | #if _MSC_VER >= 1600 |
174 | #define __TBB_EXCEPTION_PTR_PRESENT ( __INTEL_COMPILER > 1300 \ |
175 | /*ICC 12.1 Upd 10 and 13 beta Upd 2 fixed exception_ptr linking issue*/ \ |
176 | || (__INTEL_COMPILER == 1300 && __INTEL_COMPILER_BUILD_DATE >= 20120530) \ |
177 | || (__INTEL_COMPILER == 1210 && __INTEL_COMPILER_BUILD_DATE >= 20120410) ) |
178 | /** libstdc++ that comes with GCC 4.6 use C++11 features not supported by ICC 12.1. |
179 | * Because of that ICC 12.1 does not support C++11 mode with gcc 4.6 (or higher), |
180 | * and therefore does not define __GXX_EXPERIMENTAL_CXX0X__ macro **/ |
181 | #elif __TBB_GLIBCXX_VERSION >= 40404 && __TBB_GLIBCXX_VERSION < 40600 |
182 | #define __TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1200) |
183 | #elif __TBB_GLIBCXX_VERSION >= 40600 |
184 | #define __TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1300) |
185 | #elif _LIBCPP_VERSION |
186 | #define __TBB_EXCEPTION_PTR_PRESENT __GXX_EXPERIMENTAL_CXX0X__ |
187 | #else |
188 | #define __TBB_EXCEPTION_PTR_PRESENT 0 |
189 | #endif |
190 | #define __TBB_STATIC_ASSERT_PRESENT (__INTEL_CXX11_MODE__ || _MSC_VER >= 1600) |
191 | #define __TBB_CPP11_TUPLE_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__TBB_GLIBCXX_VERSION >= 40300 || _LIBCPP_VERSION)) |
192 | #define __TBB_INITIALIZER_LISTS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400 && (_MSC_VER >= 1800 || __TBB_GLIBCXX_VERSION >= 40400 || _LIBCPP_VERSION)) |
193 | #define __TBB_CONSTEXPR_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400) |
194 | #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200) |
195 | /** ICC seems to disable support of noexcept event in c++11 when compiling in compatibility mode for gcc <4.6 **/ |
196 | #define __TBB_NOEXCEPT_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1300 && (__TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION || _MSC_VER)) |
197 | #define __TBB_CPP11_STD_BEGIN_END_PRESENT (_MSC_VER >= 1700 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1310 && (__TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION)) |
198 | #define __TBB_CPP11_AUTO_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) |
199 | #define __TBB_CPP11_DECLTYPE_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) |
200 | #define __TBB_CPP11_LAMBDAS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200) |
201 | #define __TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (_MSC_VER >= 1800 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) |
202 | #define __TBB_OVERRIDE_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400) |
203 | #define __TBB_ALIGNAS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1500) |
204 | #define __TBB_CPP11_TEMPLATE_ALIASES_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1210) |
205 | #define __TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) |
206 | #define __TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L) |
207 | #define __TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__INTEL_COMPILER > 1910) // a future version |
208 | #define __TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L) |
209 | #elif __clang__ |
210 | /** TODO: these options need to be rechecked **/ |
211 | #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __has_feature(__cxx_variadic_templates__) |
212 | #define __TBB_CPP11_RVALUE_REF_PRESENT (__has_feature(__cxx_rvalue_references__) && (_LIBCPP_VERSION || __TBB_GLIBCXX_VERSION >= 40500)) |
213 | #define __TBB_IMPLICIT_MOVE_PRESENT __has_feature(cxx_implicit_moves) |
214 | /** TODO: extend exception_ptr related conditions to cover libstdc++ **/ |
215 | #define __TBB_EXCEPTION_PTR_PRESENT (__cplusplus >= 201103L && (_LIBCPP_VERSION || __TBB_GLIBCXX_VERSION >= 40600)) |
216 | #define __TBB_STATIC_ASSERT_PRESENT __has_feature(__cxx_static_assert__) |
217 | /**Clang (preprocessor) has problems with dealing with expression having __has_include in #ifs |
218 | * used inside C++ code. (At least version that comes with OS X 10.8 : Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)) **/ |
219 | #if (__GXX_EXPERIMENTAL_CXX0X__ && __has_include(<tuple>)) |
220 | #define __TBB_CPP11_TUPLE_PRESENT 1 |
221 | #endif |
222 | #if (__has_feature(__cxx_generalized_initializers__) && __has_include(<initializer_list>)) |
223 | #define __TBB_INITIALIZER_LISTS_PRESENT 1 |
224 | #endif |
225 | #define __TBB_CONSTEXPR_PRESENT __has_feature(__cxx_constexpr__) |
226 | #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__has_feature(__cxx_defaulted_functions__) && __has_feature(__cxx_deleted_functions__)) |
227 | /**For some unknown reason __has_feature(__cxx_noexcept) does not yield true for all cases. Compiler bug ? **/ |
228 | #define __TBB_NOEXCEPT_PRESENT (__cplusplus >= 201103L) |
229 | #define __TBB_CPP11_STD_BEGIN_END_PRESENT (__has_feature(__cxx_range_for__) && (_LIBCPP_VERSION || __TBB_GLIBCXX_VERSION >= 40600)) |
230 | #define __TBB_CPP11_AUTO_PRESENT __has_feature(__cxx_auto_type__) |
231 | #define __TBB_CPP11_DECLTYPE_PRESENT __has_feature(__cxx_decltype__) |
232 | #define __TBB_CPP11_LAMBDAS_PRESENT __has_feature(cxx_lambdas) |
233 | #define __TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT __has_feature(cxx_default_function_template_args) |
234 | #define __TBB_OVERRIDE_PRESENT __has_feature(cxx_override_control) |
235 | #define __TBB_ALIGNAS_PRESENT __has_feature(cxx_alignas) |
236 | #define __TBB_CPP11_TEMPLATE_ALIASES_PRESENT __has_feature(cxx_alias_templates) |
237 | #define __TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) |
238 | #define __TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__has_feature(cxx_variable_templates)) |
239 | #define __TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__has_feature(__cpp_deduction_guides)) |
240 | #define __TBB_CPP17_INVOKE_RESULT_PRESENT (__has_feature(__cpp_lib_is_invocable)) |
241 | #elif __GNUC__ |
242 | #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__ |
243 | #define __TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40700) |
244 | #define __TBB_CPP11_RVALUE_REF_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40500) |
245 | #define __TBB_IMPLICIT_MOVE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40600) |
246 | /** __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 here is a substitution for _GLIBCXX_ATOMIC_BUILTINS_4, which is a prerequisite |
247 | for exception_ptr but cannot be used in this file because it is defined in a header, not by the compiler. |
248 | If the compiler has no atomic intrinsics, the C++ library should not expect those as well. **/ |
249 | #define __TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40404 && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) |
250 | #define __TBB_STATIC_ASSERT_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40300) |
251 | #define __TBB_CPP11_TUPLE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40300) |
252 | #define __TBB_INITIALIZER_LISTS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400) |
253 | /** gcc seems have to support constexpr from 4.4 but tests in (test_atomic) seeming reasonable fail to compile prior 4.6**/ |
254 | #define __TBB_CONSTEXPR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400) |
255 | #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400) |
256 | #define __TBB_NOEXCEPT_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40600) |
257 | #define __TBB_CPP11_STD_BEGIN_END_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40600) |
258 | #define __TBB_CPP11_AUTO_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400) |
259 | #define __TBB_CPP11_DECLTYPE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400) |
260 | #define __TBB_CPP11_LAMBDAS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40500) |
261 | #define __TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40300) |
262 | #define __TBB_OVERRIDE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40700) |
263 | #define __TBB_ALIGNAS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40800) |
264 | #define __TBB_CPP11_TEMPLATE_ALIASES_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40700) |
265 | #define __TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L && __TBB_GCC_VERSION >= 50000) |
266 | #define __TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L && __TBB_GCC_VERSION >= 50000) |
267 | #define __TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__cpp_deduction_guides >= 201606L) |
268 | #define __TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L && __TBB_GCC_VERSION >= 70000) |
269 | #elif _MSC_VER |
270 | // These definitions are also used with Intel C++ Compiler in "default" mode (__INTEL_CXX11_MODE__ == 0); |
271 | // see a comment in "__INTEL_COMPILER" section above. |
272 | |
273 | #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT (_MSC_VER >= 1800) |
274 | // Contains a workaround for ICC 13 |
275 | #define __TBB_CPP11_RVALUE_REF_PRESENT (_MSC_VER >= 1700 && (!__INTEL_COMPILER || __INTEL_COMPILER >= 1400)) |
276 | #define __TBB_IMPLICIT_MOVE_PRESENT (_MSC_VER >= 1900) |
277 | #define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600) |
278 | #define __TBB_STATIC_ASSERT_PRESENT (_MSC_VER >= 1600) |
279 | #define __TBB_CPP11_TUPLE_PRESENT (_MSC_VER >= 1600) |
280 | #define __TBB_INITIALIZER_LISTS_PRESENT (_MSC_VER >= 1800) |
281 | #define __TBB_CONSTEXPR_PRESENT (_MSC_VER >= 1900) |
282 | #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (_MSC_VER >= 1800) |
283 | #define __TBB_NOEXCEPT_PRESENT (_MSC_VER >= 1900) |
284 | #define __TBB_CPP11_STD_BEGIN_END_PRESENT (_MSC_VER >= 1700) |
285 | #define __TBB_CPP11_AUTO_PRESENT (_MSC_VER >= 1600) |
286 | #define __TBB_CPP11_DECLTYPE_PRESENT (_MSC_VER >= 1600) |
287 | #define __TBB_CPP11_LAMBDAS_PRESENT (_MSC_VER >= 1600) |
288 | #define __TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (_MSC_VER >= 1800) |
289 | #define __TBB_OVERRIDE_PRESENT (_MSC_VER >= 1700) |
290 | #define __TBB_ALIGNAS_PRESENT (_MSC_VER >= 1900) |
291 | #define __TBB_CPP11_TEMPLATE_ALIASES_PRESENT (_MSC_VER >= 1800) |
292 | #define __TBB_CPP14_INTEGER_SEQUENCE_PRESENT (_MSC_VER >= 1900) |
293 | /* Variable templates are supported in VS2015 Update 2 or later */ |
294 | #define __TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (_MSC_FULL_VER >= 190023918 && (!__INTEL_COMPILER || __INTEL_COMPILER >= 1700)) |
295 | #define __TBB_CPP17_DEDUCTION_GUIDES_PRESENT (_MSVC_LANG >= 201703L && _MSC_VER >= 1914) |
296 | #define __TBB_CPP17_INVOKE_RESULT_PRESENT (_MSVC_LANG >= 201703L && _MSC_VER >= 1911) |
297 | #else |
298 | #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __TBB_CPP11_PRESENT |
299 | #define __TBB_CPP11_RVALUE_REF_PRESENT __TBB_CPP11_PRESENT |
300 | #define __TBB_IMPLICIT_MOVE_PRESENT __TBB_CPP11_PRESENT |
301 | #define __TBB_EXCEPTION_PTR_PRESENT __TBB_CPP11_PRESENT |
302 | #define __TBB_STATIC_ASSERT_PRESENT __TBB_CPP11_PRESENT |
303 | #define __TBB_CPP11_TUPLE_PRESENT __TBB_CPP11_PRESENT |
304 | #define __TBB_INITIALIZER_LISTS_PRESENT __TBB_CPP11_PRESENT |
305 | #define __TBB_CONSTEXPR_PRESENT __TBB_CPP11_PRESENT |
306 | #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT __TBB_CPP11_PRESENT |
307 | #define __TBB_NOEXCEPT_PRESENT __TBB_CPP11_PRESENT |
308 | #define __TBB_CPP11_STD_BEGIN_END_PRESENT __TBB_CPP11_PRESENT |
309 | #define __TBB_CPP11_AUTO_PRESENT __TBB_CPP11_PRESENT |
310 | #define __TBB_CPP11_DECLTYPE_PRESENT __TBB_CPP11_PRESENT |
311 | #define __TBB_CPP11_LAMBDAS_PRESENT __TBB_CPP11_PRESENT |
312 | #define __TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT __TBB_CPP11_PRESENT |
313 | #define __TBB_OVERRIDE_PRESENT __TBB_CPP11_PRESENT |
314 | #define __TBB_ALIGNAS_PRESENT __TBB_CPP11_PRESENT |
315 | #define __TBB_CPP11_TEMPLATE_ALIASES_PRESENT __TBB_CPP11_PRESENT |
316 | #define __TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) |
317 | #define __TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L) |
318 | #define __TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__cplusplus >= 201703L) |
319 | #define __TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L) |
320 | #endif |
321 | |
322 | // C++11 standard library features |
323 | |
324 | #define __TBB_CPP11_ARRAY_PRESENT (_MSC_VER >= 1700 || _LIBCPP_VERSION || __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GLIBCXX_VERSION >= 40300) |
325 | |
326 | #ifndef __TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT |
327 | #define __TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT |
328 | #endif |
329 | #define __TBB_CPP11_VARIADIC_TUPLE_PRESENT (!_MSC_VER || _MSC_VER >= 1800) |
330 | |
331 | #define __TBB_CPP11_TYPE_PROPERTIES_PRESENT (_LIBCPP_VERSION || _MSC_VER >= 1700 || (__TBB_GLIBCXX_VERSION >= 50000 && __GXX_EXPERIMENTAL_CXX0X__)) |
332 | #define __TBB_TR1_TYPE_PROPERTIES_IN_STD_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GLIBCXX_VERSION >= 40300 || _MSC_VER >= 1600) |
333 | // GCC supported some of type properties since 4.7 |
334 | #define __TBB_CPP11_IS_COPY_CONSTRUCTIBLE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GLIBCXX_VERSION >= 40700 || __TBB_CPP11_TYPE_PROPERTIES_PRESENT) |
335 | |
336 | // In GCC, std::move_if_noexcept appeared later than noexcept |
337 | #define __TBB_MOVE_IF_NOEXCEPT_PRESENT (__TBB_NOEXCEPT_PRESENT && (__TBB_GLIBCXX_VERSION >= 40700 || _MSC_VER >= 1900 || _LIBCPP_VERSION)) |
338 | #define __TBB_ALLOCATOR_TRAITS_PRESENT (__cplusplus >= 201103L && _LIBCPP_VERSION || _MSC_VER >= 1800 || \ |
339 | __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GLIBCXX_VERSION >= 40700 && !(__TBB_GLIBCXX_VERSION == 40700 && __TBB_DEFINE_MIC)) |
340 | #define __TBB_MAKE_EXCEPTION_PTR_PRESENT (__TBB_EXCEPTION_PTR_PRESENT && (_MSC_VER >= 1700 || __TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION || __SUNPRO_CC)) |
341 | |
342 | // Due to libc++ limitations in C++03 mode, do not pass rvalues to std::make_shared() |
343 | #define __TBB_CPP11_SMART_POINTERS_PRESENT ( _MSC_VER >= 1600 || _LIBCPP_VERSION \ |
344 | || ((__cplusplus >= 201103L || __GXX_EXPERIMENTAL_CXX0X__) \ |
345 | && (__TBB_GLIBCXX_VERSION >= 40500 || __TBB_GLIBCXX_VERSION >= 40400 && __TBB_USE_OPTIONAL_RTTI)) ) |
346 | |
347 | #define __TBB_CPP11_FUTURE_PRESENT (_MSC_VER >= 1700 || __TBB_GLIBCXX_VERSION >= 40600 && __GXX_EXPERIMENTAL_CXX0X__ || _LIBCPP_VERSION) |
348 | |
349 | #define __TBB_CPP11_GET_NEW_HANDLER_PRESENT (_MSC_VER >= 1900 || __TBB_GLIBCXX_VERSION >= 40900 && __GXX_EXPERIMENTAL_CXX0X__ || _LIBCPP_VERSION) |
350 | |
351 | #define __TBB_CPP17_UNCAUGHT_EXCEPTIONS_PRESENT (_MSC_VER >= 1900 || __GLIBCXX__ && __cpp_lib_uncaught_exceptions \ |
352 | || _LIBCPP_VERSION >= 3700 && (!__TBB_MACOS_TARGET_VERSION || __TBB_MACOS_TARGET_VERSION >= 101200)) |
353 | // TODO: wait when memory_resource will be fully supported in clang and define the right macro |
354 | // Currently it is in experimental stage since 6 version. |
355 | #define __TBB_CPP17_MEMORY_RESOURCE_PRESENT (_MSC_VER >= 1913 && (_MSVC_LANG > 201402L || __cplusplus > 201402L) || \ |
356 | __GLIBCXX__ && __cpp_lib_memory_resource >= 201603) |
357 | #define __TBB_CPP17_HW_INTERFERENCE_SIZE_PRESENT (_MSC_VER >= 1911) |
358 | // std::swap is in <utility> only since C++11, though MSVC had it at least since VS2005 |
359 | #if _MSC_VER>=1400 || _LIBCPP_VERSION || __GXX_EXPERIMENTAL_CXX0X__ |
360 | #define <utility> |
361 | #else |
362 | #define __TBB_STD_SWAP_HEADER <algorithm> |
363 | #endif |
364 | |
365 | //TODO: not clear how exactly this macro affects exception_ptr - investigate |
366 | // On linux ICC fails to find existing std::exception_ptr in libstdc++ without this define |
367 | #if __INTEL_COMPILER && __GNUC__ && __TBB_EXCEPTION_PTR_PRESENT && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) |
368 | #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 |
369 | #endif |
370 | |
371 | // Work around a bug in MinGW32 |
372 | #if __MINGW32__ && __TBB_EXCEPTION_PTR_PRESENT && !defined(_GLIBCXX_ATOMIC_BUILTINS_4) |
373 | #define _GLIBCXX_ATOMIC_BUILTINS_4 |
374 | #endif |
375 | |
376 | #if __GNUC__ || __SUNPRO_CC || __IBMCPP__ |
377 | /* ICC defines __GNUC__ and so is covered */ |
378 | #define __TBB_ATTRIBUTE_ALIGNED_PRESENT 1 |
379 | #elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER) |
380 | #define __TBB_DECLSPEC_ALIGN_PRESENT 1 |
381 | #endif |
382 | |
383 | /* Actually ICC supports gcc __sync_* intrinsics starting 11.1, |
384 | * but 64 bit support for 32 bit target comes in later ones*/ |
385 | /* TODO: change the version back to 4.1.2 once macro __TBB_WORD_SIZE become optional */ |
386 | /* Assumed that all clang versions have these gcc compatible intrinsics. */ |
387 | #if __TBB_GCC_VERSION >= 40306 || __INTEL_COMPILER >= 1200 || __clang__ |
388 | /** built-in atomics available in GCC since 4.1.2 **/ |
389 | #define __TBB_GCC_BUILTIN_ATOMICS_PRESENT 1 |
390 | #endif |
391 | |
392 | #if __TBB_GCC_VERSION >= 70000 && !__INTEL_COMPILER && !__clang__ |
393 | // After GCC7 there was possible reordering problem in generic atomic load/store operations. |
394 | // So always using builtins. |
395 | #define TBB_USE_GCC_BUILTINS 1 |
396 | #endif |
397 | |
398 | #if __INTEL_COMPILER >= 1200 |
399 | /** built-in C++11 style atomics available in ICC since 12.0 **/ |
400 | #define __TBB_ICC_BUILTIN_ATOMICS_PRESENT 1 |
401 | #endif |
402 | |
403 | #if _MSC_VER>=1600 && (!__INTEL_COMPILER || __INTEL_COMPILER>=1310) |
404 | #define __TBB_MSVC_PART_WORD_INTERLOCKED_INTRINSICS_PRESENT 1 |
405 | #endif |
406 | |
407 | #define __TBB_TSX_INTRINSICS_PRESENT ((__RTM__ || _MSC_VER>=1700 || __INTEL_COMPILER>=1300) && !__TBB_DEFINE_MIC && !__ANDROID__) |
408 | |
409 | /** Macro helpers **/ |
410 | #define __TBB_CONCAT_AUX(A,B) A##B |
411 | // The additional level of indirection is needed to expand macros A and B (not to get the AB macro). |
412 | // See [cpp.subst] and [cpp.concat] for more details. |
413 | #define __TBB_CONCAT(A,B) __TBB_CONCAT_AUX(A,B) |
414 | // The IGNORED argument and comma are needed to always have 2 arguments (even when A is empty). |
415 | #define __TBB_IS_MACRO_EMPTY(A,IGNORED) __TBB_CONCAT_AUX(__TBB_MACRO_EMPTY,A) |
416 | #define __TBB_MACRO_EMPTY 1 |
417 | |
418 | /** User controlled TBB features & modes **/ |
419 | #ifndef TBB_USE_DEBUG |
420 | /* |
421 | There are four cases that are supported: |
422 | 1. "_DEBUG is undefined" means "no debug"; |
423 | 2. "_DEBUG defined to something that is evaluated to 0" (including "garbage", as per [cpp.cond]) means "no debug"; |
424 | 3. "_DEBUG defined to something that is evaluated to a non-zero value" means "debug"; |
425 | 4. "_DEBUG defined to nothing (empty)" means "debug". |
426 | */ |
427 | #ifdef _DEBUG |
428 | // Check if _DEBUG is empty. |
429 | #define __TBB_IS__DEBUG_EMPTY (__TBB_IS_MACRO_EMPTY(_DEBUG,IGNORED)==__TBB_MACRO_EMPTY) |
430 | #if __TBB_IS__DEBUG_EMPTY |
431 | #define TBB_USE_DEBUG 1 |
432 | #else |
433 | #define TBB_USE_DEBUG _DEBUG |
434 | #endif /* __TBB_IS__DEBUG_EMPTY */ |
435 | #else |
436 | #define TBB_USE_DEBUG 0 |
437 | #endif |
438 | #endif /* TBB_USE_DEBUG */ |
439 | |
440 | #ifndef TBB_USE_ASSERT |
441 | #define TBB_USE_ASSERT TBB_USE_DEBUG |
442 | #endif /* TBB_USE_ASSERT */ |
443 | |
444 | #ifndef TBB_USE_THREADING_TOOLS |
445 | #define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG |
446 | #endif /* TBB_USE_THREADING_TOOLS */ |
447 | |
448 | #ifndef TBB_USE_PERFORMANCE_WARNINGS |
449 | #ifdef TBB_PERFORMANCE_WARNINGS |
450 | #define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS |
451 | #else |
452 | #define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG |
453 | #endif /* TBB_PERFORMANCE_WARNINGS */ |
454 | #endif /* TBB_USE_PERFORMANCE_WARNINGS */ |
455 | |
456 | #if __TBB_DEFINE_MIC |
457 | #if TBB_USE_EXCEPTIONS |
458 | #error The platform does not properly support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0. |
459 | #elif !defined(TBB_USE_EXCEPTIONS) |
460 | #define TBB_USE_EXCEPTIONS 0 |
461 | #endif |
462 | #elif !(__EXCEPTIONS || defined(_CPPUNWIND) || __SUNPRO_CC) |
463 | #if TBB_USE_EXCEPTIONS |
464 | #error Compilation settings do not support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0. |
465 | #elif !defined(TBB_USE_EXCEPTIONS) |
466 | #define TBB_USE_EXCEPTIONS 0 |
467 | #endif |
468 | #elif !defined(TBB_USE_EXCEPTIONS) |
469 | #define TBB_USE_EXCEPTIONS 1 |
470 | #endif |
471 | |
472 | #ifndef TBB_IMPLEMENT_CPP0X |
473 | /** By default, use C++11 classes if available **/ |
474 | #if __clang__ |
475 | /* Old versions of Intel C++ Compiler do not have __has_include or cannot use it in #define */ |
476 | #if (__INTEL_COMPILER && (__INTEL_COMPILER < 1500 || __INTEL_COMPILER == 1500 && __INTEL_COMPILER_UPDATE <= 1)) |
477 | #define TBB_IMPLEMENT_CPP0X (__cplusplus < 201103L || !_LIBCPP_VERSION) |
478 | #else |
479 | #define TBB_IMPLEMENT_CPP0X (__cplusplus < 201103L || (!__has_include(<thread>) && !__has_include(<condition_variable>))) |
480 | #endif |
481 | #elif __GNUC__ |
482 | #define TBB_IMPLEMENT_CPP0X (__TBB_GCC_VERSION < 40400 || !__GXX_EXPERIMENTAL_CXX0X__) |
483 | #elif _MSC_VER |
484 | #define TBB_IMPLEMENT_CPP0X (_MSC_VER < 1700) |
485 | #else |
486 | // TODO: Reconsider general approach to be more reliable, e.g. (!(__cplusplus >= 201103L && __ STDC_HOSTED__)) |
487 | #define TBB_IMPLEMENT_CPP0X (!__STDCPP_THREADS__) |
488 | #endif |
489 | #endif /* TBB_IMPLEMENT_CPP0X */ |
490 | |
491 | /* TBB_USE_CAPTURED_EXCEPTION should be explicitly set to either 0 or 1, as it is used as C++ const */ |
492 | #ifndef TBB_USE_CAPTURED_EXCEPTION |
493 | /** IA-64 architecture pre-built TBB binaries do not support exception_ptr. **/ |
494 | #if __TBB_EXCEPTION_PTR_PRESENT && !defined(__ia64__) |
495 | #define TBB_USE_CAPTURED_EXCEPTION 0 |
496 | #else |
497 | #define TBB_USE_CAPTURED_EXCEPTION 1 |
498 | #endif |
499 | #else /* defined TBB_USE_CAPTURED_EXCEPTION */ |
500 | #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT |
501 | #error Current runtime does not support std::exception_ptr. Set TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception. |
502 | #endif |
503 | #endif /* defined TBB_USE_CAPTURED_EXCEPTION */ |
504 | |
505 | /** Check whether the request to use GCC atomics can be satisfied **/ |
506 | #if TBB_USE_GCC_BUILTINS && !__TBB_GCC_BUILTIN_ATOMICS_PRESENT |
507 | #error "GCC atomic built-ins are not supported." |
508 | #endif |
509 | |
510 | /** Internal TBB features & modes **/ |
511 | |
512 | /** __TBB_CONCURRENT_ORDERED_CONTAINERS indicates that all conditions of use |
513 | * concurrent_map and concurrent_set are met. **/ |
514 | // TODO: Add cpp11 random generation macro |
515 | #ifndef __TBB_CONCURRENT_ORDERED_CONTAINERS_PRESENT |
516 | #define __TBB_CONCURRENT_ORDERED_CONTAINERS_PRESENT ( __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT \ |
517 | && __TBB_IMPLICIT_MOVE_PRESENT && __TBB_CPP11_AUTO_PRESENT && __TBB_CPP11_LAMBDAS_PRESENT && __TBB_CPP11_ARRAY_PRESENT \ |
518 | && __TBB_INITIALIZER_LISTS_PRESENT ) |
519 | #endif |
520 | |
521 | /** __TBB_WEAK_SYMBOLS_PRESENT denotes that the system supports the weak symbol mechanism **/ |
522 | #ifndef __TBB_WEAK_SYMBOLS_PRESENT |
523 | #define __TBB_WEAK_SYMBOLS_PRESENT ( !_WIN32 && !__APPLE__ && !__sun && (__TBB_GCC_VERSION >= 40000 || __INTEL_COMPILER ) ) |
524 | #endif |
525 | |
526 | /** __TBB_DYNAMIC_LOAD_ENABLED describes the system possibility to load shared libraries at run time **/ |
527 | #ifndef __TBB_DYNAMIC_LOAD_ENABLED |
528 | #define __TBB_DYNAMIC_LOAD_ENABLED 1 |
529 | #endif |
530 | |
531 | /** __TBB_SOURCE_DIRECTLY_INCLUDED is a mode used in whitebox testing when |
532 | it's necessary to test internal functions not exported from TBB DLLs |
533 | **/ |
534 | #if (_WIN32||_WIN64) && (__TBB_SOURCE_DIRECTLY_INCLUDED || TBB_USE_PREVIEW_BINARY) |
535 | #define __TBB_NO_IMPLICIT_LINKAGE 1 |
536 | #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1 |
537 | #endif |
538 | |
539 | #ifndef __TBB_COUNT_TASK_NODES |
540 | #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT |
541 | #endif |
542 | |
543 | #ifndef __TBB_TASK_GROUP_CONTEXT |
544 | #define __TBB_TASK_GROUP_CONTEXT 1 |
545 | #endif /* __TBB_TASK_GROUP_CONTEXT */ |
546 | |
547 | #ifndef __TBB_SCHEDULER_OBSERVER |
548 | #define __TBB_SCHEDULER_OBSERVER 1 |
549 | #endif /* __TBB_SCHEDULER_OBSERVER */ |
550 | |
551 | #ifndef __TBB_FP_CONTEXT |
552 | #define __TBB_FP_CONTEXT __TBB_TASK_GROUP_CONTEXT |
553 | #endif /* __TBB_FP_CONTEXT */ |
554 | |
555 | #if __TBB_FP_CONTEXT && !__TBB_TASK_GROUP_CONTEXT |
556 | #error __TBB_FP_CONTEXT requires __TBB_TASK_GROUP_CONTEXT to be enabled |
557 | #endif |
558 | |
559 | #define __TBB_RECYCLE_TO_ENQUEUE __TBB_BUILD // keep non-official |
560 | |
561 | #ifndef __TBB_ARENA_OBSERVER |
562 | #define __TBB_ARENA_OBSERVER __TBB_SCHEDULER_OBSERVER |
563 | #endif /* __TBB_ARENA_OBSERVER */ |
564 | |
565 | #ifndef __TBB_TASK_ISOLATION |
566 | #define __TBB_TASK_ISOLATION 1 |
567 | #endif /* __TBB_TASK_ISOLATION */ |
568 | |
569 | #if TBB_USE_EXCEPTIONS && !__TBB_TASK_GROUP_CONTEXT |
570 | #error TBB_USE_EXCEPTIONS requires __TBB_TASK_GROUP_CONTEXT to be enabled |
571 | #endif |
572 | |
573 | #ifndef __TBB_TASK_PRIORITY |
574 | #define __TBB_TASK_PRIORITY (__TBB_TASK_GROUP_CONTEXT) |
575 | #endif /* __TBB_TASK_PRIORITY */ |
576 | |
577 | #if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT |
578 | #error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled |
579 | #endif |
580 | |
581 | #if TBB_PREVIEW_WAITING_FOR_WORKERS || __TBB_BUILD |
582 | #define __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE 1 |
583 | #endif |
584 | |
585 | #ifndef __TBB_ENQUEUE_ENFORCED_CONCURRENCY |
586 | #define __TBB_ENQUEUE_ENFORCED_CONCURRENCY 1 |
587 | #endif |
588 | |
589 | #if !defined(__TBB_SURVIVE_THREAD_SWITCH) && \ |
590 | (_WIN32 || _WIN64 || __APPLE__ || (__linux__ && !__ANDROID__)) |
591 | #define __TBB_SURVIVE_THREAD_SWITCH 1 |
592 | #endif /* __TBB_SURVIVE_THREAD_SWITCH */ |
593 | |
594 | #ifndef __TBB_DEFAULT_PARTITIONER |
595 | #define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner |
596 | #endif |
597 | |
598 | #ifndef __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES |
599 | #define __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES 1 |
600 | #endif |
601 | |
602 | #ifndef __TBB_ENABLE_RANGE_FEEDBACK |
603 | #define __TBB_ENABLE_RANGE_FEEDBACK 0 |
604 | #endif |
605 | |
606 | #ifdef _VARIADIC_MAX |
607 | #define __TBB_VARIADIC_MAX _VARIADIC_MAX |
608 | #else |
609 | #if _MSC_VER == 1700 |
610 | #define __TBB_VARIADIC_MAX 5 // VS11 setting, issue resolved in VS12 |
611 | #elif _MSC_VER == 1600 |
612 | #define __TBB_VARIADIC_MAX 10 // VS10 setting |
613 | #else |
614 | #define __TBB_VARIADIC_MAX 15 |
615 | #endif |
616 | #endif |
617 | |
618 | /** __TBB_WIN8UI_SUPPORT enables support of Windows* Store Apps and limit a possibility to load |
619 | shared libraries at run time only from application container **/ |
620 | // TODO: Separate this single macro into two for Windows 8 Store* (win8ui mode) and UWP/UWD modes. |
621 | #if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP |
622 | #define __TBB_WIN8UI_SUPPORT 1 |
623 | #else |
624 | #define __TBB_WIN8UI_SUPPORT 0 |
625 | #endif |
626 | |
627 | /** Macros of the form __TBB_XXX_BROKEN denote known issues that are caused by |
628 | the bugs in compilers, standard or OS specific libraries. They should be |
629 | removed as soon as the corresponding bugs are fixed or the buggy OS/compiler |
630 | versions go out of the support list. |
631 | **/ |
632 | |
633 | #if __SIZEOF_POINTER__ < 8 && __ANDROID__ && __TBB_GCC_VERSION <= 40403 && !__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 |
634 | /** Necessary because on Android 8-byte CAS and F&A are not available for some processor architectures, |
635 | but no mandatory warning message appears from GCC 4.4.3. Instead, only a linkage error occurs when |
636 | these atomic operations are used (such as in unit test test_atomic.exe). **/ |
637 | #define __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1 |
638 | #elif __TBB_x86_32 && __TBB_GCC_VERSION == 40102 && ! __GNUC_RH_RELEASE__ |
639 | /** GCC 4.1.2 erroneously emit call to external function for 64 bit sync_ intrinsics. |
640 | However these functions are not defined anywhere. It seems that this problem was fixed later on |
641 | and RHEL got an updated version of gcc 4.1.2. **/ |
642 | #define __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1 |
643 | #endif |
644 | |
645 | #if __GNUC__ && __TBB_x86_64 && __INTEL_COMPILER == 1200 |
646 | #define __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1 |
647 | #endif |
648 | |
649 | #if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012) |
650 | /** Necessary to avoid ICL error (or warning in non-strict mode): |
651 | "exception specification for implicitly declared virtual destructor is |
652 | incompatible with that of overridden one". **/ |
653 | #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1 |
654 | #endif |
655 | |
656 | #if !__INTEL_COMPILER && (_MSC_VER && _MSC_VER < 1500 || __GNUC__ && __TBB_GCC_VERSION < 40102) |
657 | /** gcc 3.4.6 (and earlier) and VS2005 (and earlier) do not allow declaring template class as a friend |
658 | of classes defined in other namespaces. **/ |
659 | #define __TBB_TEMPLATE_FRIENDS_BROKEN 1 |
660 | #endif |
661 | |
662 | #if __GLIBC__==2 && __GLIBC_MINOR__==3 || (__APPLE__ && ( __INTEL_COMPILER==1200 && !TBB_USE_DEBUG)) |
663 | /** Macro controlling EH usages in TBB tests. |
664 | Some older versions of glibc crash when exception handling happens concurrently. **/ |
665 | #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1 |
666 | #endif |
667 | |
668 | #if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110 |
669 | /** That's a bug in Intel C++ Compiler 11.1.044/IA-32 architecture/Windows* OS, that leads to a worker thread crash on the thread's startup. **/ |
670 | #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1 |
671 | #endif |
672 | |
673 | #if __clang__ || (__GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)) |
674 | /** Bugs with access to nested classes declared in protected area */ |
675 | #define __TBB_PROTECTED_NESTED_CLASS_BROKEN 1 |
676 | #endif |
677 | |
678 | #if __MINGW32__ && __TBB_GCC_VERSION < 40200 |
679 | /** MinGW has a bug with stack alignment for routines invoked from MS RTLs. |
680 | Since GCC 4.2, the bug can be worked around via a special attribute. **/ |
681 | #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1 |
682 | #endif |
683 | |
684 | #if __TBB_GCC_VERSION==40300 && !__INTEL_COMPILER && !__clang__ |
685 | /* GCC of this version may rashly ignore control dependencies */ |
686 | #define __TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1 |
687 | #endif |
688 | |
689 | #if __FreeBSD__ |
690 | /** A bug in FreeBSD 8.0 results in kernel panic when there is contention |
691 | on a mutex created with this attribute. **/ |
692 | #define __TBB_PRIO_INHERIT_BROKEN 1 |
693 | |
694 | /** A bug in FreeBSD 8.0 results in test hanging when an exception occurs |
695 | during (concurrent?) object construction by means of placement new operator. **/ |
696 | #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1 |
697 | #endif /* __FreeBSD__ */ |
698 | |
699 | #if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER) |
700 | /** The Intel C++ Compiler for IA-32 architecture (Linux* OS|macOS) crashes or generates |
701 | incorrect code when __asm__ arguments have a cast to volatile. **/ |
702 | #define __TBB_ICC_ASM_VOLATILE_BROKEN 1 |
703 | #endif |
704 | |
705 | #if !__INTEL_COMPILER && (_MSC_VER && _MSC_VER < 1700 || __GNUC__==3 && __GNUC_MINOR__<=2) |
706 | /** Bug in GCC 3.2 and MSVC compilers that sometimes return 0 for __alignof(T) |
707 | when T has not yet been instantiated. **/ |
708 | #define __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1 |
709 | #endif |
710 | |
711 | #if __TBB_DEFINE_MIC |
712 | /** Main thread and user's thread have different default thread affinity masks. **/ |
713 | #define __TBB_MAIN_THREAD_AFFINITY_BROKEN 1 |
714 | #endif |
715 | |
716 | #if __GXX_EXPERIMENTAL_CXX0X__ && !defined(__EXCEPTIONS) && \ |
717 | ((!__INTEL_COMPILER && !__clang__ && (__TBB_GCC_VERSION>=40400 && __TBB_GCC_VERSION<40600)) || \ |
718 | (__INTEL_COMPILER<=1400 && (__TBB_GLIBCXX_VERSION>=40400 && __TBB_GLIBCXX_VERSION<=40801))) |
719 | /* There is an issue for specific GCC toolchain when C++11 is enabled |
720 | and exceptions are disabled: |
721 | exceprion_ptr.h/nested_exception.h use throw unconditionally. |
722 | GCC can ignore 'throw' since 4.6; but with ICC the issue still exists. |
723 | */ |
724 | #define __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN 1 |
725 | #endif |
726 | |
727 | #if __INTEL_COMPILER==1300 && __TBB_GLIBCXX_VERSION>=40700 && defined(__GXX_EXPERIMENTAL_CXX0X__) |
728 | /* Some C++11 features used inside libstdc++ are not supported by Intel C++ Compiler. */ |
729 | #define __TBB_ICC_13_0_CPP11_STDLIB_SUPPORT_BROKEN 1 |
730 | #endif |
731 | |
732 | #if (__GNUC__==4 && __GNUC_MINOR__==4 ) && !defined(__INTEL_COMPILER) && !defined(__clang__) |
733 | /** excessive warnings related to strict aliasing rules in GCC 4.4 **/ |
734 | #define __TBB_GCC_STRICT_ALIASING_BROKEN 1 |
735 | /* topical remedy: #pragma GCC diagnostic ignored "-Wstrict-aliasing" */ |
736 | #if !__TBB_GCC_WARNING_SUPPRESSION_PRESENT |
737 | #error Warning suppression is not supported, while should. |
738 | #endif |
739 | #endif |
740 | |
741 | /* In a PIC mode some versions of GCC 4.1.2 generate incorrect inlined code for 8 byte __sync_val_compare_and_swap intrinsic */ |
742 | #if __TBB_GCC_VERSION == 40102 && __PIC__ && !defined(__INTEL_COMPILER) && !defined(__clang__) |
743 | #define __TBB_GCC_CAS8_BUILTIN_INLINING_BROKEN 1 |
744 | #endif |
745 | |
746 | #if __TBB_x86_32 && ( __INTEL_COMPILER || (__GNUC__==5 && __GNUC_MINOR__>=2 && __GXX_EXPERIMENTAL_CXX0X__) \ |
747 | || (__GNUC__==3 && __GNUC_MINOR__==3) || (__MINGW32__ && __GNUC__==4 && __GNUC_MINOR__==5) || __SUNPRO_CC ) |
748 | // Some compilers for IA-32 architecture fail to provide 8-byte alignment of objects on the stack, |
749 | // even if the object specifies 8-byte alignment. On such platforms, the implementation |
750 | // of 64 bit atomics for IA-32 architecture (e.g. atomic<long long>) use different tactics |
751 | // depending upon whether the object is properly aligned or not. |
752 | #define __TBB_FORCE_64BIT_ALIGNMENT_BROKEN 1 |
753 | #else |
754 | // Define to 0 explicitly because the macro is used in a compiled code of test_atomic |
755 | #define __TBB_FORCE_64BIT_ALIGNMENT_BROKEN 0 |
756 | #endif |
757 | |
758 | #if __GNUC__ && !__INTEL_COMPILER && !__clang__ && __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && __TBB_GCC_VERSION < 40700 |
759 | #define __TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN 1 |
760 | #endif |
761 | |
762 | #if _MSC_VER && _MSC_VER <= 1800 && !__INTEL_COMPILER |
763 | // With MSVC, when an array is passed by const reference to a template function, |
764 | // constness from the function parameter may get propagated to the template parameter. |
765 | #define __TBB_CONST_REF_TO_ARRAY_TEMPLATE_PARAM_BROKEN 1 |
766 | #endif |
767 | |
768 | // A compiler bug: a disabled copy constructor prevents use of the moving constructor |
769 | #define __TBB_IF_NO_COPY_CTOR_MOVE_SEMANTICS_BROKEN (_MSC_VER && (__INTEL_COMPILER >= 1300 && __INTEL_COMPILER <= 1310) && !__INTEL_CXX11_MODE__) |
770 | |
771 | #define __TBB_CPP11_DECLVAL_BROKEN (_MSC_VER == 1600 || (__GNUC__ && __TBB_GCC_VERSION < 40500) ) |
772 | // Intel C++ Compiler has difficulties with copying std::pair with VC11 std::reference_wrapper being a const member |
773 | #define __TBB_COPY_FROM_NON_CONST_REF_BROKEN (_MSC_VER == 1700 && __INTEL_COMPILER && __INTEL_COMPILER < 1600) |
774 | |
775 | // The implicit upcasting of the tuple of a reference of a derived class to a base class fails on icc 13.X if the system's gcc environment is 4.8 |
776 | // Also in gcc 4.4 standard library the implementation of the tuple<&> conversion (tuple<A&> a = tuple<B&>, B is inherited from A) is broken. |
777 | #if __GXX_EXPERIMENTAL_CXX0X__ && __GLIBCXX__ && ((__INTEL_COMPILER >=1300 && __INTEL_COMPILER <=1310 && __TBB_GLIBCXX_VERSION>=40700) || (__TBB_GLIBCXX_VERSION < 40500)) |
778 | #define __TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN 1 |
779 | #endif |
780 | |
781 | // In some cases decltype of a function adds a reference to a return type. |
782 | #define __TBB_CPP11_DECLTYPE_OF_FUNCTION_RETURN_TYPE_BROKEN (_MSC_VER == 1600 && !__INTEL_COMPILER) |
783 | |
784 | // Visual Studio 2013 does not delete the copy constructor when a user-defined move constructor is provided |
785 | #if _MSC_VER && _MSC_VER <= 1800 |
786 | #define __TBB_IMPLICIT_COPY_DELETION_BROKEN 1 |
787 | #endif |
788 | |
789 | /** End of __TBB_XXX_BROKEN macro section **/ |
790 | |
791 | #if defined(_MSC_VER) && _MSC_VER>=1500 && !defined(__INTEL_COMPILER) |
792 | // A macro to suppress erroneous or benign "unreachable code" MSVC warning (4702) |
793 | #define __TBB_MSVC_UNREACHABLE_CODE_IGNORED 1 |
794 | #endif |
795 | |
796 | #define __TBB_ATOMIC_CTORS (__TBB_CONSTEXPR_PRESENT && __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && (!__TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN)) |
797 | |
798 | // Many OS versions (Android 4.0.[0-3] for example) need workaround for dlopen to avoid non-recursive loader lock hang |
799 | // Setting the workaround for all compile targets ($APP_PLATFORM) below Android 4.4 (android-19) |
800 | #if __ANDROID__ |
801 | #include <android/api-level.h> |
802 | #define __TBB_USE_DLOPEN_REENTRANCY_WORKAROUND (__ANDROID_API__ < 19) |
803 | #endif |
804 | |
805 | #define __TBB_ALLOCATOR_CONSTRUCT_VARIADIC (__TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT) |
806 | |
807 | #define __TBB_VARIADIC_PARALLEL_INVOKE (TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE && __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT) |
808 | #define __TBB_FLOW_GRAPH_CPP11_FEATURES (__TBB_CPP11_VARIADIC_TEMPLATES_PRESENT \ |
809 | && __TBB_CPP11_SMART_POINTERS_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_AUTO_PRESENT) \ |
810 | && __TBB_CPP11_VARIADIC_TUPLE_PRESENT && __TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT \ |
811 | && !__TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN |
812 | #define __TBB_PREVIEW_STREAMING_NODE (__TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT && __TBB_FLOW_GRAPH_CPP11_FEATURES \ |
813 | && TBB_PREVIEW_FLOW_GRAPH_NODES && !TBB_IMPLEMENT_CPP0X && !__TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN) |
814 | #define __TBB_PREVIEW_OPENCL_NODE (__TBB_PREVIEW_STREAMING_NODE && __TBB_CPP11_TEMPLATE_ALIASES_PRESENT) |
815 | #define __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING (TBB_PREVIEW_FLOW_GRAPH_FEATURES || __TBB_PREVIEW_OPENCL_NODE) |
816 | #define __TBB_PREVIEW_ASYNC_MSG (TBB_PREVIEW_FLOW_GRAPH_FEATURES && __TBB_FLOW_GRAPH_CPP11_FEATURES) |
817 | |
818 | |
819 | #ifndef __TBB_PREVIEW_FLOW_GRAPH_PRIORITIES |
820 | #define __TBB_PREVIEW_FLOW_GRAPH_PRIORITIES TBB_PREVIEW_FLOW_GRAPH_FEATURES |
821 | #endif |
822 | |
823 | #ifndef __TBB_PREVIEW_CRITICAL_TASKS |
824 | #define __TBB_PREVIEW_CRITICAL_TASKS (__TBB_CPF_BUILD || __TBB_PREVIEW_FLOW_GRAPH_PRIORITIES) |
825 | #endif |
826 | |
827 | #endif /* __TBB_tbb_config_H */ |
828 | |