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_harness_defs_H
18#define __TBB_harness_defs_H
19
20#include "tbb/tbb_config.h"
21#if __FreeBSD__
22#include <sys/param.h> // for __FreeBSD_version
23#endif
24
25#if __TBB_TEST_PIC && !__PIC__
26#define __TBB_TEST_SKIP_PIC_MODE 1
27#else
28#define __TBB_TEST_SKIP_PIC_MODE 0
29#endif
30
31// no need to test GCC builtins mode on ICC
32#define __TBB_TEST_SKIP_GCC_BUILTINS_MODE ( __TBB_TEST_BUILTINS && (!__TBB_GCC_BUILTIN_ATOMICS_PRESENT || __INTEL_COMPILER) )
33
34#define __TBB_TEST_SKIP_ICC_BUILTINS_MODE ( __TBB_TEST_BUILTINS && !__TBB_ICC_BUILTIN_ATOMICS_PRESENT )
35
36#ifndef TBB_USE_GCC_BUILTINS
37 // Force TBB to use GCC intrinsics port, but not on ICC, as no need
38 #define TBB_USE_GCC_BUILTINS ( __TBB_TEST_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT && !__INTEL_COMPILER )
39#endif
40
41#ifndef TBB_USE_ICC_BUILTINS
42 // Force TBB to use ICC c++11 style intrinsics port
43 #define TBB_USE_ICC_BUILTINS ( __TBB_TEST_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT )
44#endif
45
46#if (_WIN32 && !__TBB_WIN8UI_SUPPORT) || (__linux__ && !__ANDROID__ && !__bg__) || __FreeBSD_version >= 701000
47#define __TBB_TEST_SKIP_AFFINITY 0
48#else
49#define __TBB_TEST_SKIP_AFFINITY 1
50#endif
51
52#if __INTEL_COMPILER
53 #define __TBB_CPP11_REFERENCE_WRAPPER_PRESENT ( __INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200 && \
54 ( _MSC_VER >= 1600 || __TBB_GLIBCXX_VERSION >= 40400 || ( _LIBCPP_VERSION && __cplusplus >= 201103L ) ) )
55 #define __TBB_RANGE_BASED_FOR_PRESENT ( __INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1300 )
56 #define __TBB_SCOPED_ENUM_PRESENT ( __INTEL_CXX11_MODE__ && __INTEL_COMPILER > 1100 )
57#elif __clang__
58 #define __TBB_CPP11_REFERENCE_WRAPPER_PRESENT ( __cplusplus >= 201103L && (__TBB_GLIBCXX_VERSION >= 40400 || _LIBCPP_VERSION) )
59 #define __TBB_RANGE_BASED_FOR_PRESENT ( __has_feature(__cxx_range_for) )
60 #define __TBB_SCOPED_ENUM_PRESENT ( __has_feature(cxx_strong_enums) )
61#elif __GNUC__
62 #define __TBB_CPP11_REFERENCE_WRAPPER_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400 )
63 #define __TBB_RANGE_BASED_FOR_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40500 )
64 #define __TBB_SCOPED_ENUM_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400 )
65 #define __TBB_GCC_WARNING_IGNORED_ATTRIBUTES_PRESENT (__TBB_GCC_VERSION >= 60100)
66#elif _MSC_VER
67 #define __TBB_CPP11_REFERENCE_WRAPPER_PRESENT ( _MSC_VER >= 1600 )
68 #define __TBB_RANGE_BASED_FOR_PRESENT ( _MSC_VER >= 1700 )
69 #define __TBB_SCOPED_ENUM_PRESENT ( _MSC_VER >= 1700 )
70#endif
71
72#define __TBB_CPP14_GENERIC_LAMBDAS_PRESENT (__cpp_generic_lambdas >= 201304 )
73
74#define __TBB_TEST_SKIP_LAMBDA (__TBB_ICC_13_0_CPP11_STDLIB_SUPPORT_BROKEN || !__TBB_CPP11_LAMBDAS_PRESENT)
75
76#if __GNUC__ && __ANDROID__
77// On Android* OS, GCC does not support _thread keyword
78 #define __TBB_THREAD_LOCAL_VARIABLES_PRESENT 0
79#else
80 #define __TBB_THREAD_LOCAL_VARIABLES_PRESENT 1
81#endif
82
83// ICC has a bug in assumptions of the modifications made via atomic pointer
84#define __TBB_ICC_BUILTIN_ATOMICS_POINTER_ALIASING_BROKEN (TBB_USE_ICC_BUILTINS && __INTEL_COMPILER < 1400 && __INTEL_COMPILER > 1200)
85
86// clang on Android/IA-32 fails on exception thrown from static move constructor
87#define __TBB_CPP11_EXCEPTION_IN_STATIC_TEST_BROKEN (__ANDROID__ && __SIZEOF_POINTER__==4 && __clang__)
88
89// MSVC 2013 is unable to properly resolve call to overloaded operator= with std::initializer_list argument for std::pair list elements
90// clang on Android/IA-32 fails on "std::vector<std::pair<int,int>> vd{{1,1},{1,1},{1,1}};" line in release mode
91#define __TBB_CPP11_INIT_LIST_TEST_BROKEN (_MSC_VER <= 1800 && _MSC_VER && !__INTEL_COMPILER) || (__ANDROID__ && __TBB_x86_32 && __clang__)
92// MSVC 2013 is unable to manage lifetime of temporary objects passed to a std::initializer_list constructor properly
93#define __TBB_CPP11_INIT_LIST_TEMP_OBJS_LIFETIME_BROKEN (_MSC_FULL_VER < 180030501 && _MSC_VER && !__INTEL_COMPILER)
94
95// Implementation of C++11 std::placeholders in libstdc++ coming with GCC prior to 4.5 reveals bug in Intel(R) C++ Compiler 13 causing "multiple definition" link errors.
96#define __TBB_CPP11_STD_PLACEHOLDERS_LINKAGE_BROKEN ((__INTEL_COMPILER == 1300 || __INTEL_COMPILER == 1310) && __GXX_EXPERIMENTAL_CXX0X__ && __GLIBCXX__ && __TBB_GLIBCXX_VERSION < 40500)
97
98// Intel C++ Compiler has an issue when a scoped enum with a specified underlying type has negative values.
99#define __TBB_ICC_SCOPED_ENUM_WITH_UNDERLYING_TYPE_NEGATIVE_VALUE_BROKEN ( _MSC_VER && !__TBB_DEBUG && __INTEL_COMPILER && __INTEL_COMPILER <= 1500 )
100// Intel C++ Compiler has an issue with __atomic_load_explicit from a scoped enum with a specified underlying type.
101#define __TBB_ICC_SCOPED_ENUM_WITH_UNDERLYING_TYPE_ATOMIC_LOAD_BROKEN ( TBB_USE_ICC_BUILTINS && !__TBB_DEBUG && __INTEL_COMPILER && __INTEL_COMPILER <= 1500 )
102
103// Unable to use constexpr member functions to initialize compile time constants
104#define __TBB_CONSTEXPR_MEMBER_FUNCTION_BROKEN (__INTEL_COMPILER == 1500)
105// Some versions of MSVC do not do compile-time initialization of static variables with constexpr constructors in debug mode
106#define __TBB_STATIC_CONSTEXPR_INIT_BROKEN (_MSC_VER >= 1900 && _MSC_VER <= 1914 && !__INTEL_COMPILER && _DEBUG)
107
108#if __GNUC__ && __ANDROID__
109 #define __TBB_EXCEPTION_TYPE_INFO_BROKEN ( __TBB_GCC_VERSION < 40600 )
110#elif _MSC_VER
111 #define __TBB_EXCEPTION_TYPE_INFO_BROKEN ( _MSC_VER < 1400 )
112#else
113 #define __TBB_EXCEPTION_TYPE_INFO_BROKEN 0
114#endif
115
116// a function ptr cannot be converted to const T& template argument without explicit cast
117#define __TBB_FUNC_PTR_AS_TEMPL_PARAM_BROKEN ( ((__linux__ || __APPLE__) && __INTEL_COMPILER && __INTEL_COMPILER < 1100) || __SUNPRO_CC )
118
119#define __TBB_UNQUALIFIED_CALL_OF_DTOR_BROKEN (__GNUC__==3 && __GNUC_MINOR__<=3)
120
121#define __TBB_CAS_8_CODEGEN_BROKEN (__TBB_x86_32 && __PIC__ && __TBB_GCC_VERSION == 40102 && !__INTEL_COMPILER)
122
123#define __TBB_THROW_FROM_DTOR_BROKEN (__clang__ && __apple_build_version__ && __apple_build_version__ < 5000279)
124
125// std::uncaught_exception is broken on some version of stdlibc++ (it returns true with no active exception)
126#define __TBB_STD_UNCAUGHT_EXCEPTION_BROKEN (__TBB_GLIBCXX_VERSION == 40407)
127
128#if __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN
129 #define _EXCEPTION_PTR_H /* prevents exception_ptr.h inclusion */
130 #define _GLIBCXX_NESTED_EXCEPTION_H /* prevents nested_exception.h inclusion */
131#endif
132
133// TODO: Investigate the cases that require this macro.
134#define __TBB_COMPLICATED_ADL_BROKEN ( __GNUC__ && __TBB_GCC_VERSION < 40400 )
135
136// Intel C++ Compiler fails to compile the comparison of tuples in some cases
137#if __INTEL_COMPILER && __INTEL_COMPILER < 1700
138 #define __TBB_TUPLE_COMPARISON_COMPILATION_BROKEN (__TBB_GLIBCXX_VERSION >= 40800 || __MIC__)
139#endif
140
141// Intel C++ Compiler fails to compile std::reference in some cases
142#if __INTEL_COMPILER && __INTEL_COMPILER < 1600 || __INTEL_COMPILER == 1600 && __INTEL_COMPILER_UPDATE <= 1
143 #define __TBB_REFERENCE_WRAPPER_COMPILATION_BROKEN (__TBB_GLIBCXX_VERSION >= 40800 && __TBB_GLIBCXX_VERSION <= 50101 || __MIC__)
144#endif
145
146// Intel C++ Compiler fails to generate non-throwing move members for a class inherited from template
147#define __TBB_NOTHROW_MOVE_MEMBERS_IMPLICIT_GENERATION_BROKEN \
148 (__INTEL_COMPILER>=1600 && __INTEL_COMPILER<=1900 || __INTEL_COMPILER==1500 && __INTEL_COMPILER_UPDATE>3)
149
150// std::is_copy_constructible<T>::value returns 'true' for non copyable type when MSVC compiler is used.
151#define __TBB_IS_COPY_CONSTRUCTIBLE_BROKEN ( _MSC_VER && (_MSC_VER <= 1700 || _MSC_VER <= 1800 && !__INTEL_COMPILER) )
152
153// GCC 4.7 and 4.8 might fail to take an address of overloaded template function (bug 57043)
154#if __GNUC__ && !__INTEL_COMPILER && !__clang__
155 #define __TBB_GCC_OVERLOADED_TEMPLATE_FUNCTION_ADDRESS_BROKEN \
156 (__TBB_GCC_VERSION>=40700 && __TBB_GCC_VERSION<40704 || __TBB_GCC_VERSION>=40800 && __TBB_GCC_VERSION<40803 )
157#endif
158
159// Swapping of scoped_allocator_adaptors is broken on GCC 4.9 and lower and on Android for Windows
160// Allocator propagation into std::pair is broken for Apple clang, lower then 9.0
161// Compilation of <scoped_allocator> header is broken for Visual Studio 2017 with ICC 17.8
162#define __TBB_SCOPED_ALLOCATOR_BROKEN (__TBB_GCC_VERSION <= 50100 || (__APPLE__ && __TBB_CLANG_VERSION < 90000) || \
163 (__FreeBSD__ && __TBB_CLANG_VERSION <= 60000) || \
164 (__ANDROID__ && (_WIN32 || _WIN64)) || \
165 (_MSC_VER && _MSC_VER == 1912 && __INTEL_COMPILER == 1700))
166
167
168
169// The tuple-based tests with more inputs take a long time to compile. If changes
170// are made to the tuple implementation or any switch that controls it, or if testing
171// with a new platform implementation of std::tuple, the test should be compiled with
172// MAX_TUPLE_TEST_SIZE >= 10 (or the largest number of elements supported) to ensure
173// all tuple sizes are tested. Expect a very long compile time.
174#ifndef MAX_TUPLE_TEST_SIZE
175 #if TBB_USE_DEBUG
176 #define MAX_TUPLE_TEST_SIZE 3
177 #else
178 #define MAX_TUPLE_TEST_SIZE 5
179 #endif
180#else
181 #if _MSC_VER
182// test sizes <= 8 don't get "decorated name length exceeded" errors. (disable : 4503)
183 #if MAX_TUPLE_TEST_SIZE > 8
184 #undef MAX_TUPLE_TEST_SIZE
185 #define MAX_TUPLE_TEST_SIZE 8
186 #endif
187 #endif
188 #if MAX_TUPLE_TEST_SIZE > __TBB_VARIADIC_MAX
189 #undef MAX_TUPLE_TEST_SIZE
190 #define MAX_TUPLE_TEST_SIZE __TBB_VARIADIC_MAX
191 #endif
192#endif
193
194#if __TBB_CPF_BUILD
195 #ifndef TBB_PREVIEW_FLOW_GRAPH_FEATURES
196 #define TBB_PREVIEW_FLOW_GRAPH_FEATURES 1
197 #endif
198 #ifndef TBB_PREVIEW_FLOW_GRAPH_TRACE
199 #define TBB_PREVIEW_FLOW_GRAPH_TRACE 1
200 #endif
201 #ifndef TBB_PREVIEW_ALGORITHM_TRACE
202 #define TBB_PREVIEW_ALGORITHM_TRACE 1
203 #endif
204 #ifndef TBB_DEPRECATED_LIMITER_NODE_CONSTRUCTOR
205 #define TBB_DEPRECATED_LIMITER_NODE_CONSTRUCTOR 1
206 #endif
207#endif
208
209namespace Harness {
210 //! Utility template function to prevent "unused" warnings by various compilers.
211 template<typename T> void suppress_unused_warning( const T& ) {}
212
213 //TODO: unify with one in tbb::internal
214 //! Utility helper structure to ease overload resolution
215 template<int > struct int_to_type {};
216}
217
218const unsigned MByte = 1024*1024;
219
220#endif /* __TBB_harness_defs_H */
221