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

Reply via email to