Hi,

this patch contains changes to the configuration mechanism and offload
bits, so that users can build compilers with HSA support.

It is a re-post of
https://gcc.gnu.org/ml/gcc-patches/2015-12/msg00714.html, which, has
already been approved by Jakub after a few changes
(https://gcc.gnu.org/ml/gcc-patches/2015-12/msg01284.html).

thanks,

Martin

2016-01-13  Martin Jambor  <mjam...@suse.cz>

        * Makefile.in (OBJS): Add new source files.
        (GTFILES): Add hsa.c.
        * common.opt (disable_hsa): New variable.
        (-Whsa): New warning.
        * config.in (ENABLE_HSA): New.
        * configure.ac: Treat hsa differently from other accelerators.
        (OFFLOAD_TARGETS): Define ENABLE_OFFLOADING according to
        $enable_offloading.
        (ENABLE_HSA): Define ENABLE_HSA according to $enable_hsa.
        * doc/install.texi (Configuration): Document --with-hsa-runtime,
        --with-hsa-runtime-include, --with-hsa-runtime-lib and
        --with-hsa-kmt-lib.
        * doc/invoke.texi (-Whsa): Document.
        (hsa-gen-debug-stores): Likewise.
        * lto-wrapper.c (compile_images_for_offload_targets): Do not attempt
        to invoke offload compiler for hsa acclerator.
        * opts.c (common_handle_option): Determine whether HSA offloading
        should be performed.
        * params.def (PARAM_HSA_GEN_DEBUG_STORES): New parameter.

libgomp/plugin/
        * Makefrag.am: Add HSA plugin requirements.
        * configfrag.ac (HSA_RUNTIME_INCLUDE): New variable.
        (HSA_RUNTIME_LIB): Likewise.
        (HSA_RUNTIME_CPPFLAGS): Likewise.
        (HSA_RUNTIME_INCLUDE): New substitution.
        (HSA_RUNTIME_LIB): Likewise.
        (HSA_RUNTIME_LDFLAGS): Likewise.
        (hsa-runtime): New configure option.
        (hsa-runtime-include): Likewise.
        (hsa-runtime-lib): Likewise.
        (PLUGIN_HSA): New substitution variable.
        Fill HSA_RUNTIME_INCLUDE and HSA_RUNTIME_LIB according to the new
        configure options.
        (PLUGIN_HSA_CPPFLAGS): Likewise.
        (PLUGIN_HSA_LDFLAGS): Likewise.
        (PLUGIN_HSA_LIBS): Likewise.
        Check that we have access to HSA run-time.

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 44a18eb..ab9cbbf 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1297,6 +1297,11 @@ OBJS = \
        graphite-sese-to-poly.o \
        gtype-desc.o \
        haifa-sched.o \
+       hsa.o \
+       hsa-gen.o \
+       hsa-regalloc.o \
+       hsa-brig.o \
+       hsa-dump.o \
        hw-doloop.o \
        hwint.o \
        ifcvt.o \
@@ -1321,6 +1326,7 @@ OBJS = \
        ipa-icf.o \
        ipa-icf-gimple.o \
        ipa-reference.o \
+       ipa-hsa.o \
        ipa-ref.o \
        ipa-utils.o \
        ipa.o \
@@ -2404,6 +2410,7 @@ GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h 
$(srcdir)/coretypes.h \
   $(srcdir)/sancov.c \
   $(srcdir)/ipa-devirt.c \
   $(srcdir)/internal-fn.h \
+  $(srcdir)/hsa.c \
   @all_gtfiles@
 
 # Compute the list of GT header files from the corresponding C sources,
diff --git a/gcc/common.opt b/gcc/common.opt
index 49d347c..23e6ed7 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -239,6 +239,10 @@ Inserts call to __sanitizer_cov_trace_pc into every basic 
block.
 Variable
 bool dump_base_name_prefixed = false
 
+; Flag whether HSA generation has been explicitely disabled
+Variable
+bool flag_disable_hsa = false
+
 ###
 Driver
 
@@ -593,6 +597,10 @@ Wfree-nonheap-object
 Common Var(warn_free_nonheap_object) Init(1) Warning
 Warn when attempting to free a non-heap object.
 
+Whsa
+Common Var(warn_hsa) Init(1) Warning
+Warn when a function cannot be expanded to HSAIL.
+
 Winline
 Common Var(warn_inline) Warning
 Warn when an inlined function cannot be inlined.
diff --git a/gcc/config.in b/gcc/config.in
index c00cd0f..c3340bb0 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -144,6 +144,12 @@
 #endif
 
 
+/* Define this to enable support for generating HSAIL. */
+#ifndef USED_FOR_TARGET
+#undef ENABLE_HSA
+#endif
+
+
 /* Define if gcc should always pass --build-id to linker. */
 #ifndef USED_FOR_TARGET
 #undef ENABLE_LD_BUILDID
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 0a626e9..8d3a869 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -940,6 +940,13 @@ AC_SUBST(accel_dir_suffix)
 
 for tgt in `echo $enable_offload_targets | sed 's/,/ /g'`; do
   tgt=`echo $tgt | sed 's/=.*//'`
+
+  if echo "$tgt" | grep "^hsa" > /dev/null ; then
+    enable_hsa=1
+  else
+    enable_offloading=1
+  fi
+
   if test x"$offload_targets" = x; then
     offload_targets=$tgt
   else
@@ -948,7 +955,7 @@ for tgt in `echo $enable_offload_targets | sed 's/,/ /g'`; 
do
 done
 AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
   [Define to offload targets, separated by commas.])
