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 <tho...@codesourcery.com> 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