xref: /dflybsd-src/contrib/gcc-8.0/include/gomp-constants.h (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* Communication between GCC and libgomp.
2*38fd1498Szrj 
3*38fd1498Szrj    Copyright (C) 2014-2018 Free Software Foundation, Inc.
4*38fd1498Szrj 
5*38fd1498Szrj    Contributed by Mentor Embedded.
6*38fd1498Szrj 
7*38fd1498Szrj    This file is part of the GNU Offloading and Multi Processing Library
8*38fd1498Szrj    (libgomp).
9*38fd1498Szrj 
10*38fd1498Szrj    Libgomp is free software; you can redistribute it and/or modify it
11*38fd1498Szrj    under the terms of the GNU General Public License as published by
12*38fd1498Szrj    the Free Software Foundation; either version 3, or (at your option)
13*38fd1498Szrj    any later version.
14*38fd1498Szrj 
15*38fd1498Szrj    Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
16*38fd1498Szrj    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17*38fd1498Szrj    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
18*38fd1498Szrj    more details.
19*38fd1498Szrj 
20*38fd1498Szrj    Under Section 7 of GPL version 3, you are granted additional
21*38fd1498Szrj    permissions described in the GCC Runtime Library Exception, version
22*38fd1498Szrj    3.1, as published by the Free Software Foundation.
23*38fd1498Szrj 
24*38fd1498Szrj    You should have received a copy of the GNU General Public License and
25*38fd1498Szrj    a copy of the GCC Runtime Library Exception along with this program;
26*38fd1498Szrj    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
27*38fd1498Szrj    <http://www.gnu.org/licenses/>.  */
28*38fd1498Szrj 
29*38fd1498Szrj #ifndef GOMP_CONSTANTS_H
30*38fd1498Szrj #define GOMP_CONSTANTS_H 1
31*38fd1498Szrj 
32*38fd1498Szrj /* Memory mapping types.  */
33*38fd1498Szrj 
34*38fd1498Szrj /* One byte.  */
35*38fd1498Szrj #define GOMP_MAP_LAST			(1 << 8)
36*38fd1498Szrj 
37*38fd1498Szrj #define GOMP_MAP_FLAG_TO		(1 << 0)
38*38fd1498Szrj #define GOMP_MAP_FLAG_FROM		(1 << 1)
39*38fd1498Szrj /* Special map kinds, enumerated starting here.  */
40*38fd1498Szrj #define GOMP_MAP_FLAG_SPECIAL_0		(1 << 2)
41*38fd1498Szrj #define GOMP_MAP_FLAG_SPECIAL_1		(1 << 3)
42*38fd1498Szrj #define GOMP_MAP_FLAG_SPECIAL_2		(1 << 4)
43*38fd1498Szrj #define GOMP_MAP_FLAG_SPECIAL		(GOMP_MAP_FLAG_SPECIAL_1 \
44*38fd1498Szrj 					 | GOMP_MAP_FLAG_SPECIAL_0)
45*38fd1498Szrj /* Flag to force a specific behavior (or else, trigger a run-time error).  */
46*38fd1498Szrj #define GOMP_MAP_FLAG_FORCE		(1 << 7)
47*38fd1498Szrj 
48*38fd1498Szrj enum gomp_map_kind
49*38fd1498Szrj   {
50*38fd1498Szrj     /* If not already present, allocate.  */
51*38fd1498Szrj     GOMP_MAP_ALLOC =			0,
52*38fd1498Szrj     /* ..., and copy to device.  */
53*38fd1498Szrj     GOMP_MAP_TO =			(GOMP_MAP_ALLOC | GOMP_MAP_FLAG_TO),
54*38fd1498Szrj     /* ..., and copy from device.  */
55*38fd1498Szrj     GOMP_MAP_FROM =			(GOMP_MAP_ALLOC | GOMP_MAP_FLAG_FROM),
56*38fd1498Szrj     /* ..., and copy to and from device.  */
57*38fd1498Szrj     GOMP_MAP_TOFROM =			(GOMP_MAP_TO | GOMP_MAP_FROM),
58*38fd1498Szrj     /* The following kind is an internal only map kind, used for pointer based
59*38fd1498Szrj        array sections.  OMP_CLAUSE_SIZE for these is not the pointer size,
60*38fd1498Szrj        which is implicitly POINTER_SIZE_UNITS, but the bias.  */
61*38fd1498Szrj     GOMP_MAP_POINTER =			(GOMP_MAP_FLAG_SPECIAL_0 | 0),
62*38fd1498Szrj     /* Also internal, behaves like GOMP_MAP_TO, but additionally any
63*38fd1498Szrj        GOMP_MAP_POINTER records consecutive after it which have addresses
64*38fd1498Szrj        falling into that range will not be ignored if GOMP_MAP_TO_PSET wasn't
65*38fd1498Szrj        mapped already.  */
66*38fd1498Szrj     GOMP_MAP_TO_PSET =			(GOMP_MAP_FLAG_SPECIAL_0 | 1),
67*38fd1498Szrj     /* Must already be present.  */
68*38fd1498Szrj     GOMP_MAP_FORCE_PRESENT =		(GOMP_MAP_FLAG_SPECIAL_0 | 2),
69*38fd1498Szrj     /* Deallocate a mapping, without copying from device.  */
70*38fd1498Szrj     GOMP_MAP_DELETE =			(GOMP_MAP_FLAG_SPECIAL_0 | 3),
71*38fd1498Szrj     /* Is a device pointer.  OMP_CLAUSE_SIZE for these is unused; is implicitly
72*38fd1498Szrj        POINTER_SIZE_UNITS.  */
73*38fd1498Szrj     GOMP_MAP_FORCE_DEVICEPTR =		(GOMP_MAP_FLAG_SPECIAL_1 | 0),
74*38fd1498Szrj     /* Do not map, copy bits for firstprivate instead.  */
75*38fd1498Szrj     /* OpenACC device_resident.  */
76*38fd1498Szrj     GOMP_MAP_DEVICE_RESIDENT =		(GOMP_MAP_FLAG_SPECIAL_1 | 1),
77*38fd1498Szrj     /* OpenACC link.  */
78*38fd1498Szrj     GOMP_MAP_LINK =			(GOMP_MAP_FLAG_SPECIAL_1 | 2),
79*38fd1498Szrj     /* Allocate.  */
80*38fd1498Szrj     GOMP_MAP_FIRSTPRIVATE =		(GOMP_MAP_FLAG_SPECIAL | 0),
81*38fd1498Szrj     /* Similarly, but store the value in the pointer rather than
82*38fd1498Szrj        pointed by the pointer.  */
83*38fd1498Szrj     GOMP_MAP_FIRSTPRIVATE_INT =		(GOMP_MAP_FLAG_SPECIAL | 1),
84*38fd1498Szrj     /* Pointer translate host address into device address and copy that
85*38fd1498Szrj        back to host.  */
86*38fd1498Szrj     GOMP_MAP_USE_DEVICE_PTR =		(GOMP_MAP_FLAG_SPECIAL | 2),
87*38fd1498Szrj     /* Allocate a zero length array section.  Prefer next non-zero length
88*38fd1498Szrj        mapping over previous non-zero length mapping over zero length mapping
89*38fd1498Szrj        at the address.  If not already mapped, do nothing (and pointer translate
90*38fd1498Szrj        to NULL).  */
91*38fd1498Szrj     GOMP_MAP_ZERO_LEN_ARRAY_SECTION = 	(GOMP_MAP_FLAG_SPECIAL | 3),
92*38fd1498Szrj     /* Allocate.  */
93*38fd1498Szrj     GOMP_MAP_FORCE_ALLOC =		(GOMP_MAP_FLAG_FORCE | GOMP_MAP_ALLOC),
94*38fd1498Szrj     /* ..., and copy to device.  */
95*38fd1498Szrj     GOMP_MAP_FORCE_TO =			(GOMP_MAP_FLAG_FORCE | GOMP_MAP_TO),
96*38fd1498Szrj     /* ..., and copy from device.  */
97*38fd1498Szrj     GOMP_MAP_FORCE_FROM =		(GOMP_MAP_FLAG_FORCE | GOMP_MAP_FROM),
98*38fd1498Szrj     /* ..., and copy to and from device.  */
99*38fd1498Szrj     GOMP_MAP_FORCE_TOFROM =		(GOMP_MAP_FLAG_FORCE | GOMP_MAP_TOFROM),
100*38fd1498Szrj     /* If not already present, allocate.  And unconditionally copy to
101*38fd1498Szrj        device.  */
102*38fd1498Szrj     GOMP_MAP_ALWAYS_TO =		(GOMP_MAP_FLAG_SPECIAL_2 | GOMP_MAP_TO),
103*38fd1498Szrj     /* If not already present, allocate.  And unconditionally copy from
104*38fd1498Szrj        device.  */
105*38fd1498Szrj     GOMP_MAP_ALWAYS_FROM =		(GOMP_MAP_FLAG_SPECIAL_2
106*38fd1498Szrj 					 | GOMP_MAP_FROM),
107*38fd1498Szrj     /* If not already present, allocate.  And unconditionally copy to and from
108*38fd1498Szrj        device.  */
109*38fd1498Szrj     GOMP_MAP_ALWAYS_TOFROM =		(GOMP_MAP_FLAG_SPECIAL_2
110*38fd1498Szrj 					 | GOMP_MAP_TOFROM),
111*38fd1498Szrj     /* Map a sparse struct; the address is the base of the structure, alignment
112*38fd1498Szrj        it's required alignment, and size is the number of adjacent entries
113*38fd1498Szrj        that belong to the struct.  The adjacent entries should be sorted by
114*38fd1498Szrj        increasing address, so it is easy to determine lowest needed address
115*38fd1498Szrj        (address of the first adjacent entry) and highest needed address
116*38fd1498Szrj        (address of the last adjacent entry plus its size).  */
117*38fd1498Szrj     GOMP_MAP_STRUCT =			(GOMP_MAP_FLAG_SPECIAL_2
118*38fd1498Szrj 					 | GOMP_MAP_FLAG_SPECIAL | 0),
119*38fd1498Szrj     /* On a location of a pointer/reference that is assumed to be already mapped
120*38fd1498Szrj        earlier, store the translated address of the preceeding mapping.
121*38fd1498Szrj        No refcount is bumped by this, and the store is done unconditionally.  */
122*38fd1498Szrj     GOMP_MAP_ALWAYS_POINTER =		(GOMP_MAP_FLAG_SPECIAL_2
123*38fd1498Szrj 					 | GOMP_MAP_FLAG_SPECIAL | 1),
124*38fd1498Szrj     /* Forced deallocation of zero length array section.  */
125*38fd1498Szrj     GOMP_MAP_DELETE_ZERO_LEN_ARRAY_SECTION
126*38fd1498Szrj       =					(GOMP_MAP_FLAG_SPECIAL_2
127*38fd1498Szrj 					 | GOMP_MAP_FLAG_SPECIAL | 3),
128*38fd1498Szrj     /* Decrement usage count and deallocate if zero.  */
129*38fd1498Szrj     GOMP_MAP_RELEASE =			(GOMP_MAP_FLAG_SPECIAL_2
130*38fd1498Szrj 					 | GOMP_MAP_DELETE),
131*38fd1498Szrj 
132*38fd1498Szrj     /* Internal to GCC, not used in libgomp.  */
133*38fd1498Szrj     /* Do not map, but pointer assign a pointer instead.  */
134*38fd1498Szrj     GOMP_MAP_FIRSTPRIVATE_POINTER =	(GOMP_MAP_LAST | 1),
135*38fd1498Szrj     /* Do not map, but pointer assign a reference instead.  */
136*38fd1498Szrj     GOMP_MAP_FIRSTPRIVATE_REFERENCE =	(GOMP_MAP_LAST | 2)
137*38fd1498Szrj   };
138*38fd1498Szrj 
139*38fd1498Szrj #define GOMP_MAP_COPY_TO_P(X) \
140*38fd1498Szrj   (!((X) & GOMP_MAP_FLAG_SPECIAL) \
141*38fd1498Szrj    && ((X) & GOMP_MAP_FLAG_TO))
142*38fd1498Szrj 
143*38fd1498Szrj #define GOMP_MAP_COPY_FROM_P(X) \
144*38fd1498Szrj   (!((X) & GOMP_MAP_FLAG_SPECIAL) \
145*38fd1498Szrj    && ((X) & GOMP_MAP_FLAG_FROM))
146*38fd1498Szrj 
147*38fd1498Szrj #define GOMP_MAP_POINTER_P(X) \
148*38fd1498Szrj   ((X) == GOMP_MAP_POINTER)
149*38fd1498Szrj 
150*38fd1498Szrj #define GOMP_MAP_ALWAYS_TO_P(X) \
151*38fd1498Szrj   (((X) == GOMP_MAP_ALWAYS_TO) || ((X) == GOMP_MAP_ALWAYS_TOFROM))
152*38fd1498Szrj 
153*38fd1498Szrj #define GOMP_MAP_ALWAYS_FROM_P(X) \
154*38fd1498Szrj   (((X) == GOMP_MAP_ALWAYS_FROM) || ((X) == GOMP_MAP_ALWAYS_TOFROM))
155*38fd1498Szrj 
156*38fd1498Szrj #define GOMP_MAP_ALWAYS_P(X) \
157*38fd1498Szrj   (GOMP_MAP_ALWAYS_TO_P (X) || ((X) == GOMP_MAP_ALWAYS_FROM))
158*38fd1498Szrj 
159*38fd1498Szrj 
160*38fd1498Szrj /* Asynchronous behavior.  Keep in sync with
161*38fd1498Szrj    libgomp/{openacc.h,openacc.f90,openacc_lib.h}:acc_async_t.  */
162*38fd1498Szrj 
163*38fd1498Szrj #define GOMP_ASYNC_NOVAL		-1
164*38fd1498Szrj #define GOMP_ASYNC_SYNC			-2
165*38fd1498Szrj 
166*38fd1498Szrj 
167*38fd1498Szrj /* Device codes.  Keep in sync with
168*38fd1498Szrj    libgomp/{openacc.h,openacc.f90,openacc_lib.h}:acc_device_t as well as
169*38fd1498Szrj    libgomp/libgomp-plugin.h.  */
170*38fd1498Szrj #define GOMP_DEVICE_NONE		0
171*38fd1498Szrj #define GOMP_DEVICE_DEFAULT		1
172*38fd1498Szrj #define GOMP_DEVICE_HOST		2
173*38fd1498Szrj /* #define GOMP_DEVICE_HOST_NONSHM	3 removed.  */
174*38fd1498Szrj #define GOMP_DEVICE_NOT_HOST		4
175*38fd1498Szrj #define GOMP_DEVICE_NVIDIA_PTX		5
176*38fd1498Szrj #define GOMP_DEVICE_INTEL_MIC		6
177*38fd1498Szrj #define GOMP_DEVICE_HSA			7
178*38fd1498Szrj 
179*38fd1498Szrj #define GOMP_DEVICE_ICV			-1
180*38fd1498Szrj #define GOMP_DEVICE_HOST_FALLBACK	-2
181*38fd1498Szrj 
182*38fd1498Szrj /* GOMP_task/GOMP_taskloop* flags argument.  */
183*38fd1498Szrj #define GOMP_TASK_FLAG_UNTIED		(1 << 0)
184*38fd1498Szrj #define GOMP_TASK_FLAG_FINAL		(1 << 1)
185*38fd1498Szrj #define GOMP_TASK_FLAG_MERGEABLE	(1 << 2)
186*38fd1498Szrj #define GOMP_TASK_FLAG_DEPEND		(1 << 3)
187*38fd1498Szrj #define GOMP_TASK_FLAG_PRIORITY		(1 << 4)
188*38fd1498Szrj #define GOMP_TASK_FLAG_UP		(1 << 8)
189*38fd1498Szrj #define GOMP_TASK_FLAG_GRAINSIZE	(1 << 9)
190*38fd1498Szrj #define GOMP_TASK_FLAG_IF		(1 << 10)
191*38fd1498Szrj #define GOMP_TASK_FLAG_NOGROUP		(1 << 11)
192*38fd1498Szrj 
193*38fd1498Szrj /* GOMP_target{_ext,update_ext,enter_exit_data} flags argument.  */
194*38fd1498Szrj #define GOMP_TARGET_FLAG_NOWAIT		(1 << 0)
195*38fd1498Szrj #define GOMP_TARGET_FLAG_EXIT_DATA	(1 << 1)
196*38fd1498Szrj /* Internal to libgomp.  */
197*38fd1498Szrj #define GOMP_TARGET_FLAG_UPDATE		(1U << 31)
198*38fd1498Szrj 
199*38fd1498Szrj /* Versions of libgomp and device-specific plugins.  GOMP_VERSION
200*38fd1498Szrj    should be incremented whenever an ABI-incompatible change is introduced
201*38fd1498Szrj    to the plugin interface defined in libgomp/libgomp.h.  */
202*38fd1498Szrj #define GOMP_VERSION	1
203*38fd1498Szrj #define GOMP_VERSION_NVIDIA_PTX 1
204*38fd1498Szrj #define GOMP_VERSION_INTEL_MIC 0
205*38fd1498Szrj #define GOMP_VERSION_HSA 0
206*38fd1498Szrj 
207*38fd1498Szrj #define GOMP_VERSION_PACK(LIB, DEV) (((LIB) << 16) | (DEV))
208*38fd1498Szrj #define GOMP_VERSION_LIB(PACK) (((PACK) >> 16) & 0xffff)
209*38fd1498Szrj #define GOMP_VERSION_DEV(PACK) ((PACK) & 0xffff)
210*38fd1498Szrj 
211*38fd1498Szrj #define GOMP_DIM_GANG	0
212*38fd1498Szrj #define GOMP_DIM_WORKER	1
213*38fd1498Szrj #define GOMP_DIM_VECTOR	2
214*38fd1498Szrj #define GOMP_DIM_MAX	3
215*38fd1498Szrj #define GOMP_DIM_MASK(X) (1u << (X))
216*38fd1498Szrj 
217*38fd1498Szrj /* Varadic launch arguments.  End of list is marked by a zero.  */
218*38fd1498Szrj #define GOMP_LAUNCH_DIM		1  /* Launch dimensions, op = mask */
219*38fd1498Szrj #define GOMP_LAUNCH_ASYNC	2  /* Async, op = cst val if not MAX  */
220*38fd1498Szrj #define GOMP_LAUNCH_WAIT	3  /* Waits, op = num waits.  */
221*38fd1498Szrj #define GOMP_LAUNCH_CODE_SHIFT	28
222*38fd1498Szrj #define GOMP_LAUNCH_DEVICE_SHIFT 16
223*38fd1498Szrj #define GOMP_LAUNCH_OP_SHIFT 0
224*38fd1498Szrj #define GOMP_LAUNCH_PACK(CODE,DEVICE,OP)	\
225*38fd1498Szrj   (((CODE) << GOMP_LAUNCH_CODE_SHIFT)		\
226*38fd1498Szrj    | ((DEVICE) << GOMP_LAUNCH_DEVICE_SHIFT)	\
227*38fd1498Szrj    | ((OP) << GOMP_LAUNCH_OP_SHIFT))
228*38fd1498Szrj #define GOMP_LAUNCH_CODE(X) (((X) >> GOMP_LAUNCH_CODE_SHIFT) & 0xf)
229*38fd1498Szrj #define GOMP_LAUNCH_DEVICE(X) (((X) >> GOMP_LAUNCH_DEVICE_SHIFT) & 0xfff)
230*38fd1498Szrj #define GOMP_LAUNCH_OP(X) (((X) >> GOMP_LAUNCH_OP_SHIFT) & 0xffff)
231*38fd1498Szrj #define GOMP_LAUNCH_OP_MAX 0xffff
232*38fd1498Szrj 
233*38fd1498Szrj /* Bitmask to apply in order to find out the intended device of a target
234*38fd1498Szrj    argument.  */
235*38fd1498Szrj #define GOMP_TARGET_ARG_DEVICE_MASK		((1 << 7) - 1)
236*38fd1498Szrj /* The target argument is significant for all devices.  */
237*38fd1498Szrj #define GOMP_TARGET_ARG_DEVICE_ALL		0
238*38fd1498Szrj 
239*38fd1498Szrj /* Flag set when the subsequent element in the device-specific argument
240*38fd1498Szrj    values.  */
241*38fd1498Szrj #define GOMP_TARGET_ARG_SUBSEQUENT_PARAM	(1 << 7)
242*38fd1498Szrj 
243*38fd1498Szrj /* Bitmask to apply to a target argument to find out the value identifier.  */
244*38fd1498Szrj #define GOMP_TARGET_ARG_ID_MASK			(((1 << 8) - 1) << 8)
245*38fd1498Szrj /* Target argument index of NUM_TEAMS.  */
246*38fd1498Szrj #define GOMP_TARGET_ARG_NUM_TEAMS		(1 << 8)
247*38fd1498Szrj /* Target argument index of THREAD_LIMIT.  */
248*38fd1498Szrj #define GOMP_TARGET_ARG_THREAD_LIMIT		(2 << 8)
249*38fd1498Szrj 
250*38fd1498Szrj /* If the value is directly embeded in target argument, it should be a 16-bit
251*38fd1498Szrj    at most and shifted by this many bits.  */
252*38fd1498Szrj #define GOMP_TARGET_ARG_VALUE_SHIFT		16
253*38fd1498Szrj 
254*38fd1498Szrj /* HSA specific data structures.  */
255*38fd1498Szrj 
256*38fd1498Szrj /* Identifiers of device-specific target arguments.  */
257*38fd1498Szrj #define GOMP_TARGET_ARG_HSA_KERNEL_ATTRIBUTES	(1 << 8)
258*38fd1498Szrj 
259*38fd1498Szrj #endif
260