-if test x"$offload_targets" != x; then
+if test x"$enable_offloading" != x; then
   AC_DEFINE(ENABLE_OFFLOADING, 1,
     [Define this to enable support for offloading.])
 else
@@ -956,6 +963,11 @@ else
     [Define this to enable support for offloading.])
 fi
 
+if test x"$enable_hsa" = x1 ; then
+  AC_DEFINE(ENABLE_HSA, 1,
+    [Define this to enable support for generating HSAIL.])
+fi
+
 AC_ARG_WITH(multilib-list,
 [AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, SH and 
x86-64 only)])],
 :,
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 1c2b702..062f42c 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -1992,6 +1992,28 @@ specifying paths @var{path1}, @dots{}, @var{pathN}.
 % @var{srcdir}/configure \
     
--enable-offload-target=i686-unknown-linux-gnu=/path/to/i686/compiler,x86_64-pc-linux-gnu
 @end smallexample
+
+If @samp{hsa} is specified as one of the targets, the compiler will be
+built with support for HSA GPU accelerators.  Because the same
+compiler will emit the accelerator code, no path should be specified.
+
+@item --with-hsa-runtime=@var{pathname}
+@itemx --with-hsa-runtime-include=@var{pathname}
+@itemx --with-hsa-runtime-lib=@var{pathname}
+
+If you configure GCC with HSA offloading but do not have the HSA
+run-time library installed in a standard location then you can
+explicitly specify the directory where they are installed.  The
+@option{--with-hsa-runtime=@/@var{hsainstalldir}} option is a
+shorthand for
+@option{--with-hsa-runtime-lib=@/@var{hsainstalldir}/lib} and
+@option{--with-hsa-runtime-include=@/@var{hsainstalldir}/include}.
+
+@item --with-hsa-kmt-lib=@var{pathname}
+
+If you configure GCC with HSA offloading but do not have the HSA
+KMT library installed in a standard location then you can
+explicitly specify the directory where it resides.
 @end table
 
 @subheading Cross-Compiler-Specific Options
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 77115a7..8ce04b1 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -295,7 +295,7 @@ Objective-C and Objective-C++ Dialects}.
 -Wunused-but-set-parameter -Wunused-but-set-variable @gol
 -Wuseless-cast -Wvariadic-macros -Wvector-operation-performance @gol
 -Wvla -Wvolatile-register-var  -Wwrite-strings @gol
