]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libgomp/gcn: fix/improve struct output
authorTobias Burnus <tobias@codesourcery.com>
Mon, 21 Nov 2022 14:25:48 +0000 (15:25 +0100)
committerTobias Burnus <tobias@codesourcery.com>
Mon, 21 Nov 2022 14:25:48 +0000 (15:25 +0100)
output.printf_data.(value union) contains text[128], which has the size
of 128 bytes, sufficient for 16 uint64_t variables; hence value_u64[2]
could be extended to value_u64[6] - sufficient for all required arguments
to gomp_target_rev.  Additionally, next_output.printf_data.(msg union)
contained msg_u64 which then is no longer needed and also caused 32bit
vs 64bit alignment issues.

libgomp/
* config/gcn/libgomp-gcn.h (struct output):
Remove 'msg_u64' from the union, change
value_u64[2] to value_u64[6].
* config/gcn/target.c (GOMP_target_ext): Update accordingly.
* plugin/plugin-gcn.c (process_reverse_offload, console_output):
Likewise.

(cherry picked from commit 6edcb5dc42625cb0cf84b19c6fe4f944f6322ea0)

libgomp/ChangeLog.omp
libgomp/config/gcn/libgomp-gcn.h
libgomp/config/gcn/target.c
libgomp/plugin/plugin-gcn.c

index 73bcc3adb0c49c858b48f3fbb6a175ca51f6930d..516875f8450a548e5fcc67e2108fb2a50d74a7ef 100644 (file)
@@ -1,3 +1,15 @@
+2022-11-21  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2022-11-21  Tobias Burnus  <tobias@codesourcery.com>
+
+       * config/gcn/libgomp-gcn.h (struct output):
+       Remove 'msg_u64' from the union, change
+       value_u64[2] to value_u64[6].
+       * config/gcn/target.c (GOMP_target_ext): Update accordingly.
+       * plugin/plugin-gcn.c (process_reverse_offload, console_output):
+       Likewise.
+
 2022-11-19  Tobias Burnus  <tobias@codesourcery.com>
 
        Backported from master:
index 91560be787f38e00169510d6ffda6e6ebd9bd8e7..b59cbee288e946ac87c5571c6ee0654cdf59a82b 100644 (file)
@@ -37,16 +37,13 @@ struct output
   unsigned int next_output;
   struct printf_data {
     int written;
-    union {
-      char msg[128];
-      uint64_t msg_u64[2];
-    };
+    char msg[128];
     int type;
     union {
       int64_t ivalue;
       double dvalue;
       char text[128];
-      uint64_t value_u64[2];
+      uint64_t value_u64[16];
     };
   } queue[1024];
   unsigned int consumed;
index 27854565d40d756e8f9e03cfefbfd0a8ac97c4fe..11ae6ec9833dbe37e46cae5b4438e59762e6cf8c 100644 (file)
@@ -102,12 +102,12 @@ GOMP_target_ext (int device, void (*fn) (void *), size_t mapnum,
       asm ("s_sleep 64");
 
   unsigned int slot = index % 1024;
-  uint64_t addrs_sizes_kind[3] = {(uint64_t) hostaddrs, (uint64_t) sizes,
-                                 (uint64_t) kinds};
-  data->queue[slot].msg_u64[0] = (uint64_t) fn;
-  data->queue[slot].msg_u64[1] = (uint64_t) mapnum;
-  data->queue[slot].value_u64[0] = (uint64_t) &addrs_sizes_kind[0];
-  data->queue[slot].value_u64[1] = (uint64_t) GOMP_ADDITIONAL_ICVS.device_num;
+  data->queue[slot].value_u64[0] = (uint64_t) fn;
+  data->queue[slot].value_u64[1] = (uint64_t) mapnum;
+  data->queue[slot].value_u64[2] = (uint64_t) hostaddrs;
+  data->queue[slot].value_u64[3] = (uint64_t) sizes;
+  data->queue[slot].value_u64[4] = (uint64_t) kinds;
+  data->queue[slot].value_u64[5] = (uint64_t) GOMP_ADDITIONAL_ICVS.device_num;
 
   data->queue[slot].type = 4; /* Reverse offload.  */
   __atomic_store_n (&data->queue[slot].written, 1, __ATOMIC_RELEASE);
index f6bc9a41d07b1f6495922594b368cdb556a1581c..abf86953f9881fa1633fdd8c1ab84ea49509074d 100644 (file)
@@ -1953,16 +1953,12 @@ create_kernel_dispatch (struct kernel_info *kernel, int num_teams)
 }
 
 static void
-process_reverse_offload (uint64_t fn, uint64_t mapnum, uint64_t rev_data,
-                        uint64_t dev_num64)
+process_reverse_offload (uint64_t fn, uint64_t mapnum, uint64_t hostaddrs,
+                        uint64_t sizes, uint64_t kinds, uint64_t dev_num64)
 {
   int dev_num = dev_num64;
-  uint64_t addrs_sizes_kinds[3];
-  GOMP_OFFLOAD_host2dev (dev_num, &addrs_sizes_kinds, (void *) rev_data,
-                        sizeof (addrs_sizes_kinds));
-  GOMP_PLUGIN_target_rev (fn, mapnum, addrs_sizes_kinds[0],
-                         addrs_sizes_kinds[1], addrs_sizes_kinds[2],
-                         dev_num, NULL, NULL, NULL);
+  GOMP_PLUGIN_target_rev (fn, mapnum, hostaddrs, sizes, kinds, dev_num,
+                         NULL, NULL, NULL);
 }
 
 /* Output any data written to console output from the kernel.  It is expected
@@ -2010,8 +2006,9 @@ console_output (struct kernel_info *kernel, struct kernargs *kernargs,
        case 2: printf ("%.128s%.128s\n", data->msg, data->text); break;
        case 3: printf ("%.128s%.128s", data->msg, data->text); break;
        case 4:
-         process_reverse_offload (data->msg_u64[0], data->msg_u64[1],
-                                  data->value_u64[0],data->value_u64[1]);
+         process_reverse_offload (data->value_u64[0], data->value_u64[1],
+                                  data->value_u64[2], data->value_u64[3],
+                                  data->value_u64[4], data->value_u64[5]);
          break;
        default: printf ("GCN print buffer error!\n"); break;
        }