Use aux struct in libgomp for infrequently-used/API-specific data
authorJulian Brown <julian@codesourcery.com>
Fri, 20 Dec 2019 01:20:13 +0000 (01:20 +0000)
committerJulian Brown <jules@gcc.gnu.org>
Fri, 20 Dec 2019 01:20:13 +0000 (01:20 +0000)
libgomp/
* libgomp.h (struct splay_tree_aux): New.
(struct splay_tree_key_s): Replace link_key field with aux pointer.
* target.c (gomp_map_vars_internal): Adjust for link_key being moved
to aux struct.
(gomp_remove_var_internal): Free aux block if present.
(gomp_load_image_to_device): Zero-initialise aux field instead of
link_key field.
(omp_target_associate_pointer): Zero-initialise aux field.

Co-Authored-By: Thomas Schwinge <thomas@codesourcery.com>
From-SVN: r279620

libgomp/ChangeLog
libgomp/libgomp.h
libgomp/target.c

index cde315cf966b39f80b7dbf11bac622fc97d202b1..6382e3634dd5b76fbe65e2a36c4253dd033a4e04 100644 (file)
@@ -1,3 +1,15 @@
+2019-12-19  Julian Brown  <julian@codesourcery.com>
+           Thomas Schwinge  <thomas@codesourcery.com>
+
+       * libgomp.h (struct splay_tree_aux): New.
+       (struct splay_tree_key_s): Replace link_key field with aux pointer.
+       * target.c (gomp_map_vars_internal): Adjust for link_key being moved
+       to aux struct.
+       (gomp_remove_var_internal): Free aux block if present.
+       (gomp_load_image_to_device): Zero-initialise aux field instead of
+       link_key field.
+       (omp_target_associate_pointer): Zero-initialise aux field.
+
 2019-12-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/86416
index 038e356ab0bd2d7b63d7afd9dad0d960b6410009..f982ab38af68049147ae6105a39fbf76baaa0a29 100644 (file)
@@ -989,6 +989,13 @@ struct target_mem_desc {
 #define OFFSET_POINTER (~(uintptr_t) 1)
 #define OFFSET_STRUCT (~(uintptr_t) 2)
 
+/* Auxiliary structure for infrequently-used or API-specific data.  */
+
+struct splay_tree_aux {
+  /* Pointer to the original mapping of "omp declare target link" object.  */
+  splay_tree_key link_key;
+};
+
 struct splay_tree_key_s {
   /* Address of the host object.  */
   uintptr_t host_start;
@@ -1002,8 +1009,7 @@ struct splay_tree_key_s {
   uintptr_t refcount;
   /* Dynamic reference count.  */
   uintptr_t dynamic_refcount;
-  /* Pointer to the original mapping of "omp declare target link" object.  */
-  splay_tree_key link_key;
+  struct splay_tree_aux *aux;
 };
 
 /* The comparison function.  */
index d83b353d13e818de5f29d131229547f2d12d1ade..5df0a0ff254ef0bea3657ba430348dd48e01584c 100644 (file)
@@ -931,13 +931,15 @@ gomp_map_vars_internal (struct gomp_device_descr *devicep,
                                      kind & typemask, cbufp);
            else
              {
-               k->link_key = NULL;
+               k->aux = NULL;
                if (n && n->refcount == REFCOUNT_LINK)
                  {
                    /* Replace target address of the pointer with target address
                       of mapped object in the splay tree.  */
                    splay_tree_remove (mem_map, n);
-                   k->link_key = n;
+                   k->aux
+                     = gomp_malloc_cleared (sizeof (struct splay_tree_aux));
+                   k->aux->link_key = n;
                  }
                size_t align = (size_t) 1 << (kind >> rshift);
                tgt->list[i].key = k;
@@ -1055,7 +1057,7 @@ gomp_map_vars_internal (struct gomp_device_descr *devicep,
                                kind);
                  }
 
-               if (k->link_key)
+               if (k->aux && k->aux->link_key)
                  {
                    /* Set link pointer on target to the device address of the
                       mapped object.  */
@@ -1170,8 +1172,14 @@ gomp_remove_var_internal (struct gomp_device_descr *devicep, splay_tree_key k,
 {
   bool is_tgt_unmapped = false;
   splay_tree_remove (&devicep->mem_map, k);
-  if (k->link_key)
-    splay_tree_insert (&devicep->mem_map, (splay_tree_node) k->link_key);
+  if (k->aux)
+    {
+      if (k->aux->link_key)
+       splay_tree_insert (&devicep->mem_map,
+                          (splay_tree_node) k->aux->link_key);
+      free (k->aux);
+      k->aux = NULL;
+    }
   if (aq)
     devicep->openacc.async.queue_callback_func (aq, gomp_unref_tgt_void,
                                                (void *) k->tgt);
@@ -1398,7 +1406,7 @@ gomp_load_image_to_device (struct gomp_device_descr *devicep, unsigned version,
       k->tgt_offset = target_table[i].start;
       k->refcount = REFCOUNT_INFINITY;
       k->dynamic_refcount = 0;
-      k->link_key = NULL;
+      k->aux = NULL;
       array->left = NULL;
       array->right = NULL;
       splay_tree_insert (&devicep->mem_map, array);
@@ -1431,7 +1439,7 @@ gomp_load_image_to_device (struct gomp_device_descr *devicep, unsigned version,
       k->tgt_offset = target_var->start;
       k->refcount = target_size & link_bit ? REFCOUNT_LINK : REFCOUNT_INFINITY;
       k->dynamic_refcount = 0;
-      k->link_key = NULL;
+      k->aux = NULL;
       array->left = NULL;
       array->right = NULL;
       splay_tree_insert (&devicep->mem_map, array);
@@ -2693,6 +2701,7 @@ omp_target_associate_ptr (const void *host_ptr, const void *device_ptr,
       k->tgt_offset = (uintptr_t) device_ptr + device_offset;
       k->refcount = REFCOUNT_INFINITY;
       k->dynamic_refcount = 0;
+      k->aux = NULL;
       array->left = NULL;
       array->right = NULL;
       splay_tree_insert (&devicep->mem_map, array);