--Wzero-as-null-pointer-constant}
+-Wzero-as-null-pointer-constant -Whsa}
 
 @item C and Objective-C-only Warning Options
 @gccoptlist{-Wbad-function-cast  -Wmissing-declarations @gol
@@ -5721,6 +5721,10 @@ Suppress warnings when a positional initializer is used 
to initialize
 a structure that has been marked with the @code{designated_init}
 attribute.
 
+@item -Whsa
+Issue a warning when HSAIL cannot be emitted for the compiled function or
+OpenMP construct.
+
 @end table
 
 @node Debugging Options
@@ -11262,6 +11266,12 @@ dynamic, guided, auto, runtime).  The default is 
static.
 Maximum depth of recursion when querying properties of SSA names in things
 like fold routines.  One level of recursion corresponds to following a
 use-def chain.
+
+@item hsa-gen-debug-stores
+Enable emission of special debug stores within HSA kernels which are
+then read and reported by libgomp plugin.  Generation of these stores
+is disabled by default, use @option{--param hsa-gen-debug-stores=1} to
+enable it.
 @end table
 @end table
 
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index ecb9996..16d1f45 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -736,6 +736,7 @@ compile_images_for_offload_targets (unsigned in_argc, char 
*in_argv[],
     return;
   unsigned num_targets = parse_env_var (target_names, &names, NULL);
 
+  int next_name_entry = 0;
   const char *compiler_path = getenv ("COMPILER_PATH");
   if (!compiler_path)
     goto out;
@@ -745,13 +746,19 @@ compile_images_for_offload_targets (unsigned in_argc, 
char *in_argv[],
   offload_names = XCNEWVEC (char *, num_targets + 1);
   for (unsigned i = 0; i < num_targets; i++)
     {
-      offload_names[i]
+      /* HSA does not use LTO-like streaming and a different compiler, skip
+        it. */
+      if (strcmp (names[i], "hsa") == 0)
+       continue;
+
+      offload_names[next_name_entry]
        = compile_offload_image (names[i], compiler_path, in_argc, in_argv,
                                 compiler_opts, compiler_opt_count,
                                 linker_opts, linker_opt_count);
-      if (!offload_names[i])
+      if (!offload_names[next_name_entry])
        fatal_error (input_location,
                     "problem with building target image for %s\n", names[i]);
+      next_name_entry++;
     }
 
  out:
diff --git a/gcc/opts.c b/gcc/opts.c
index 2add158..8e8410c 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1916,8 +1916,35 @@ common_handle_option (struct gcc_options *opts,
       break;
 
     case OPT_foffload_:
-      /* Deferred.  */
-      break;
+      {
+       const char *p = arg;
+       opts->x_flag_disable_hsa = true;
+       while (*p != 0)
+         {
+           const char *comma = strchr (p, ',');
+
+           if ((strncmp (p, "disable", 7) == 0)
+               && (p[7] == ',' || p[7] == '\0'))
+             {
+               opts->x_flag_disable_hsa = true;
+               break;
+             }
+
+           if ((strncmp (p, "hsa", 3) == 0)
+               && (p[3] == ',' || p[3] == '\0'))
+             {
+#ifdef ENABLE_HSA
+               opts->x_flag_disable_hsa = false;
+#else
+               sorry ("HSA has not been enabled during configuration");
+#endif
+             }
+           if (!comma)
+             break;
+           p = comma + 1;
+         }
+       break;
+      }
 
 #ifndef ACCEL_COMPILER
     case OPT_foffload_abi_:
diff --git a/gcc/params.def b/gcc/params.def
index 308844a..88971c7 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -1183,6 +1183,11 @@ DEFPARAM (PARAM_MAX_RTL_IF_CONVERSION_INSNS,
          "Maximum number of insns in a basic block to consider for RTL "
          "if-conversion.",
          10, 0, 99)
+
+DEFPARAM (PARAM_HSA_GEN_DEBUG_STORES,
+         "hsa-gen-debug-stores",
+         "Level of hsa debug stores verbosity",
+         0, 0, 1)
 /*
 
 Local variables:
diff --git a/libgomp/plugin/Makefrag.am b/libgomp/plugin/Makefrag.am
index 4efe963..035a663 100644
--- a/libgomp/plugin/Makefrag.am
+++ b/libgomp/plugin/Makefrag.am
@@ -38,3 +38,16 @@ libgomp_plugin_nvptx_la_LDFLAGS += $(PLUGIN_NVPTX_LDFLAGS)
 libgomp_plugin_nvptx_la_LIBADD = libgomp.la $(PLUGIN_NVPTX_LIBS)
 libgomp_plugin_nvptx_la_LIBTOOLFLAGS = --tag=disable-static
 endif
+
+if PLUGIN_HSA
+# Heterogenous Systems Architecture plugin
+libgomp_plugin_hsa_version_info = -version-info $(libtool_VERSION)
+toolexeclib_LTLIBRARIES += libgomp-plugin-hsa.la
+libgomp_plugin_hsa_la_SOURCES = plugin/plugin-hsa.c
+libgomp_plugin_hsa_la_CPPFLAGS = $(AM_CPPFLAGS) $(PLUGIN_HSA_CPPFLAGS)
+libgomp_plugin_hsa_la_LDFLAGS = $(libgomp_plugin_hsa_version_info) \
+       $(lt_host_flags)
+libgomp_plugin_hsa_la_LDFLAGS += $(PLUGIN_HSA_LDFLAGS)
+libgomp_plugin_hsa_la_LIBADD = libgomp.la $(PLUGIN_HSA_LIBS)
+libgomp_plugin_hsa_la_LIBTOOLFLAGS = --tag=disable-static
+endif
diff --git a/libgomp/plugin/configfrag.ac b/libgomp/plugin/configfrag.ac
index 768954a..2a9d9f9 100644
--- a/libgomp/plugin/configfrag.ac
+++ b/libgomp/plugin/configfrag.ac
@@ -81,6 +81,62 @@ AC_SUBST(PLUGIN_NVPTX_CPPFLAGS)
 AC_SUBST(PLUGIN_NVPTX_LDFLAGS)
 AC_SUBST(PLUGIN_NVPTX_LIBS)
 
+# Look for HSA run-time, its includes and libraries
+
+HSA_RUNTIME_INCLUDE=
+HSA_RUNTIME_LIB=
+AC_SUBST(HSA_RUNTIME_INCLUDE)
+AC_SUBST(HSA_RUNTIME_LIB)
+HSA_RUNTIME_CPPFLAGS=
+HSA_RUNTIME_LDFLAGS=
+
+AC_ARG_WITH(hsa-runtime,
+       [AS_HELP_STRING([--with-hsa-runtime=PATH],
+               [specify prefix directory for installed HSA run-time package.
+                Equivalent to --with-hsa-runtime-include=PATH/include
+                plus --with-hsa-runtime-lib=PATH/lib])])
+AC_ARG_WITH(hsa-runtime-include,
+       [AS_HELP_STRING([--with-hsa-runtime-include=PATH],
+               [specify directory for installed HSA run-time include files])])
+AC_ARG_WITH(hsa-runtime-lib,
+       [AS_HELP_STRING([--with-hsa-runtime-lib=PATH],
+               [specify directory for the installed HSA run-time library])])
+if test "x$with_hsa_runtime" != x; then
+  HSA_RUNTIME_INCLUDE=$with_hsa_runtime/include
+  HSA_RUNTIME_LIB=$with_hsa_runtime/lib
+fi
+if test "x$with_hsa_runtime_include" != x; then
+  HSA_RUNTIME_INCLUDE=$with_hsa_runtime_include
+fi
+if test "x$with_hsa_runtime_lib" != x; then
+  HSA_RUNTIME_LIB=$with_hsa_runtime_lib
+fi
+if test "x$HSA_RUNTIME_INCLUDE" != x; then
+  HSA_RUNTIME_CPPFLAGS=-I$HSA_RUNTIME_INCLUDE
+fi
+if test "x$HSA_RUNTIME_LIB" != x; then
+  HSA_RUNTIME_LDFLAGS=-L$HSA_RUNTIME_LIB
+fi
+
+AC_ARG_WITH(hsa-kmt-lib,
+       [AS_HELP_STRING([--with-hsa-kmt-lib=PATH],
+               [specify directory for installed HSA KMT library.])])
+if test "x$with_hsa_kmt_lib" != x; then
+  HSA_RUNTIME_LDFLAGS="$HSA_RUNTIME_LDFLAGS -L$with_hsa_kmt_lib"
+  HSA_RUNTIME_LIB=
+fi
+
+PLUGIN_HSA=0
+PLUGIN_HSA_CPPFLAGS=
+PLUGIN_HSA_LDFLAGS=
+PLUGIN_HSA_LIBS=
+AC_SUBST(PLUGIN_HSA)
+AC_SUBST(PLUGIN_HSA_CPPFLAGS)
+AC_SUBST(PLUGIN_HSA_LDFLAGS)
+AC_SUBST(PLUGIN_HSA_LIBS)
+
+
+
 # Get offload targets and path to install tree of offloading compiler.
 offload_additional_options=
 offload_additional_lib_paths=
@@ -122,6 +178,49 @@ if test x"$enable_offload_targets" != x; then
            ;;
        esac
        ;;
+      hsa*)
+       case "${target}" in
+         x86_64-*-*)
+           case " ${CC} ${CFLAGS} " in
+             *" -m32 "*)
+               PLUGIN_HSA=0
+               ;;
+             *)
+               tgt_name=hsa
+               PLUGIN_HSA=$tgt
+               PLUGIN_HSA_CPPFLAGS=$HSA_RUNTIME_CPPFLAGS
+               PLUGIN_HSA_LDFLAGS=$HSA_RUNTIME_LDFLAGS
+               PLUGIN_HSA_LIBS="-lhsa-runtime64 -lhsakmt"
+
+               PLUGIN_HSA_save_CPPFLAGS=$CPPFLAGS
+               CPPFLAGS="$PLUGIN_HSA_CPPFLAGS $CPPFLAGS"
+               PLUGIN_HSA_save_LDFLAGS=$LDFLAGS
+               LDFLAGS="$PLUGIN_HSA_LDFLAGS $LDFLAGS"
+               PLUGIN_HSA_save_LIBS=$LIBS
+               LIBS="$PLUGIN_HSA_LIBS $LIBS"
+
+               AC_LINK_IFELSE(
+                 [AC_LANG_PROGRAM(
+                   [#include "hsa.h"],
+                     [hsa_status_t status = hsa_init ()])],
+                 [PLUGIN_HSA=1])
+               CPPFLAGS=$PLUGIN_HSA_save_CPPFLAGS
+               LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
+               LIBS=$PLUGIN_HSA_save_LIBS
+               case $PLUGIN_HSA in
+                 hsa*)
+                   HSA_PLUGIN=0
+                   AC_MSG_ERROR([HSA run-time package required for HSA 
support])
+                   ;;
+               esac
+               ;;
+             esac
+           ;;
+         *-*-*)
+           PLUGIN_HSA=0
+            ;;
+        esac
+        ;;
       *)
        AC_MSG_ERROR([unknown offload target specified])
        ;;
@@ -145,3 +244,6 @@ AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
 AM_CONDITIONAL([PLUGIN_NVPTX], [test $PLUGIN_NVPTX = 1])
 AC_DEFINE_UNQUOTED([PLUGIN_NVPTX], [$PLUGIN_NVPTX],
   [Define to 1 if the NVIDIA plugin is built, 0 if not.])
+AM_CONDITIONAL([PLUGIN_HSA], [test $PLUGIN_HSA = 1])
+AC_DEFINE_UNQUOTED([PLUGIN_HSA], [$PLUGIN_HSA],
+  [Define to 1 if the HSA plugin is built, 0 if not.])

Reply via email to