From 5bcd470bf0749e1f56d05dd43aa9584ff2e3a090 Mon Sep 17 00:00:00 2001
From: Julian Brown <julian@codesourcery.com>
Date: Fri, 20 Dec 2019 01:20:19 +0000
Subject: [PATCH] Use gomp_map_val for OpenACC host-to-device address
 translation

	libgomp/
	* libgomp.h (gomp_map_val): Add prototype.
	* oacc-parallel.c (GOACC_parallel_keyed): Use gomp_map_val instead of
	open-coding device-address calculation.
	* target.c (gomp_map_val): Make global. Use OFFSET_POINTER in
	non-present case.

Co-Authored-By: Cesar Philippidis <cesar@codesourcery.com>

From-SVN: r279622
---
 libgomp/ChangeLog       | 9 +++++++++
 libgomp/libgomp.h       | 1 +
 libgomp/oacc-parallel.c | 8 ++------
 libgomp/target.c        | 4 ++--
 4 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index c08d7b0c457c..6c146217fe25 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,12 @@
+2019-12-19  Julian Brown  <julian@codesourcery.com>
+	    Cesar Philippidis  <cesar@codesourcery.com>
+
+	* libgomp.h (gomp_map_val): Add prototype.
+	* oacc-parallel.c (GOACC_parallel_keyed): Use gomp_map_val instead of
+	open-coding device-address calculation.
+	* target.c (gomp_map_val): Make global. Use OFFSET_POINTER in
+	non-present case.
+
 2019-12-19  Julian Brown  <julian@codesourcery.com>
 
 	* libgomp.h (struct splay_tree_key_s): Substitute dynamic_refcount
diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h
index b9301bd70f81..8139cd7de086 100644
--- a/libgomp/libgomp.h
+++ b/libgomp/libgomp.h
@@ -1157,6 +1157,7 @@ extern void gomp_copy_host2dev (struct gomp_device_descr *,
 extern void gomp_copy_dev2host (struct gomp_device_descr *,
 				struct goacc_asyncqueue *, void *, const void *,
 				size_t);
+extern uintptr_t gomp_map_val (struct target_mem_desc *, void **, size_t);
 
 extern struct target_mem_desc *gomp_map_vars (struct gomp_device_descr *,
 					      size_t, void **, void **,
diff --git a/libgomp/oacc-parallel.c b/libgomp/oacc-parallel.c
index 5c13a7e43487..c853f01b27f7 100644
--- a/libgomp/oacc-parallel.c
+++ b/libgomp/oacc-parallel.c
@@ -303,12 +303,8 @@ GOACC_parallel_keyed (int flags_m, void (*fn) (void *),
   
   devaddrs = gomp_alloca (sizeof (void *) * mapnum);
   for (i = 0; i < mapnum; i++)
-    if (tgt->list[i].key != NULL)
-      devaddrs[i] = (void *) (tgt->list[i].key->tgt->tgt_start
-			      + tgt->list[i].key->tgt_offset
-			      + tgt->list[i].offset);
-    else
-      devaddrs[i] = NULL;
+    devaddrs[i] = (void *) gomp_map_val (tgt, hostaddrs, i);
+
   if (aq == NULL)
     acc_dev->openacc.exec_func (tgt_fn, mapnum, hostaddrs, devaddrs, dims,
 				tgt);
diff --git a/libgomp/target.c b/libgomp/target.c
index f2a60614e598..ef8e9ab14fcd 100644
--- a/libgomp/target.c
+++ b/libgomp/target.c
@@ -493,7 +493,7 @@ gomp_map_fields_existing (struct target_mem_desc *tgt,
 	      (void *) cur_node.host_end);
 }
 
-static inline uintptr_t
+attribute_hidden uintptr_t
 gomp_map_val (struct target_mem_desc *tgt, void **hostaddrs, size_t i)
 {
   if (tgt->list[i].key != NULL)
@@ -713,7 +713,7 @@ gomp_map_vars_internal (struct gomp_device_descr *devicep,
 	    {
 	      /* Not present, hence, skip entry - including its MAP_POINTER,
 		 when existing.  */
-	      tgt->list[i].offset = 0;
+	      tgt->list[i].offset = OFFSET_POINTER;
 	      if (i + 1 < mapnum
 		  && ((typemask & get_kind (short_mapkind, kinds, i + 1))
 		      == GOMP_MAP_POINTER))
-- 
GitLab