mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			260 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			260 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
| /* Communication between GCC and libgomp.
 | |
| 
 | |
|    Copyright (C) 2014-2015 Free Software Foundation, Inc.
 | |
| 
 | |
|    Contributed by Mentor Embedded.
 | |
| 
 | |
|    This file is part of the GNU Offloading and Multi Processing Library
 | |
|    (libgomp).
 | |
| 
 | |
|    Libgomp is free software; you can redistribute it and/or modify it
 | |
|    under the terms of the GNU General Public License as published by
 | |
|    the Free Software Foundation; either version 3, or (at your option)
 | |
|    any later version.
 | |
| 
 | |
|    Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
 | |
|    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | |
|    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | |
|    more details.
 | |
| 
 | |
|    Under Section 7 of GPL version 3, you are granted additional
 | |
|    permissions described in the GCC Runtime Library Exception, version
 | |
|    3.1, as published by the Free Software Foundation.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License and
 | |
|    a copy of the GCC Runtime Library Exception along with this program;
 | |
|    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 | |
|    <http://www.gnu.org/licenses/>.  */
 | |
| 
 | |
| #ifndef GOMP_CONSTANTS_H
 | |
| #define GOMP_CONSTANTS_H 1
 | |
| 
 | |
| /* Memory mapping types.  */
 | |
| 
 | |
| /* One byte.  */
 | |
| #define GOMP_MAP_LAST			(1 << 8)
 | |
| 
 | |
| #define GOMP_MAP_FLAG_TO		(1 << 0)
 | |
| #define GOMP_MAP_FLAG_FROM		(1 << 1)
 | |
| /* Special map kinds, enumerated starting here.  */
 | |
| #define GOMP_MAP_FLAG_SPECIAL_0		(1 << 2)
 | |
| #define GOMP_MAP_FLAG_SPECIAL_1		(1 << 3)
 | |
| #define GOMP_MAP_FLAG_SPECIAL_2		(1 << 4)
 | |
| #define GOMP_MAP_FLAG_SPECIAL		(GOMP_MAP_FLAG_SPECIAL_1 \
 | |
| 					 | GOMP_MAP_FLAG_SPECIAL_0)
 | |
| /* Flag to force a specific behavior (or else, trigger a run-time error).  */
 | |
| #define GOMP_MAP_FLAG_FORCE		(1 << 7)
 | |
| 
 | |
| enum gomp_map_kind
 | |
