]> git.ipfire.org Git - thirdparty/gcc.git/blame - libcilkrts/include/cilk/common.h
[Patch AArch64] Fixup floating point division with -march=armv8-a+nosimd
[thirdparty/gcc.git] / libcilkrts / include / cilk / common.h
CommitLineData
4710dd51 1/** common.h
2 *
0657c20f 3 * Copyright (C) 2010-2016, Intel Corporation
4710dd51 4 * All rights reserved.
5 *
4710dd51 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Intel Corporation nor the names of its
17 * contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
4710dd51 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
30 * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
0657c20f 32 *
33 * *********************************************************************
34 *
35 * PLEASE NOTE: This file is a downstream copy of a file mainitained in
36 * a repository at cilkplus.org. Changes made to this file that are not
37 * submitted through the contribution process detailed at
38 * http://www.cilkplus.org/submit-cilk-contribution will be lost the next
39 * time that a new version is released. Changes only submitted to the
40 * GNU compiler collection or posted to the git repository at
41 * https://bitbucket.org/intelcilkruntime/intel-cilk-runtime.git are
42 * not tracked.
43 *
44 * We welcome your contributions to this open source project. Thank you
45 * for your assistance in helping us improve Cilk Plus.
4710dd51 46 */
47
48/** @file common.h
49 *
0657c20f 50 * @brief Defines common macros and structures used by the Intel(R) Cilk(TM) Plus runtime.
4710dd51 51 *
52 * @ingroup common
53 */
54
55/** @defgroup common Common Definitions
0657c20f 56 * Definitions for runtime macros, structures, and classes.
4710dd51 57 * @{
58 */
59
60#ifndef INCLUDED_CILK_COMMON
61#define INCLUDED_CILK_COMMON
62
63#ifdef __cplusplus
0657c20f 64/** Namespace for all Intel Cilk Plus definitions that can be included in user code.
4710dd51 65 */
66namespace cilk {
67
0657c20f 68 /** Namespace for definitions re-used in other Intel Cilk Plus definitions.
4710dd51 69 */
70 namespace internal {}
71}
72#endif
73
0657c20f 74/** Intel Cilk Plus library version = 1.02
4710dd51 75 */
76#define CILK_LIBRARY_VERSION 102
77
78#ifdef __cplusplus
79# include <cassert>
80#else
81# include <assert.h>
82#endif
83
84/**
0657c20f 85 * Prefix standard library function and type names with __STDNS to
4710dd51 86 * get correct lookup in both C and C++.
87 */
88#ifdef __cplusplus
89# define __STDNS std::
90#else
91# define __STDNS
92#endif
93
94/**
95 * @def CILK_EXPORT
96 * Define export of runtime functions from shared library.
97 * Should be exported only from cilkrts*.dll/cilkrts*.so
98 * @def CILK_EXPORT_DATA
99 * Define export of runtime data from shared library.
100 */
101#ifdef _WIN32
102# ifdef IN_CILK_RUNTIME
103# define CILK_EXPORT __declspec(dllexport)
104# define CILK_EXPORT_DATA __declspec(dllexport)
105# else
106# define CILK_EXPORT __declspec(dllimport)
107# define CILK_EXPORT_DATA __declspec(dllimport)
108# endif /* IN_CILK_RUNTIME */
109#elif defined(__CYGWIN__) || defined(__APPLE__) || defined(_DARWIN_C_SOURCE)
110# define CILK_EXPORT /* nothing */
111# define CILK_EXPORT_DATA /* nothing */
112#else /* Unix/gcc */
abcaf0b8 113# if defined(IN_CILK_RUNTIME) && defined(HAVE_ATTRIBUTE_VISIBILITY)
4710dd51 114# define CILK_EXPORT __attribute__((visibility("protected")))
115# define CILK_EXPORT_DATA __attribute__((visibility("protected")))
116# else
117# define CILK_EXPORT /* nothing */
118# define CILK_EXPORT_DATA /* nothing */
119# endif /* IN_CILK_RUNTIME */
120#endif /* Unix/gcc */
121
122/**
123 * @def __CILKRTS_BEGIN_EXTERN_C
124 * Macro to denote the start of a section in which all names have "C" linkage.
125 * That is, none of the names are to be mangled.
126 * @see __CILKRTS_END_EXTERN_C
127 * @see __CILKRTS_EXTERN_C
128 *
129 * @def __CILKRTS_END_EXTERN_C
130 * Macro to denote the end of a section in which all names have "C" linkage.
131 * That is, none of the names are to be mangled.
132 * @see __CILKRTS_BEGIN_EXTERN_C
133 * @see __CILKRTS_EXTERN_C
134 *
135 * @def __CILKRTS_EXTERN_C
136 * Macro to prefix a single definition which has "C" linkage.
137 * That is, the defined name is not to be mangled.
138 * @see __CILKRTS_BEGIN_EXTERN_C
139 * @see __CILKRTS_END_EXTERN_C
140 */
141#ifdef __cplusplus
142# define __CILKRTS_BEGIN_EXTERN_C extern "C" {
143# define __CILKRTS_END_EXTERN_C }
144# define __CILKRTS_EXTERN_C extern "C"
145#else
146# define __CILKRTS_BEGIN_EXTERN_C
147# define __CILKRTS_END_EXTERN_C
148# define __CILKRTS_EXTERN_C
149#endif
150
151/**
152 * OS-independent macro to specify a function which is known to not throw
153 * an exception.
154 */
155#ifdef __cplusplus
156# ifdef _WIN32
157# define __CILKRTS_NOTHROW __declspec(nothrow)
158# else /* Unix/gcc */
159# define __CILKRTS_NOTHROW __attribute__((nothrow))
160# endif /* Unix/gcc */
161#else
162# define __CILKRTS_NOTHROW /* nothing */
163#endif /* __cplusplus */
164
165/** Cache alignment. (Good enough for most architectures.)
166 */
167#define __CILKRTS_CACHE_LINE__ 64
168
169/**
170 * Macro to specify alignment of a data member in a structure.
0657c20f 171 * Because of the way that gcc's alignment attribute is defined, @a n must
4710dd51 172 * be a numeric literal, not just a compile-time constant expression.
173 */
174#ifdef _WIN32
175# define CILK_ALIGNAS(n) __declspec(align(n))
176#else /* Unix/gcc */
177# define CILK_ALIGNAS(n) __attribute__((__aligned__(n)))
178#endif
179
180/**
181 * Macro to specify cache-line alignment of a data member in a structure.
182 */
183#define __CILKRTS_CACHE_ALIGN CILK_ALIGNAS(__CILKRTS_CACHE_LINE__)
184
185/**
186 * Macro to specify a class as being at least as strictly aligned as some
187 * type on Windows. gcc does not provide a way of doing this, so on Unix,
188 * this just specifies the largest natural type alignment. Put the macro
189 * between the `class` keyword and the class name:
190 *
191 * class CILK_ALIGNAS_TYPE(foo) bar { ... };
192 */
193#ifdef _WIN32
194# define CILK_ALIGNAS_TYPE(t) __declspec(align(__alignof(t)))
195#else /* Unix/gcc */
196# define CILK_ALIGNAS_TYPE(t) __attribute__((__aligned__))
197#endif
198
199/**
200 * @def CILK_API(RET_TYPE)
201 * A function called explicitly by the programmer.
202 * @def CILK_ABI(RET_TYPE)
203 * A function called by compiler-generated code.
204 * @def CILK_ABI_THROWS(RET_TYPE)
205 * An ABI function that may throw an exception
206 *
207 * Even when these are the same definitions, they should be separate macros so
208 * that they can be easily found in the code.
209 */
210
211#ifdef _WIN32
212# define CILK_API(RET_TYPE) CILK_EXPORT RET_TYPE __CILKRTS_NOTHROW __cdecl
213# define CILK_ABI(RET_TYPE) CILK_EXPORT RET_TYPE __CILKRTS_NOTHROW __cdecl
214# define CILK_ABI_THROWS(RET_TYPE) CILK_EXPORT RET_TYPE __cdecl
215#else
216# define CILK_API(RET_TYPE) CILK_EXPORT RET_TYPE __CILKRTS_NOTHROW
217# define CILK_ABI(RET_TYPE) CILK_EXPORT RET_TYPE __CILKRTS_NOTHROW
218# define CILK_ABI_THROWS(RET_TYPE) CILK_EXPORT RET_TYPE
219#endif
220
221/**
222 * __CILKRTS_ASSERT should be defined for debugging only, otherwise it
223 * interferes with vectorization. Since NDEBUG is not reliable (it must be
224 * set by the user), we must use a platform-specific detection of debug mode.
225 */
226#if defined(_WIN32) && defined(_DEBUG)
227 /* Windows debug */
228# define __CILKRTS_ASSERT(e) assert(e)
229#elif (! defined(_WIN32)) && ! defined(__OPTIMIZE__)
230 /* Unix non-optimized */
231# define __CILKRTS_ASSERT(e) assert(e)
232#elif defined __cplusplus
233 /* C++ non-debug */
234# define __CILKRTS_ASSERT(e) static_cast<void>(0)
235#else
236 /* C non-debug */
237# define __CILKRTS_ASSERT(e) ((void) 0)
238#endif
239
240/**
241 * OS-independent macro to specify a function that should be inlined
242 */
0657c20f 243#ifdef __cplusplus
4710dd51 244 // C++
245# define __CILKRTS_INLINE inline
246#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
247 // C99
248# define __CILKRTS_INLINE static inline
249#elif defined(_MSC_VER)
250 // C89 on Windows
251# define __CILKRTS_INLINE __inline
252#else
253 // C89 on GCC-compatible systems
254# define __CILKRTS_INLINE extern __inline__
255#endif
256
257/**
258 * Functions marked as CILK_EXPORT_AND_INLINE have both
0657c20f 259 * inline versions defined in the Intel Cilk Plus API, as well as
4710dd51 260 * non-inlined versions that are exported (for
261 * compatibility with previous versions that did not
262 * inline the functions).
263 */
264#ifdef COMPILING_CILK_API_FUNCTIONS
265# define CILK_EXPORT_AND_INLINE CILK_EXPORT
266#else
267# define CILK_EXPORT_AND_INLINE __CILKRTS_INLINE
268#endif
269
270/**
271 * Try to determine if compiler supports rvalue references.
272 */
273#if defined(__cplusplus) && !defined(__CILKRTS_RVALUE_REFERENCES)
274# if __cplusplus >= 201103L // C++11
275# define __CILKRTS_RVALUE_REFERENCES 1
276# elif defined(__GXX_EXPERIMENTAL_CXX0X__)
277# define __CILKRTS_RVALUE_REFERENCES 1
278# elif __cplusplus >= 199711L && __cplusplus < 201103L
279 // Compiler recognizes a language version prior to C++11
280# elif __INTEL_COMPILER == 1200 && defined(__STDC_HOSTED__)
281 // Intel compiler version 12.0
282 // __cplusplus has a non-standard definition. In the absence of a
283 // proper definition, look for the C++0x macro, __STDC_HOSTED__.
284# define __CILKRTS_RVALUE_REFERENCES 1
285# elif __INTEL_COMPILER > 1200 && defined(CHAR16T)
286 // Intel compiler version >= 12.1
287 // __cplusplus has a non-standard definition. In the absence of a
288 // proper definition, look for the Intel macro, CHAR16T
289# define __CILKRTS_RVALUE_REFERENCES 1
290# endif
291#endif
292
293/*
294 * Include stdint.h to define the standard integer types.
295 *
296 * Unfortunately Microsoft doesn't provide stdint.h until Visual Studio 2010,
297 * so use our own definitions until those are available
298 */
299
300#if ! defined(_MSC_VER) || (_MSC_VER >= 1600)
301# include <stdint.h>
302#else
303# ifndef __MS_STDINT_TYPES_DEFINED__
304# define __MS_STDINT_TYPES_DEFINED__
305 typedef signed char int8_t;
306 typedef short int16_t;
307 typedef int int32_t;
308 typedef __int64 int64_t;
309
310 typedef unsigned char uint8_t;
311 typedef unsigned short uint16_t;
312 typedef unsigned int uint32_t;
313 typedef unsigned __int64 uint64_t;
314# endif /* __MS_STDINT_TYPES_DEFINED__ */
315#endif /* ! defined(_MSC_VER) || (_MSC_VER >= 1600) */
316
317/**
0657c20f 318 * @brief Application Binary Interface (ABI) version of the Intel Cilk Plus runtime
319 * library.
4710dd51 320 *
0657c20f 321 * The compiler determines the ABI version used for compilation. Object files
322 * compiled with higher ABI versions are not compatible with libraries compiled
323 * with lower ABI versions. However, an object file compiled with a lower ABI
324 * version can be used with a library compiled with a higher ABI version
325 * (unless otherwise stated.)
4710dd51 326 */
327#ifndef __CILKRTS_ABI_VERSION
328# ifdef IN_CILK_RUNTIME
329# define __CILKRTS_ABI_VERSION 1
76a2f4ff 330# elif defined(__INTEL_COMPILER) && (__INTEL_COMPILER <= 1200)
331 // Intel compilers prior to version 12.1 support only ABI 0
4710dd51 332# define __CILKRTS_ABI_VERSION 0
76a2f4ff 333# else
334 // Non-Intel compiler or Intel compiler after version 12.0.
335# define __CILKRTS_ABI_VERSION 1
4710dd51 336# endif
337#endif
338
339// These structs are exported because the inlining of
340// the internal version of API methods require a worker
341// structure as parameter.
342__CILKRTS_BEGIN_EXTERN_C
343 /// Worker struct, exported for inlined API methods
344 /// @ingroup api
345 struct __cilkrts_worker;
346
347 /// Worker struct, exported for inlined API methods
348 /// @ingroup api
349 typedef struct __cilkrts_worker __cilkrts_worker;
350
351 /// Worker struct pointer, exported for inlined API methods
352 /// @ingroup api
353 typedef struct __cilkrts_worker *__cilkrts_worker_ptr;
354
355
356 /// Fetch the worker out of TLS.
357 CILK_ABI(__cilkrts_worker_ptr) __cilkrts_get_tls_worker(void);
358
359 /// void *, defined to work around complaints from the compiler
360 /// about using __declspec(nothrow) after the "void *" return type
361 typedef void * __cilkrts_void_ptr;
362
363__CILKRTS_END_EXTERN_C
364
365
366#if __CILKRTS_ABI_VERSION >= 1
367// Pedigree API is available only for compilers that use ABI version >= 1.
368
369/** Pedigree information kept in the worker and stack frame.
370 * @ingroup api
371 */
372typedef struct __cilkrts_pedigree
373{
374 /** Rank at start of spawn helper. Saved rank for spawning functions */
375 uint64_t rank;
376
377 /** Link to next in chain */
378 const struct __cilkrts_pedigree *parent;
379} __cilkrts_pedigree;
380
381#endif // __CILKRTS_ABI_VERSION >= 1
382
383/// @}
384
385#endif /* INCLUDED_CILK_COMMON */