Hi!
On Wed, 19 Dec 2018 00:24:00 +0100, I wrote:
> OpenACC 2.6 adds a new clause to the "host_data" construct:
> 2.8.3. "if_present clause". Gergő (in CC) is working on that.
>
> When an 'if_present' clause appears on the directive, the compiler
> will only change the address of any variable or array which appears
> in _var-list_ that is present on the current device.
>
> So, basically:
>
> --- a/libgomp/target.c
> +++ b/libgomp/target.c
> @@ -1130,13 +1130,17 @@ gomp_map_vars_async (struct gomp_device_descr
> *devicep,
> else if ((kind & typemask) == GOMP_MAP_USE_DEVICE_PTR)
> {
> cur_node.host_start = (uintptr_t) hostaddrs[i];
> cur_node.host_end = cur_node.host_start;
> splay_tree_key n = gomp_map_lookup (mem_map, &cur_node);
> if (n == NULL)
> {
> + if ([...])
> + /* No error, continue using the host address. */
> + continue;
> gomp_mutex_unlock (&devicep->lock);
> gomp_fatal ("use_device_ptr pointer wasn't mapped");
> }
>
> Note that this clause applies to *all* "use_device"
> ("GOMP_MAP_USE_DEVICE_PTR") clauses present on the "host_data" construct,
> so it's just a single bit flag for the construct.
>
> Do you suggest we yet add a new mapping kind
> "GOMP_MAP_USE_DEVICE_PTR_IF_PRESENT" for that? And, any preference about
> the specific value to use? Gergő proposed:
>
> --- a/include/gomp-constants.h
> +++ b/include/gomp-constants.h
> @@ -80,6 +80,10 @@ enum gomp_map_kind
> GOMP_MAP_DEVICE_RESIDENT = (GOMP_MAP_FLAG_SPECIAL_1 | 1),
> /* OpenACC link. */
> GOMP_MAP_LINK = (GOMP_MAP_FLAG_SPECIAL_1 | 2),
> + /* Like GOMP_MAP_USE_DEVICE_PTR below, translate a host to a device
> + address. If translation fails because the target is not mapped,
> + continue using the host address. */
> + GOMP_MAP_USE_DEVICE_PTR_IF_PRESENT =
> (GOMP_MAP_FLAG_SPECIAL_1 | 3),
> /* Allocate. */
> GOMP_MAP_FIRSTPRIVATE = (GOMP_MAP_FLAG_SPECIAL | 0),
> /* Similarly, but store the value in the pointer rather than
>
> Or, I had the idea that we could avoid that, instead continue using
> "GOMP_MAP_USE_DEVICE_PTR", and transmit the "if_present" flag through the
> "int device" argument of "GOACC_data_start" (making sure that old
> executables continue to function as before). For OpenACC, that argument
> is only ever set to "GOMP_DEVICE_ICV" or "GOMP_DEVICE_HOST_FALLBACK" (for
> "if" clause evaluating to "false"), so has some bits to spare for that.
> However, I've not been able to convince myself that this solution would
> be any much prettier than adding a new mapping kind... ;-)
Having thought about it some more, the idea doesn't actually seem so bad
anymore. :-) Just don't think of it as 'merging stuff into "int
device"', but rather 'for OpenACC libgomp entry points, redefine the "int
device" argument to "unsigned int flags"' -- see attached WIP (for GCC
trunk, testing).
Jakub, what do you think?
For the "if_present" clause, we'd then initialize "tree flags" not to
zero but to "omp_find_clause (OMP_CLAUSE_IF_PRESENT) ?
GOACC_FLAG_IF_PRESENT : 0" or similar, and then handle that in libgomp.
Grüße
Thomas
>From 1a45ffa3da47f1ec2e62badc31ae31454f4351d9 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <[email protected]>
Date: Wed, 19 Dec 2018 13:37:00 +0100
Subject: [PATCH] For OpenACC libgomp entry points, redefine the "int device"
argument to "unsigned int flags"
---
gcc/builtin-types.def | 10 +++---
gcc/fortran/types.def | 10 +++---
gcc/omp-builtins.def | 10 +++---
gcc/omp-expand.c | 68 +++++++++++++++++++++++++++++++++++++-
gcc/tree-ssa-structalias.c | 4 +--
include/gomp-constants.h | 3 ++
libgomp/libgomp_g.h | 12 +++----
libgomp/oacc-parallel.c | 53 ++++++++++++++++++++---------
8 files changed, 133 insertions(+), 37 deletions(-)
diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def
index 685b22f975a1..f92580d5c649 100644
--- a/gcc/builtin-types.def
+++ b/gcc/builtin-types.def
@@ -684,6 +684,8 @@ DEF_FUNCTION_TYPE_5 (BT_FN_BOOL_VPTR_PTR_I16_INT_INT,
BT_BOOL, BT_VOLATILE_PTR, BT_PTR, BT_I16, BT_INT, BT_INT)
DEF_FUNCTION_TYPE_5 (BT_FN_VOID_INT_SIZE_PTR_PTR_PTR,
BT_VOID, BT_INT, BT_SIZE, BT_PTR, BT_PTR, BT_PTR)
+DEF_FUNCTION_TYPE_5 (BT_FN_VOID_UINT_SIZE_PTR_PTR_PTR,
+ BT_VOID, BT_UINT, BT_SIZE, BT_PTR, BT_PTR, BT_PTR)
DEF_FUNCTION_TYPE_5 (BT_FN_VOID_OMPFN_PTR_UINT_UINT_UINT,
BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_UINT, BT_UINT,
BT_UINT)
@@ -822,12 +824,12 @@ DEF_FUNCTION_TYPE_VAR_5 (BT_FN_INT_STRING_SIZE_INT_SIZE_CONST_STRING_VAR,
DEF_FUNCTION_TYPE_VAR_5 (BT_FN_INT_INT_INT_INT_INT_INT_VAR,
BT_INT, BT_INT, BT_INT, BT_INT, BT_INT, BT_INT)
-DEF_FUNCTION_TYPE_VAR_6 (BT_FN_VOID_INT_OMPFN_SIZE_PTR_PTR_PTR_VAR,
- BT_VOID, BT_INT, BT_PTR_FN_VOID_PTR, BT_SIZE,
+DEF_FUNCTION_TYPE_VAR_6 (BT_FN_VOID_UINT_OMPFN_SIZE_PTR_PTR_PTR_VAR,
+ BT_VOID, BT_UINT, BT_PTR_FN_VOID_PTR, BT_SIZE,
BT_PTR, BT_PTR, BT_PTR)
-DEF_FUNCTION_TYPE_VAR_7 (BT_FN_VOID_INT_SIZE_PTR_PTR_PTR_INT_INT_VAR,
- BT_VOID, BT_INT, BT_SIZE, BT_PTR, BT_PTR,
+DEF_FUNCTION_TYPE_VAR_7 (BT_FN_VOID_UINT_SIZE_PTR_PTR_PTR_INT_INT_VAR,
+ BT_VOID, BT_UINT, BT_SIZE, BT_PTR, BT_PTR,
BT_PTR, BT_INT, BT_INT)
DEF_POINTER_TYPE (BT_PTR_FN_VOID_VAR, BT_FN_VOID_VAR)
diff --git a/gcc/fortran/types.def b/gcc/fortran/types.def
index 0eabc3f4d993..593d18c0cfd2 100644
--- a/gcc/fortran/types.def
+++ b/gcc/fortran/types.def
@@ -178,6 +178,8 @@ DEF_FUNCTION_TYPE_5 (BT_FN_VOID_SIZE_VPTR_PTR_PTR_INT, BT_VOID, BT_SIZE,
BT_VOLATILE_PTR, BT_PTR, BT_PTR, BT_INT)
DEF_FUNCTION_TYPE_5 (BT_FN_VOID_INT_SIZE_PTR_PTR_PTR,
BT_VOID, BT_INT, BT_SIZE, BT_PTR, BT_PTR, BT_PTR)
+DEF_FUNCTION_TYPE_5 (BT_FN_VOID_UINT_SIZE_PTR_PTR_PTR,
+ BT_VOID, BT_UINT, BT_SIZE, BT_PTR, BT_PTR, BT_PTR)
DEF_FUNCTION_TYPE_5 (BT_FN_BOOL_UINT_LONGPTR_LONG_LONGPTR_LONGPTR,
BT_BOOL, BT_UINT, BT_PTR_LONG, BT_LONG, BT_PTR_LONG,
BT_PTR_LONG)
@@ -265,10 +267,10 @@ DEF_FUNCTION_TYPE_VAR_1 (BT_FN_VOID_ULL_VAR,
DEF_FUNCTION_TYPE_VAR_2 (BT_FN_VOID_INT_INT_VAR, BT_VOID, BT_INT, BT_INT)
-DEF_FUNCTION_TYPE_VAR_7 (BT_FN_VOID_INT_SIZE_PTR_PTR_PTR_INT_INT_VAR,
- BT_VOID, BT_INT, BT_SIZE, BT_PTR, BT_PTR,
+DEF_FUNCTION_TYPE_VAR_7 (BT_FN_VOID_UINT_SIZE_PTR_PTR_PTR_INT_INT_VAR,
+ BT_VOID, BT_UINT, BT_SIZE, BT_PTR, BT_PTR,
BT_PTR, BT_INT, BT_INT)
-DEF_FUNCTION_TYPE_VAR_6 (BT_FN_VOID_INT_OMPFN_SIZE_PTR_PTR_PTR_VAR,
- BT_VOID, BT_INT, BT_PTR_FN_VOID_PTR, BT_SIZE,
+DEF_FUNCTION_TYPE_VAR_6 (BT_FN_VOID_UINT_OMPFN_SIZE_PTR_PTR_PTR_VAR,
+ BT_VOID, BT_UINT, BT_PTR_FN_VOID_PTR, BT_SIZE,
BT_PTR, BT_PTR, BT_PTR)
diff --git a/gcc/omp-builtins.def b/gcc/omp-builtins.def
index 187268097bca..8c7a0c204846 100644
--- a/gcc/omp-builtins.def
+++ b/gcc/omp-builtins.def
@@ -32,17 +32,17 @@ along with GCC; see the file COPYING3. If not see
DEF_GOACC_BUILTIN (BUILT_IN_ACC_GET_DEVICE_TYPE, "acc_get_device_type",
BT_FN_INT, ATTR_NOTHROW_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_DATA_START, "GOACC_data_start",
- BT_FN_VOID_INT_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
+ BT_FN_VOID_UINT_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_DATA_END, "GOACC_data_end",
BT_FN_VOID, ATTR_NOTHROW_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_ENTER_EXIT_DATA, "GOACC_enter_exit_data",
- BT_FN_VOID_INT_SIZE_PTR_PTR_PTR_INT_INT_VAR,
+ BT_FN_VOID_UINT_SIZE_PTR_PTR_PTR_INT_INT_VAR,
ATTR_NOTHROW_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_PARALLEL, "GOACC_parallel_keyed",
- BT_FN_VOID_INT_OMPFN_SIZE_PTR_PTR_PTR_VAR,
+ BT_FN_VOID_UINT_OMPFN_SIZE_PTR_PTR_PTR_VAR,
ATTR_NOTHROW_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_UPDATE, "GOACC_update",
- BT_FN_VOID_INT_SIZE_PTR_PTR_PTR_INT_INT_VAR,
+ BT_FN_VOID_UINT_SIZE_PTR_PTR_PTR_INT_INT_VAR,
ATTR_NOTHROW_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_WAIT, "GOACC_wait",
BT_FN_VOID_INT_INT_VAR,
@@ -445,4 +445,4 @@ DEF_GOMP_BUILTIN (BUILT_IN_GOMP_WORKSHARE_TASK_REDUCTION_UNREGISTER,
"GOMP_workshare_task_reduction_unregister",
BT_FN_VOID_BOOL, ATTR_NOTHROW_LEAF_LIST)
DEF_GOACC_BUILTIN (BUILT_IN_GOACC_DECLARE, "GOACC_declare",
- BT_FN_VOID_INT_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
+ BT_FN_VOID_UINT_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c
index b6ff119f5446..77edbd79c95e 100644
--- a/gcc/omp-expand.c
+++ b/gcc/omp-expand.c
@@ -7540,6 +7540,8 @@ expand_omp_target (struct omp_region *region)
library choose) and there is no conditional. */
cond = NULL_TREE;
device = build_int_cst (integer_type_node, GOMP_DEVICE_ICV);
+ /* No flags set by default. */
+ tree flags = build_int_cstu (unsigned_type_node, 0);
c = omp_find_clause (clauses, OMP_CLAUSE_IF);
if (c)
@@ -7565,6 +7567,66 @@ expand_omp_target (struct omp_region *region)
if (c)
flags_i |= GOMP_TARGET_FLAG_NOWAIT;
+ if (is_gimple_omp_oacc (entry_stmt))
+ {
+ //TODO Copied from below. Merge code as much as feasible.
+ /* If we found the clause 'if (cond)', build
+ TODO flags = (cond ? flags : GOACC_FLAG_HOST_FALLBACK).
+ TODO Should be: flags = (cond ? flags : flags | GOACC_FLAG_HOST_FALLBACK). */
+ if (cond)
+ {
+ cond = gimple_boolify (cond);
+
+ basic_block cond_bb, then_bb, else_bb;
+ edge e;
+ tree tmp_var;
+
+ tmp_var = create_tmp_var (TREE_TYPE (flags));
+ if (offloaded)
+ e = split_block_after_labels (new_bb);
+ else
+ {
+ gsi = gsi_last_nondebug_bb (new_bb);
+ gsi_prev (&gsi);
+ e = split_block (new_bb, gsi_stmt (gsi));
+ }
+ cond_bb = e->src;
+ new_bb = e->dest;
+ remove_edge (e);
+
+ then_bb = create_empty_bb (cond_bb);
+ else_bb = create_empty_bb (then_bb);
+ set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb);
+ set_immediate_dominator (CDI_DOMINATORS, else_bb, cond_bb);
+
+ stmt = gimple_build_cond_empty (cond);
+ gsi = gsi_last_bb (cond_bb);
+ gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+
+ gsi = gsi_start_bb (then_bb);
+ stmt = gimple_build_assign (tmp_var, flags);
+ gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+
+ gsi = gsi_start_bb (else_bb);
+ stmt = gimple_build_assign (tmp_var,
+ build_int_cst (unsigned_type_node,
+ GOACC_FLAG_HOST_FALLBACK));
+ gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+
+ make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
+ make_edge (cond_bb, else_bb, EDGE_FALSE_VALUE);
+ add_bb_to_loop (then_bb, cond_bb->loop_father);
+ add_bb_to_loop (else_bb, cond_bb->loop_father);
+ make_edge (then_bb, new_bb, EDGE_FALLTHRU);
+ make_edge (else_bb, new_bb, EDGE_FALLTHRU);
+
+ flags = tmp_var;
+ }
+ gsi = gsi_last_nondebug_bb (new_bb);
+ }
+ else
+ //TODO Indentation.
+ {
/* Ensure 'device' is of the correct type. */
device = fold_convert_loc (clause_loc, integer_type_node, device);
@@ -7626,6 +7688,7 @@ expand_omp_target (struct omp_region *region)
device = force_gimple_operand_gsi (&gsi, device, true, NULL_TREE,
true, GSI_SAME_STMT);
}
+ }
t = gimple_omp_target_data_arg (entry_stmt);
if (t == NULL)
@@ -7648,7 +7711,10 @@ expand_omp_target (struct omp_region *region)
bool tagging = false;
/* The maximum number used by any start_ix, without varargs. */
auto_vec<tree, 11> args;
- args.quick_push (device);
+ if (is_gimple_omp_oacc (entry_stmt))
+ args.quick_push (flags);
+ else
+ args.quick_push (device);
if (offloaded)
args.quick_push (build_fold_addr_expr (child_fn));
args.quick_push (t1);
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index fc85e9ded5e8..65cc47b22c5b 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -4697,7 +4697,7 @@ find_func_aliases_for_builtin_call (struct function *fn, gcall *t)
argpos = 1;
break;
case BUILT_IN_GOACC_PARALLEL:
- /* __builtin_GOACC_parallel (device, fn, mapnum, hostaddrs,
+ /* __builtin_GOACC_parallel (flags, fn, mapnum, hostaddrs,
sizes, kinds, ...). */
fnpos = 1;
argpos = 3;
@@ -5255,7 +5255,7 @@ find_func_clobbers (struct function *fn, gimple *origt)
argpos = 1;
break;
case BUILT_IN_GOACC_PARALLEL:
- /* __builtin_GOACC_parallel (device, fn, mapnum, hostaddrs,
+ /* __builtin_GOACC_parallel (flags, fn, mapnum, hostaddrs,
sizes, kinds, ...). */
fnpos = 1;
argpos = 3;
diff --git a/include/gomp-constants.h b/include/gomp-constants.h
index add3896a4aa1..fa58ecd2c3c9 100644
--- a/include/gomp-constants.h
+++ b/include/gomp-constants.h
@@ -197,6 +197,9 @@ enum gomp_map_kind
/* Internal to libgomp. */
#define GOMP_TARGET_FLAG_UPDATE (1U << 31)
+/* TODO */
+#define GOACC_FLAG_HOST_FALLBACK (1 << 0)
+
/* 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. */
diff --git a/libgomp/libgomp_g.h b/libgomp/libgomp_g.h
index 5b54839b29e5..97f9dc023a81 100644
--- a/libgomp/libgomp_g.h
+++ b/libgomp/libgomp_g.h
@@ -359,20 +359,20 @@ extern void GOMP_teams_reg (void (*) (void *), void *, unsigned, unsigned,
/* oacc-parallel.c */
-extern void GOACC_parallel_keyed (int, void (*) (void *), size_t,
+extern void GOACC_parallel_keyed (unsigned int, void (*) (void *), size_t,
void **, size_t *, unsigned short *, ...);
-extern void GOACC_parallel (int, void (*) (void *), size_t, void **, size_t *,
+extern void GOACC_parallel (unsigned int, void (*) (void *), size_t, void **, size_t *,
unsigned short *, int, int, int, int, int, ...);
-extern void GOACC_data_start (int, size_t, void **, size_t *,
+extern void GOACC_data_start (unsigned int, size_t, void **, size_t *,
unsigned short *);
extern void GOACC_data_end (void);
-extern void GOACC_enter_exit_data (int, size_t, void **,
+extern void GOACC_enter_exit_data (unsigned int, size_t, void **,
size_t *, unsigned short *, int, int, ...);
-extern void GOACC_update (int, size_t, void **, size_t *,
+extern void GOACC_update (unsigned int, size_t, void **, size_t *,
unsigned short *, int, int, ...);
extern void GOACC_wait (int, int, ...);
extern int GOACC_get_num_threads (void);
extern int GOACC_get_thread_num (void);
-extern void GOACC_declare (int, size_t, void **, size_t *, unsigned short *);
+extern void GOACC_declare (unsigned int, size_t, void **, size_t *, unsigned short *);
#endif /* LIBGOMP_G_H */
diff --git a/libgomp/oacc-parallel.c b/libgomp/oacc-parallel.c
index c60e1a12f4dc..0f798b0a78fb 100644
--- a/libgomp/oacc-parallel.c
+++ b/libgomp/oacc-parallel.c
@@ -105,17 +105,33 @@ handle_ftn_pointers (size_t mapnum, void **hostaddrs, size_t *sizes,
static void goacc_wait (int async, int num_waits, va_list *ap);
-/* Launch a possibly offloaded function on DEVICE. FN is the host fn
+/* Legacy support: TODO. */
+
+static unsigned int
+resolve_legacy_flags (unsigned int flags, bool legacy_only)
+{
+ if ((int) flags == GOMP_DEVICE_ICV)
+ flags = 0;
+ else if ((int) flags == GOMP_DEVICE_HOST_FALLBACK)
+ flags = GOACC_FLAG_HOST_FALLBACK;
+ else if (legacy_only)
+ gomp_fatal ("unexpected device argument");
+ return flags;
+}
+
+
+/* Launch a possibly offloaded function with FLAGS. FN is the host fn
address. MAPNUM, HOSTADDRS, SIZES & KINDS describe the memory
blocks to be copied to/from the device. Varadic arguments are
keyed optional parameters terminated with a zero. */
void
-GOACC_parallel_keyed (int device, void (*fn) (void *),
+GOACC_parallel_keyed (unsigned int flags, void (*fn) (void *),
size_t mapnum, void **hostaddrs, size_t *sizes,
unsigned short *kinds, ...)
{
- bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK;
+ flags = resolve_legacy_flags (flags, /* TODO */ true);
+ bool host_fallback = !!(flags & GOACC_FLAG_HOST_FALLBACK);
va_list ap;
struct goacc_thread *thr;
struct gomp_device_descr *acc_dev;
@@ -256,22 +272,24 @@ GOACC_parallel_keyed (int device, void (*fn) (void *),
/* Legacy entry point, only provide host execution. */
void
-GOACC_parallel (int device, void (*fn) (void *),
+GOACC_parallel (unsigned int flags, void (*fn) (void *),
size_t mapnum, void **hostaddrs, size_t *sizes,
unsigned short *kinds,
int num_gangs, int num_workers, int vector_length,
int async, int num_waits, ...)
{
+ flags = resolve_legacy_flags (flags, true);
goacc_save_and_set_bind (acc_device_host);
fn (hostaddrs);
goacc_restore_bind ();
}
void
-GOACC_data_start (int device, size_t mapnum,
+GOACC_data_start (unsigned int flags, size_t mapnum,
void **hostaddrs, size_t *sizes, unsigned short *kinds)
{
- bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK;
+ flags = resolve_legacy_flags (flags, /* TODO */ true);
+ bool host_fallback = !!(flags & GOACC_FLAG_HOST_FALLBACK);
struct target_mem_desc *tgt;
#ifdef HAVE_INTTYPES_H
@@ -320,13 +338,14 @@ GOACC_data_end (void)
}
void
-GOACC_enter_exit_data (int device, size_t mapnum,
+GOACC_enter_exit_data (unsigned int flags, size_t mapnum,
void **hostaddrs, size_t *sizes, unsigned short *kinds,
int async, int num_waits, ...)
{
+ flags = resolve_legacy_flags (flags, /* TODO */ true);
+ bool host_fallback = !!(flags & GOACC_FLAG_HOST_FALLBACK);
struct goacc_thread *thr;
struct gomp_device_descr *acc_dev;
- bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK;
bool data_enter = false;
size_t i;
@@ -514,11 +533,12 @@ goacc_wait (int async, int num_waits, va_list *ap)
}
void
-GOACC_update (int device, size_t mapnum,
+GOACC_update (unsigned int flags, size_t mapnum,
void **hostaddrs, size_t *sizes, unsigned short *kinds,
int async, int num_waits, ...)
{
- bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK;
+ flags = resolve_legacy_flags (flags, /* TODO */ true);
+ bool host_fallback = !!(flags & GOACC_FLAG_HOST_FALLBACK);
size_t i;
goacc_lazy_initialize ();
@@ -634,9 +654,12 @@ GOACC_get_thread_num (void)
}
void
-GOACC_declare (int device, size_t mapnum,
+GOACC_declare (unsigned int flags, size_t mapnum,
void **hostaddrs, size_t *sizes, unsigned short *kinds)
{
+ /* This does not "resolve_legacy_flags", as we're only passing through that
+ argument to "GOACC_enter_exit_data". */
+
int i;
for (i = 0; i < mapnum; i++)
@@ -654,7 +677,7 @@ GOACC_declare (int device, size_t mapnum,
case GOMP_MAP_POINTER:
case GOMP_MAP_RELEASE:
case GOMP_MAP_DELETE:
- GOACC_enter_exit_data (device, 1, &hostaddrs[i], &sizes[i],
+ GOACC_enter_exit_data (flags, 1, &hostaddrs[i], &sizes[i],
&kinds[i], GOMP_ASYNC_SYNC, 0);
break;
@@ -663,18 +686,18 @@ GOACC_declare (int device, size_t mapnum,
case GOMP_MAP_ALLOC:
if (!acc_is_present (hostaddrs[i], sizes[i]))
- GOACC_enter_exit_data (device, 1, &hostaddrs[i], &sizes[i],
+ GOACC_enter_exit_data (flags, 1, &hostaddrs[i], &sizes[i],
&kinds[i], GOMP_ASYNC_SYNC, 0);
break;
case GOMP_MAP_TO:
- GOACC_enter_exit_data (device, 1, &hostaddrs[i], &sizes[i],
+ GOACC_enter_exit_data (flags, 1, &hostaddrs[i], &sizes[i],
&kinds[i], GOMP_ASYNC_SYNC, 0);
break;
case GOMP_MAP_FROM:
- GOACC_enter_exit_data (device, 1, &hostaddrs[i], &sizes[i],
+ GOACC_enter_exit_data (flags, 1, &hostaddrs[i], &sizes[i],
&kinds[i], GOMP_ASYNC_SYNC, 0);
break;
--
2.17.1