re PR libgomp/65742 (Several libgomp.oacc-* failures after r221922.)
authorJulian Brown <julian@codesourcery.com>
Thu, 28 May 2015 09:29:19 +0000 (09:29 +0000)
committerJulian Brown <jules@gcc.gnu.org>
Thu, 28 May 2015 09:29:19 +0000 (09:29 +0000)
    PR libgomp/65742

    gcc/
    * builtins.c (expand_builtin_acc_on_device): Don't use open-coded
    sequence for !ACCEL_COMPILER.

    libgomp/
    * oacc-init.c (plugin/plugin-host.h): Include.
    (acc_on_device): Check whether we're in an offloaded region for
    host_nonshm
    plugin. Don't use __builtin_acc_on_device.
    * plugin/plugin-host.c (GOMP_OFFLOAD_openacc_parallel): Set
    nonshm_exec flag in thread-local data.
    (GOMP_OFFLOAD_openacc_create_thread_data): Allocate thread-local
    data for host_nonshm plugin.
    (GOMP_OFFLOAD_openacc_destroy_thread_data): Free thread-local data
    for host_nonshm plugin.
    * plugin/plugin-host.h: New.

From-SVN: r223801

gcc/ChangeLog
gcc/builtins.c
libgomp/ChangeLog
libgomp/oacc-init.c
libgomp/plugin/plugin-host.c
libgomp/plugin/plugin-host.h [new file with mode: 0644]

index 712dacc8f07f8a7875431a5a26de5f1c36a11a15..a3769389bfd941f9865b55cc78f125e3b6aa0aa1 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-28  Julian Brown  <julian@codesourcery.com>
+
+       PR libgomp/65742
+
+       * builtins.c (expand_builtin_acc_on_device): Don't use open-coded
+       sequence for !ACCEL_COMPILER.
+
 2015-05-28  Nick Clifton  <nickc@redhat.com>
 
        * config/rx/rx.c (push_regs): New function.  Extracts code from...
index d92535eeb4d311d1f2c120417126e2a162284562..4ce8e5224ca07b6ac1f7c1ef7b55aac01ca1a5dd 100644 (file)
@@ -5913,6 +5913,7 @@ expand_stack_save (void)
 static rtx
 expand_builtin_acc_on_device (tree exp, rtx target)
 {
+#ifdef ACCEL_COMPILER
   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
     return NULL_RTX;
 
@@ -5921,13 +5922,8 @@ expand_builtin_acc_on_device (tree exp, rtx target)
   /* Return (arg == v1 || arg == v2) ? 1 : 0.  */
   machine_mode v_mode = TYPE_MODE (TREE_TYPE (arg));
   rtx v = expand_normal (arg), v1, v2;
-#ifdef ACCEL_COMPILER
   v1 = GEN_INT (GOMP_DEVICE_NOT_HOST);
   v2 = GEN_INT (ACCEL_COMPILER_acc_device);
-#else
-  v1 = GEN_INT (GOMP_DEVICE_NONE);
-  v2 = GEN_INT (GOMP_DEVICE_HOST);
-#endif
   machine_mode target_mode = TYPE_MODE (integer_type_node);
   if (!target || !register_operand (target, target_mode))
     target = gen_reg_rtx (target_mode);
@@ -5941,6 +5937,9 @@ expand_builtin_acc_on_device (tree exp, rtx target)
   emit_label (done_label);
 
   return target;
+#else
+  return NULL;
+#endif
 }
 
 
index bfae17c88ee62a1ad588cbe3186a05be6fb0eb67..fda3b5fb0dbe4fa10915d2fcf5a4333961e863c9 100644 (file)
@@ -1,3 +1,19 @@
+2015-05-28  Julian Brown  <julian@codesourcery.com>
+
+       PR libgomp/65742
+
+       * oacc-init.c (plugin/plugin-host.h): Include.
+       (acc_on_device): Check whether we're in an offloaded region for
+       host_nonshm
+       plugin. Don't use __builtin_acc_on_device.
+       * plugin/plugin-host.c (GOMP_OFFLOAD_openacc_parallel): Set
+       nonshm_exec flag in thread-local data.
+       (GOMP_OFFLOAD_openacc_create_thread_data): Allocate thread-local
+       data for host_nonshm plugin.
+       (GOMP_OFFLOAD_openacc_destroy_thread_data): Free thread-local data
+       for host_nonshm plugin.
+       * plugin/plugin-host.h: New.
+
 2015-05-27  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/linux/ia64/futex.h (sys_futex0) Change operand "op" to int.