|   {
 | |
|     /* If not already present, allocate.  */
 | |
|     GOMP_MAP_ALLOC =			0,
 | |
|     /* ..., and copy to device.  */
 | |
|     GOMP_MAP_TO =			(GOMP_MAP_ALLOC | GOMP_MAP_FLAG_TO),
 | |
|     /* ..., and copy from device.  */
 | |
|     GOMP_MAP_FROM =			(GOMP_MAP_ALLOC | GOMP_MAP_FLAG_FROM),
 | |
|     /* ..., and copy to and from device.  */
 | |
|     GOMP_MAP_TOFROM =			(GOMP_MAP_TO | GOMP_MAP_FROM),
 | |
|     /* The following kind is an internal only map kind, used for pointer based
 | |
|        array sections.  OMP_CLAUSE_SIZE for these is not the pointer size,
 | |
|        which is implicitly POINTER_SIZE_UNITS, but the bias.  */
 | |
|     GOMP_MAP_POINTER =			(GOMP_MAP_FLAG_SPECIAL_0 | 0),
 | |
|     /* Also internal, behaves like GOMP_MAP_TO, but additionally any
 | |
|        GOMP_MAP_POINTER records consecutive after it which have addresses
 | |
|        falling into that range will not be ignored if GOMP_MAP_TO_PSET wasn't
 | |
|        mapped already.  */
 | |
|     GOMP_MAP_TO_PSET =			(GOMP_MAP_FLAG_SPECIAL_0 | 1),
 | |
|     /* Must already be present.  */
 | |
|     GOMP_MAP_FORCE_PRESENT =		(GOMP_MAP_FLAG_SPECIAL_0 | 2),
 | |
|     /* Deallocate a mapping, without copying from device.  */
 | |
|     GOMP_MAP_DELETE =			(GOMP_MAP_FLAG_SPECIAL_0 | 3),
 | |
|     /* Is a device pointer.  OMP_CLAUSE_SIZE for these is unused; is implicitly
 | |
|        POINTER_SIZE_UNITS.  */
 | |
|     GOMP_MAP_FORCE_DEVICEPTR =		(GOMP_MAP_FLAG_SPECIAL_1 | 0),
 | |
|     /* Do not map, copy bits for firstprivate instead.  */
 | |
|     /* OpenACC device_resident.  */
 | |
|     GOMP_MAP_DEVICE_RESIDENT =		(GOMP_MAP_FLAG_SPECIAL_1 | 1),
 | |
|     /* OpenACC link.  */
 | |
|     GOMP_MAP_LINK =			(GOMP_MAP_FLAG_SPECIAL_1 | 2),
 | |
|     /* Allocate.  */
 | |
|     GOMP_MAP_FIRSTPRIVATE =		(GOMP_MAP_FLAG_SPECIAL | 0),
 | |
|     /* Similarly, but store the value in the pointer rather than
 | |
|        pointed by the pointer.  */
 | |
|     GOMP_MAP_FIRSTPRIVATE_INT =		(GOMP_MAP_FLAG_SPECIAL | 1),
 | |
|     /* Pointer translate host address into device address and copy that
 | |
|        back to host.  */
 | |
|     GOMP_MAP_USE_DEVICE_PTR =		(GOMP_MAP_FLAG_SPECIAL | 2),
 | |
|     /* Allocate a zero length array section.  Prefer next non-zero length
 | |
|        mapping over previous non-zero length mapping over zero length mapping
 | |
|        at the address.  If not already mapped, do nothing (and pointer translate
 | |
|        to NULL).  */
 | |
|     GOMP_MAP_ZERO_LEN_ARRAY_SECTION = 	(GOMP_MAP_FLAG_SPECIAL | 3),
 | |
|     /* Allocate.  */
 | |
|     GOMP_MAP_FORCE_ALLOC =		(GOMP_MAP_FLAG_FORCE | GOMP_MAP_ALLOC),
 | |
|     /* ..., and copy to device.  */
 | |
|     GOMP_MAP_FORCE_TO =			(GOMP_MAP_FLAG_FORCE | GOMP_MAP_TO),
 | |
|     /* ..., and copy from device.  */
 | |
|     GOMP_MAP_FORCE_FROM =		(GOMP_MAP_FLAG_FORCE | GOMP_MAP_FROM),
 | |
|     /* ..., and copy to and from device.  */
 | |
|     GOMP_MAP_FORCE_TOFROM =		(GOMP_MAP_FLAG_FORCE | GOMP_MAP_TOFROM),
 | |
|     /* If not already present, allocate.  And unconditionally copy to
 | |
|        device.  */
 | |
|     GOMP_MAP_ALWAYS_TO =		(GOMP_MAP_FLAG_SPECIAL_2 | GOMP_MAP_TO),
 | |
|     /* If not already present, allocate.  And unconditionally copy from
 | |
|        device.  */
 | |
|     GOMP_MAP_ALWAYS_FROM =		(GOMP_MAP_FLAG_SPECIAL_2
 | |
| 					 | GOMP_MAP_FROM),
 | |
|     /* If not already present, allocate.  And unconditionally copy to and from
 | |
|        device.  */
 | |
|     GOMP_MAP_ALWAYS_TOFROM =		(GOMP_MAP_FLAG_SPECIAL_2
 | |
| 					 | GOMP_MAP_TOFROM),
 | |
|     /* Map a sparse struct; the address is the base of the structure, alignment
 | |
|        it's required alignment, and size is the number of adjacent entries
 | |
|        that belong to the struct.  The adjacent entries should be sorted by
 | |
|        increasing address, so it is easy to determine lowest needed address
 | |
|        (address of the first adjacent entry) and highest needed address
 | |
|        (address of the last adjacent entry plus its size).  */
 | |
|     GOMP_MAP_STRUCT =			(GOMP_MAP_FLAG_SPECIAL_2
 | |
| 					 | GOMP_MAP_FLAG_SPECIAL | 0),
 | |
|     /* On a location of a pointer/reference that is assumed to be already mapped
 | |
|        earlier, store the translated address of the preceeding mapping.
 | |
|        No refcount is bumped by this, and the store is done unconditionally.  */
 | |
|     GOMP_MAP_ALWAYS_POINTER =		(GOMP_MAP_FLAG_SPECIAL_2
 | |
| 					 | GOMP_MAP_FLAG_SPECIAL | 1),
 | |
|     /* Forced deallocation of zero length array section.  */
 | |
|     GOMP_MAP_DELETE_ZERO_LEN_ARRAY_SECTION
 | |
|       =					(GOMP_MAP_FLAG_SPECIAL_2
 | |
| 					 | GOMP_MAP_FLAG_SPECIAL | 3),
 | |
|     /* Decrement usage count and deallocate if zero.  */
 | |
|     GOMP_MAP_RELEASE =			(GOMP_MAP_FLAG_SPECIAL_2
 | |
| 					 | GOMP_MAP_DELETE),
 | |
| 
 | |
|     /* Internal to GCC, not used in libgomp.  */
 | |
|     /* Do not map, but pointer assign a pointer instead.  */
 | |
|     GOMP_MAP_FIRSTPRIVATE_POINTER =	(GOMP_MAP_LAST | 1),
 | |
|     /* Do not map, but pointer assign a reference instead.  */
 | |
|     GOMP_MAP_FIRSTPRIVATE_REFERENCE =	(GOMP_MAP_LAST | 2)
 | |
|   };
 | |
