@@ -8775,7 +8775,7 @@ lower_oacc_parallel (gimple_stmt_iterator *gsi_p, omp_context *ctx)
TREE_ADDRESSABLE (TREE_VEC_ELT (t, 1)) = 1;
TREE_STATIC (TREE_VEC_ELT (t, 1)) = 1;
TREE_VEC_ELT (t, 2)
- = create_tmp_var (build_array_type_nelts (unsigned_char_type_node,
+ = create_tmp_var (build_array_type_nelts (short_unsigned_type_node,
map_cnt),
".omp_data_kinds");
DECL_NAMELESS (TREE_VEC_ELT (t, 2)) = 1;
@@ -8884,7 +8884,7 @@ lower_oacc_parallel (gimple_stmt_iterator *gsi_p, omp_context *ctx)
if (TREE_CODE (s) != INTEGER_CST)
TREE_STATIC (TREE_VEC_ELT (t, 1)) = 0;
- unsigned char tkind = 0;
+ unsigned short tkind = 0;
switch (OMP_CLAUSE_CODE (c))
{
case OMP_CLAUSE_MAP:
@@ -8903,9 +8903,9 @@ lower_oacc_parallel (gimple_stmt_iterator *gsi_p, omp_context *ctx)
if (DECL_P (ovar) && DECL_ALIGN_UNIT (ovar) > talign)
talign = DECL_ALIGN_UNIT (ovar);
talign = ceil_log2 (talign);
- tkind |= talign << 3;
+ tkind |= talign << 8;
CONSTRUCTOR_APPEND_ELT (vkind, purpose,
- build_int_cst (unsigned_char_type_node,
+ build_int_cst (short_unsigned_type_node,
tkind));
if (nc && nc != c)
c = nc;
@@ -217,6 +217,6 @@ extern void GOMP_teams (unsigned int, unsigned int);
/* oacc-parallel.c */
extern void GOACC_parallel (int, void (*) (void *), const void *,
- size_t, void **, size_t *, unsigned char *);
+ size_t, void **, size_t *, unsigned short *);
#endif /* LIBGOMP_G_H */
@@ -25,12 +25,29 @@
/* This file handles the OpenACC parallel construct. */
+#include "libgomp.h"
#include "libgomp_g.h"
void
GOACC_parallel (int device, void (*fn) (void *), const void *openmp_target,
size_t mapnum, void **hostaddrs, size_t *sizes,
- unsigned char *kinds)
+ unsigned short *kinds)
{
- GOMP_target (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds);
+ unsigned char kinds_[mapnum];
+ size_t i;
+
+ /* TODO. Eventually, we'll be interpreting all mapping kinds according to
+ the OpenACC semantics; for now we're re-using what is implemented for
+ OpenMP. */
+ for (i = 0; i < mapnum; ++i)
+ {
+ unsigned char kind = kinds[i];
+ unsigned char align = kinds[i] >> 8;
+ if (kind > 4)
+ gomp_fatal ("memory mapping kind %x for %zd is not yet supported",
+ kind, i);
+
+ kinds_[i] = kind | align << 3;
+ }
+ GOMP_target (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds_);
}