index 54995e36b587e9446c4753984acf6c40d019bfcf..8e5fc3bbb7971edcbfde3a78e8bef54cee64b6f4 100644 (file)
@@ -29,6 +29,7 @@
 #include "libgomp.h"
 #include "oacc-int.h"
 #include "openacc.h"
+#include "plugin/plugin-host.h"
 #include <assert.h>
 #include <stdlib.h>
 #include <strings.h>
@@ -580,11 +581,18 @@ ialias (acc_set_device_num)
 int
 acc_on_device (acc_device_t dev)
 {
-  if (acc_get_device_type () == acc_device_host_nonshm)
+  struct goacc_thread *thr = goacc_thread ();
+
+  /* We only want to appear to be the "host_nonshm" plugin from "offloaded"
+     code -- i.e. within a parallel region.  Test a flag set by the
+     openacc_parallel hook of the host_nonshm plugin to determine that.  */
+  if (acc_get_device_type () == acc_device_host_nonshm
+      && thr && thr->target_tls
+      && ((struct nonshm_thread *)thr->target_tls)->nonshm_exec)
     return dev == acc_device_host_nonshm || dev == acc_device_not_host;
 
-  /* Just rely on the compiler builtin.  */
-  return __builtin_acc_on_device (dev);
+  /* For OpenACC, libgomp is only built for the host, so this is sufficient.  */
+  return dev == acc_device_host || dev == acc_device_none;
 }
 
 ialias (acc_on_device)
index 1faf5bc194eb452e1cc9065d67749010fe56eee2..3cb4dab3778f8e8085749911294c2ac060a0a523 100644 (file)
@@ -44,6 +44,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
+#include <stdbool.h>
 
 #ifdef HOST_NONSHM_PLUGIN
 #define STATIC
 #define SELF "host: "
 #endif
 
+#ifdef HOST_NONSHM_PLUGIN
+#include "plugin-host.h"
+#endif
+
 STATIC const char *
 GOMP_OFFLOAD_get_name (void)
 {
@@ -174,7 +179,10 @@ GOMP_OFFLOAD_openacc_parallel (void (*fn) (void *),
                               void *targ_mem_desc __attribute__ ((unused)))
 {
 #ifdef HOST_NONSHM_PLUGIN
+  struct nonshm_thread *thd = GOMP_PLUGIN_acc_thread ();
+  thd->nonshm_exec = true;
   fn (devaddrs);
+  thd->nonshm_exec = false;
 #else
   fn (hostaddrs);
 #endif
@@ -232,11 +240,20 @@ STATIC void *
 GOMP_OFFLOAD_openacc_create_thread_data (int ord
                                         __attribute__ ((unused)))
 {
+#ifdef HOST_NONSHM_PLUGIN
+  struct nonshm_thread *thd
+    = GOMP_PLUGIN_malloc (sizeof (struct nonshm_thread));
+  thd->nonshm_exec = false;
+  return thd;
+#else
   return NULL;
+#endif
 }
 
 STATIC void
-GOMP_OFFLOAD_openacc_destroy_thread_data (void *tls_data
-                                         __attribute__ ((unused)))
+GOMP_OFFLOAD_openacc_destroy_thread_data (void *tls_data)
 {
+#ifdef HOST_NONSHM_PLUGIN
+  free (tls_data);
+#endif
 }
diff --git a/libgomp/plugin/plugin-host.h b/libgomp/plugin/plugin-host.h
new file mode 100644 (file)
index 0000000..96955d1
--- /dev/null
@@ -0,0 +1,37 @@
+/* OpenACC Runtime Library: acc_device_host, acc_device_host_nonshm.
+
+   Copyright (C) 2015 Free Software Foundation, Inc.
+
+   Contributed by Mentor Embedded.
+
+   This file is part of the GNU Offloading and Multi Processing Library
+   (libgomp).
+
+   Libgomp is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+   more details.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef PLUGIN_HOST_H
+#define PLUGIN_HOST_H
+
+struct nonshm_thread
+{
+  bool nonshm_exec;
+};
+
+#endif