| 
 | |
| #define GOMP_MAP_COPY_TO_P(X) \
 | |
|   (!((X) & GOMP_MAP_FLAG_SPECIAL) \
 | |
|    && ((X) & GOMP_MAP_FLAG_TO))
 | |
| 
 | |
| #define GOMP_MAP_COPY_FROM_P(X) \
 | |
|   (!((X) & GOMP_MAP_FLAG_SPECIAL) \
 | |
|    && ((X) & GOMP_MAP_FLAG_FROM))
 | |
| 
 | |
| #define GOMP_MAP_POINTER_P(X) \
 | |
|   ((X) == GOMP_MAP_POINTER)
 | |
| 
 | |
| #define GOMP_MAP_ALWAYS_TO_P(X) \
 | |
|   (((X) == GOMP_MAP_ALWAYS_TO) || ((X) == GOMP_MAP_ALWAYS_TOFROM))
 | |
| 
 | |
| #define GOMP_MAP_ALWAYS_FROM_P(X) \
 | |
|   (((X) == GOMP_MAP_ALWAYS_FROM) || ((X) == GOMP_MAP_ALWAYS_TOFROM))
 | |
| 
 | |
| #define GOMP_MAP_ALWAYS_P(X) \
 | |
|   (GOMP_MAP_ALWAYS_TO_P (X) || ((X) == GOMP_MAP_ALWAYS_FROM))
 | |
| 
 | |
| 
 | |
| /* Asynchronous behavior.  Keep in sync with
 | |
|    libgomp/{openacc.h,openacc.f90,openacc_lib.h}:acc_async_t.  */
 | |
| 
 | |
| #define GOMP_ASYNC_NOVAL		-1
 | |
| #define GOMP_ASYNC_SYNC			-2
 | |
| 
 | |
| 
 | |
| /* Device codes.  Keep in sync with
 | |
|    libgomp/{openacc.h,openacc.f90,openacc_lib.h}:acc_device_t as well as
 | |
|    libgomp/libgomp-plugin.h.  */
 | |
| #define GOMP_DEVICE_NONE		0
 | |
| #define GOMP_DEVICE_DEFAULT		1
 | |
| #define GOMP_DEVICE_HOST		2
 | |
| /* #define GOMP_DEVICE_HOST_NONSHM	3 removed.  */
 | |
| #define GOMP_DEVICE_NOT_HOST		4
 | |
| #define GOMP_DEVICE_NVIDIA_PTX		5
 | |
| #define GOMP_DEVICE_INTEL_MIC		6
 | |
| #define GOMP_DEVICE_HSA			7
 | |
| 
 | |
| #define GOMP_DEVICE_ICV			-1
 | |
| #define GOMP_DEVICE_HOST_FALLBACK	-2
 | |
| 
 | |
| /* GOMP_task/GOMP_taskloop* flags argument.  */
 | |
| #define GOMP_TASK_FLAG_UNTIED		(1 << 0)
 | |
| #define GOMP_TASK_FLAG_FINAL		(1 << 1)
 | |
| #define GOMP_TASK_FLAG_MERGEABLE	(1 << 2)
 | |
| #define GOMP_TASK_FLAG_DEPEND		(1 << 3)
 | |
| #define GOMP_TASK_FLAG_PRIORITY		(1 << 4)
 | |
| #define GOMP_TASK_FLAG_UP		(1 << 8)
 | |
| #define GOMP_TASK_FLAG_GRAINSIZE	(1 << 9)
 | |
| #define GOMP_TASK_FLAG_IF		(1 << 10)
 | |
| #define GOMP_TASK_FLAG_NOGROUP		(1 << 11)
 | |
| 
 | |
| /* GOMP_target{_ext,update_ext,enter_exit_data} flags argument.  */
 | |
| #define GOMP_TARGET_FLAG_NOWAIT		(1 << 0)
 | |
| #define GOMP_TARGET_FLAG_EXIT_DATA	(1 << 1)
 | |
| /* Internal to libgomp.  */
 | |
| #define GOMP_TARGET_FLAG_UPDATE		(1U << 31)
 | |
| 
 | |
| /* Versions of libgomp and device-specific plugins.  GOMP_VERSION
 | |
|    should be incremented whenever an ABI-incompatible change is introduced
 | |
|    to the plugin interface defined in libgomp/libgomp.h.  */
 | |
| #define GOMP_VERSION	1
 | |
| #define GOMP_VERSION_NVIDIA_PTX 1
 | |
| #define GOMP_VERSION_INTEL_MIC 0
 | |
| #define GOMP_VERSION_HSA 0
 | |
| 
 | |
| #define GOMP_VERSION_PACK(LIB, DEV) (((LIB) << 16) | (DEV))
 | |
| #define GOMP_VERSION_LIB(PACK) (((PACK) >> 16) & 0xffff)
 | |
| #define GOMP_VERSION_DEV(PACK) ((PACK) & 0xffff)
 | |
| 
 | |
| #define GOMP_DIM_GANG	0
 | |
| #define GOMP_DIM_WORKER	1
 | |
| #define GOMP_DIM_VECTOR	2
 | |
| #define GOMP_DIM_MAX	3
 | |
| #define GOMP_DIM_MASK(X) (1u << (X))
 | |
| 
 | |
| /* Varadic launch arguments.  End of list is marked by a zero.  */
 | |
| #define GOMP_LAUNCH_DIM		1  /* Launch dimensions, op = mask */
 | |
| #define GOMP_LAUNCH_ASYNC	2  /* Async, op = cst val if not MAX  */
 | |
| #define GOMP_LAUNCH_WAIT	3  /* Waits, op = num waits.  */
 | |
| #define GOMP_LAUNCH_CODE_SHIFT	28
 | |
| #define GOMP_LAUNCH_DEVICE_SHIFT 16
 | |
| #define GOMP_LAUNCH_OP_SHIFT 0
 | |
| #define GOMP_LAUNCH_PACK(CODE,DEVICE,OP)	\
 | |
|   (((CODE) << GOMP_LAUNCH_CODE_SHIFT)		\
 | |
|    | ((DEVICE) << GOMP_LAUNCH_DEVICE_SHIFT)	\
 | |
|    | ((OP) << GOMP_LAUNCH_OP_SHIFT))
 | |
| #define GOMP_LAUNCH_CODE(X) (((X) >> GOMP_LAUNCH_CODE_SHIFT) & 0xf)
 | |
| #define GOMP_LAUNCH_DEVICE(X) (((X) >> GOMP_LAUNCH_DEVICE_SHIFT) & 0xfff)
 | |
| #define GOMP_LAUNCH_OP(X) (((X) >> GOMP_LAUNCH_OP_SHIFT) & 0xffff)
 | |
| #define GOMP_LAUNCH_OP_MAX 0xffff
 | |
| 
 | |
| /* Bitmask to apply in order to find out the intended device of a target
 | |
|    argument.  */
 | |
| #define GOMP_TARGET_ARG_DEVICE_MASK		((1 << 7) - 1)
 | |
| /* The target argument is significant for all devices.  */
 | |
| #define GOMP_TARGET_ARG_DEVICE_ALL		0
 | |
| 
 | |
| /* Flag set when the subsequent element in the device-specific argument
 | |
|    values.  */
 | |
| #define GOMP_TARGET_ARG_SUBSEQUENT_PARAM	(1 << 7)
 | |
| 
 | |
| /* Bitmask to apply to a target argument to find out the value identifier.  */
 | |
| #define GOMP_TARGET_ARG_ID_MASK			(((1 << 8) - 1) << 8)
 | |
| /* Target argument index of NUM_TEAMS.  */
 | |
| #define GOMP_TARGET_ARG_NUM_TEAMS		(1 << 8)
 | |
| /* Target argument index of THREAD_LIMIT.  */
 | |
| #define GOMP_TARGET_ARG_THREAD_LIMIT		(2 << 8)
 | |
| 
 | |
| /* If the value is directly embeded in target argument, it should be a 16-bit
 | |
|    at most and shifted by this many bits.  */
 | |
| #define GOMP_TARGET_ARG_VALUE_SHIFT		16
 | |
| 
 | |
| /* HSA specific data structures.  */
 | |
| 
 | |
| /* Identifiers of device-specific target arguments.  */
 | |
| #define GOMP_TARGET_ARG_HSA_KERNEL_ATTRIBUTES	(1 << 8)
 | |
| 
 | |
| #endif
 |