===================================================================
@@ -1,3 +1,26 @@
+2014-03-20 Bernd Schmidt <bernds@codesourcery.com>
+
+ * configure.ac (real_target_noncanonical, tool_prefix,
+ accel_dir_suffix, offload_targets): Compute new variables.
+ (--enable-as-accelerator-for, --enable-as-accelerator,
+ --enable-offload-targets): New options.
+ * configure: Regenerate.
+ * config.in: Regenerate.
+ * Makefile.in (real_target_noncanonical, tool_prefix,
+ accel_dir_suffix, enable_as_accelerator): New variables substituted
+ by configure.
+ (libsubdir, libexecsubdir, GCC_TARGET_INSTALL_NAME): Tweak for the
+ possibility of being configured as an offload compiler.
+ (install_driver): Likewise.
+ (DRIVER_DEFINES): Pass new defines DEFAULT_REAL_TARGET_MACHINE and
+ ACCEL_DIR_SUFFIX.
+ * gcc.c (spec_host_machine, accel_dir_suffix): New variables.
+ (process_command): Tweak path construction for the possibility
+ of being configured as an offload compiler.
+ (main): Likewise. Look up specs in just_machine_suffix only if not
+ ACCEL_COMPILER. Construct OFFLOAD_TARGET_NAMES environment variable
+ if we have OFFLOAD_TARGETS.
+
2014-03-05 Jakub Jelinek <jakub@redhat.com>
PR plugins/59335
===================================================================
@@ -58,6 +58,7 @@ build=@build@
host=@host@
target=@target@
target_noncanonical:=@target_noncanonical@
+real_target_noncanonical:=@real_target_noncanonical@
# Sed command to transform gcc to installed name.
program_transform_name := @program_transform_name@
@@ -66,6 +67,11 @@ program_transform_name := @program_trans
# Directories used during build
# -----------------------------
+# Normally identical to target_noncanonical, except for compilers built
+# as accelerator targets.
+tool_prefix = @tool_prefix@
+accel_dir_suffix = @accel_dir_suffix@
+
# Directory where sources are, from where we are.
srcdir = @srcdir@
gcc_docdir = @srcdir@/doc
@@ -351,6 +357,8 @@ enable_plugin = @enable_plugin@
enable_host_shared = @enable_host_shared@
+enable_as_accelerator = @enable_as_accelerator@
+
CPPLIB = ../libcpp/libcpp.a
CPPINC = -I$(srcdir)/../libcpp/include
@@ -586,9 +594,9 @@ libexecdir = @libexecdir@
# --------
# Directory in which the compiler finds libraries etc.
-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(version)
+libsubdir = $(libdir)/gcc/$(real_target_noncanonical)/$(version)$(accel_dir_suffix)
# Directory in which the compiler finds executables
-libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(version)
+libexecsubdir = $(libexecdir)/gcc/$(real_target_noncanonical)/$(version)$(accel_dir_suffix)
# Directory in which all plugin resources are installed
plugin_resourcesdir = $(libsubdir)/plugin
# Directory in which plugin headers are installed
@@ -766,7 +774,7 @@ BUILD_CPPFLAGS= -I. -I$(@D) -I$(srcdir)
# Actual name to use when installing a native compiler.
GCC_INSTALL_NAME := $(shell echo gcc|sed '$(program_transform_name)')
-GCC_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gcc|sed '$(program_transform_name)')
+GCC_TARGET_INSTALL_NAME := $(tool_prefix)-$(shell echo gcc|sed '$(program_transform_name)')
CPP_INSTALL_NAME := $(shell echo cpp|sed '$(program_transform_name)')
GCOV_INSTALL_NAME := $(shell echo gcov|sed '$(program_transform_name)')
@@ -1935,9 +1943,11 @@ DRIVER_DEFINES = \
-DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc/\" \
-DSTANDARD_LIBEXEC_PREFIX=\"$(libexecdir)/gcc/\" \
-DDEFAULT_TARGET_VERSION=\"$(version)\" \
+ -DDEFAULT_REAL_TARGET_MACHINE=\"$(real_target_noncanonical)\" \
-DDEFAULT_TARGET_MACHINE=\"$(target_noncanonical)\" \
-DSTANDARD_BINDIR_PREFIX=\"$(bindir)/\" \
-DTOOLDIR_BASE_PREFIX=\"$(libsubdir_to_prefix)$(prefix_to_exec_prefix)\" \
+ -DACCEL_DIR_SUFFIX=\"$(accel_dir_suffix)\" \
@TARGET_SYSTEM_ROOT_DEFINE@ \
$(VALGRIND_DRIVER_DEFINES) \
$(if $(SHLIB),$(if $(filter yes,@enable_shared@),-DENABLE_SHARED_LIBGCC)) \
@@ -3204,16 +3214,22 @@ install-common: native lang.install-comm
# Install the driver program as $(target_noncanonical)-gcc,
# $(target_noncanonical)-gcc-$(version), and also as gcc if native.
install-driver: installdirs xgcc$(exeext)
- -rm -f $(DESTDIR)$(bindir)/$(GCC_INSTALL_NAME)$(exeext)
- -$(INSTALL_PROGRAM) xgcc$(exeext) $(DESTDIR)$(bindir)/$(GCC_INSTALL_NAME)$(exeext)
- -rm -f $(DESTDIR)$(bindir)/$(target_noncanonical)-gcc-$(version)$(exeext)
- -( cd $(DESTDIR)$(bindir) && \
- $(LN) $(GCC_INSTALL_NAME)$(exeext) $(target_noncanonical)-gcc-$(version)$(exeext) )
- -if [ ! -f gcc-cross$(exeext) ] ; then \
- rm -f $(DESTDIR)$(bindir)/$(target_noncanonical)-gcc-tmp$(exeext); \
+ -install_name=$(GCC_INSTALL_NAME); \
+ if test "@enable_as_accelerator@" = "yes" ; then \
+ install_name=$(GCC_TARGET_INSTALL_NAME); \
+ fi; \
+ rm -f $(DESTDIR)$(bindir)/$${install_name}$(exeext); \
+ $(INSTALL_PROGRAM) xgcc$(exeext) $(DESTDIR)$(bindir)/$${install_name}$(exeext)
+ -if test "@enable_as_accelerator@" != "yes" ; then \
+ rm -f $(DESTDIR)$(bindir)/$(tool_prefix)-gcc-$(version)$(exeext); \
( cd $(DESTDIR)$(bindir) && \
- $(LN) $(GCC_INSTALL_NAME)$(exeext) $(target_noncanonical)-gcc-tmp$(exeext) && \
- mv -f $(target_noncanonical)-gcc-tmp$(exeext) $(GCC_TARGET_INSTALL_NAME)$(exeext) ); \
+ $(LN) $(GCC_INSTALL_NAME)$(exeext) $(tool_prefix)-gcc-$(version)$(exeext) ); \
+ if [ ! -f gcc-cross$(exeext) ] ; then \
+ rm -f $(DESTDIR)$(bindir)/$(tool_prefix)-gcc-tmp$(exeext); \
+ ( cd $(DESTDIR)$(bindir) && \
+ $(LN) $(GCC_INSTALL_NAME)$(exeext) $(tool_prefix)-gcc-tmp$(exeext) && \
+ mv -f $(tool_prefix)-gcc-tmp$(exeext) $(GCC_TARGET_INSTALL_NAME)$(exeext) ); \
+ fi; \
fi
# Install the info files.
===================================================================
@@ -1,5 +1,12 @@
/* config.in. Generated from configure.ac by autoheader. */
+/* Define if this compiler should be built and used as the target device
+ compiler for OpenACC. */
+#ifndef USED_FOR_TARGET
+#undef ACCEL_COMPILER
+#endif
+
+
/* Define if building universal (internal helper macro) */
#ifndef USED_FOR_TARGET
#undef AC_APPLE_UNIVERSAL_BUILD
@@ -1729,6 +1736,12 @@
#endif
+/* Define to hold the list of target names suitable for offloading. */
+#ifndef USED_FOR_TARGET
+#undef OFFLOAD_TARGETS
+#endif
+
+
/* Define to the address where bug reports for this package should be sent. */
#ifndef USED_FOR_TARGET
#undef PACKAGE_BUGREPORT
===================================================================
@@ -610,6 +610,9 @@ ISLINC
ISLLIBS
GMPINC
GMPLIBS
+accel_dir_suffix
+real_target_noncanonical
+tool_prefix
target_cpu_default
fortran_target_objs
cxx_target_objs
@@ -761,6 +764,8 @@ LN
LN_S
AWK
SET_MAKE
+enable_as_accelerator
+enable_accelerator
REPORT_BUGS_TEXI
REPORT_BUGS_TO
PKGVERSION
@@ -900,6 +905,9 @@ with_specs
with_pkgversion
with_bugurl
enable_languages
+enable_accelerator
+enable_as_accelerator_for
+enable_offload_targets
with_multilib_list
enable_rpath
with_libiconv_prefix
@@ -1607,6 +1615,11 @@ Optional Features:
GNU Objective-C runtime
--disable-shared don't provide a shared libgcc
--enable-languages=LIST specify which front-ends to build
+ --enable-accelerator build accelerator [ARG={no,device-triplet}]
+ --enable-as-accelerator-for
+ build compiler as accelerator target for given host
+ --enable-offload-targets=LIST
+ enable offloading to devices from LIST
--disable-rpath do not hardcode runtime library paths
--enable-sjlj-exceptions
arrange to use setjmp/longjmp exception handling
@@ -3191,6 +3204,11 @@ esac
+# Used for constructing correct paths for offload compilers.
+real_target_noncanonical=${target_noncanonical}
+tool_prefix=$target_noncanonical
+accel_dir_suffix=
+
# Determine the target- and build-specific subdirectories
# post-stage1 host modules use a different CC_FOR_BUILD so, in order to
@@ -7283,6 +7301,69 @@ else
fi
+offload_targets=
+# Check whether --enable-accelerator was given.
+if test "${enable_accelerator+set}" = set; then :
+ enableval=$enable_accelerator;
+ case $enable_accelerator in
+ no) ;;
+ *)
+ offload_targets=$enable_accelerator
+ ;;
+ esac
+
+else
+ enable_accelerator=no
+fi
+
+
+
+# Check whether --enable-as-accelerator-for was given.
+if test "${enable_as_accelerator_for+set}" = set; then :
+ enableval=$enable_as_accelerator_for;
+ if test $enable_accelerator = no; then
+ echo "--enable-as-accelerator-for requires --enable-accelerator"
+ exit 1;
+ fi
+
+$as_echo "#define ACCEL_COMPILER 1" >>confdefs.h
+
+ enable_as_accelerator=yes
+ tool_prefix=${enable_as_accelerator_for}-accel-${enable_accelerator}
+ accel_dir_suffix=/accel/${target_noncanonical}
+ real_target_noncanonical=${enable_as_accelerator_for}
+
+else
+ enable_as_accelerator=no
+fi
+
+
+
+# Check whether --enable-offload-targets was given.
+if test "${enable_offload_targets+set}" = set; then :
+ enableval=$enable_offload_targets;
+ if test x$enable_offload_targets = x; then
+ as_fn_error "no offload targets specified" "$LINENO" 5
+ else
+ if test x$offload_targets = x; then
+ offload_targets=$enable_offload_targets
+ else
+ offload_targets=$offload_targets,$enable_offload_targets
+ fi
+ fi
+
+else
+ enable_accelerator=no
+fi
+
+
+offload_targets=`echo $offload_targets | sed -e 's#,#:#'`
+
+cat >>confdefs.h <<_ACEOF
+#define OFFLOAD_TARGETS "$offload_targets"
+_ACEOF
+
+
# Check whether --with-multilib-list was given.
if test "${with_multilib_list+set}" = set; then :
@@ -10970,6 +11051,10 @@ else
force_sjlj_exceptions=yes
enableval=yes
;;
+ lm32*-*-*)
+ force_sjlj_exceptions=yes
+ enableval=yes
+ ;;
*)
force_sjlj_exceptions=no
;;
@@ -17923,7 +18008,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 17926 "configure"
+#line 18011 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -18029,7 +18114,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 18032 "configure"
+#line 18117 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -27632,6 +27717,9 @@ fi
+
+
+
===================================================================
@@ -38,6 +38,11 @@ AC_CANONICAL_TARGET
# Determine the noncanonical target name, for directory use.
ACX_NONCANONICAL_TARGET
+# Used for constructing correct paths for offload compilers.
+real_target_noncanonical=${target_noncanonical}
+tool_prefix=$target_noncanonical
+accel_dir_suffix=
+
# Determine the target- and build-specific subdirectories
GCC_TOPLEV_SUBDIRS
@@ -834,6 +839,55 @@ AC_ARG_ENABLE(languages,
esac],
[enable_languages=c])
+offload_targets=
+AC_ARG_ENABLE(accelerator,
+[AS_HELP_STRING([--enable-accelerator], [build accelerator @<:@ARG={no,device-triplet}@:>@])],
+[
+ case $enable_accelerator in
+ no) ;;
+ *)
+ offload_targets=$enable_accelerator
+ ;;
+ esac
+], [enable_accelerator=no])
+AC_SUBST(enable_accelerator)
+
+AC_ARG_ENABLE(as-accelerator-for,
+[AS_HELP_STRING([--enable-as-accelerator-for], [build compiler as accelerator target for given host])],
+[
+ if test $enable_accelerator = no; then
+ echo "--enable-as-accelerator-for requires --enable-accelerator"
+ exit 1;
+ fi
+ AC_DEFINE(ACCEL_COMPILER, 1,
+ [Define if this compiler should be built and used as the target
+ device compiler for OpenACC.])
+ enable_as_accelerator=yes
+ tool_prefix=${enable_as_accelerator_for}-accel-${enable_accelerator}
+ accel_dir_suffix=/accel/${target_noncanonical}
+ real_target_noncanonical=${enable_as_accelerator_for}
+], [enable_as_accelerator=no])
+AC_SUBST(enable_as_accelerator)
+
+AC_ARG_ENABLE(offload-targets,
+[AS_HELP_STRING([--enable-offload-targets=LIST],
+ [enable offloading to devices from LIST])],
+[
+ if test x$enable_offload_targets = x; then
+ AC_MSG_ERROR([no offload targets specified])
+ else
+ if test x$offload_targets = x; then
+ offload_targets=$enable_offload_targets
+ else
+ offload_targets=$offload_targets,$enable_offload_targets
+ fi
+ fi
+], [enable_accelerator=no])
+AC_SUBST(enable_accelerator)
+offload_targets=`echo $offload_targets | sed -e 's#,#:#'`
+AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
+ [Define to hold the list of target names suitable for offloading.])
+
AC_ARG_WITH(multilib-list,
[AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, SH and x86-64 only)])],
:,
@@ -5379,6 +5433,9 @@ AC_SUBST(c_target_objs)
AC_SUBST(cxx_target_objs)
AC_SUBST(fortran_target_objs)
AC_SUBST(target_cpu_default)
+AC_SUBST(tool_prefix)
+AC_SUBST(real_target_noncanonical)
+AC_SUBST(accel_dir_suffix)
AC_SUBST_FILE(language_hooks)
===================================================================
@@ -157,6 +157,7 @@ static const char *const spec_version =
/* The target machine. */
static const char *spec_machine = DEFAULT_TARGET_MACHINE;
+static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE;
/* Nonzero if cross-compiling.
When -b is used, the value comes from the `specs' file. */
@@ -1230,6 +1231,9 @@ static const char *const standard_startf
relative to the driver. */
static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
+/* A prefix to be used when this is an accelerator compiler. */
+static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX;
+
/* Subdirectory to use for locating libraries. Set by
set_multilib_dir based on the compilation options. */
@@ -4044,15 +4048,15 @@ process_command (unsigned int decoded_op
}
gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
- tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
+ tooldir_prefix2 = concat (tooldir_base_prefix, spec_host_machine,
dir_separator_str, NULL);
/* Look for tools relative to the location from which the driver is
running, or, if that is not available, the configured prefix. */
tooldir_prefix
= concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
- spec_machine, dir_separator_str,
- spec_version, dir_separator_str, tooldir_prefix2, NULL);
+ spec_host_machine, dir_separator_str, spec_version,
+ accel_dir_suffix, dir_separator_str, tooldir_prefix2, NULL);
free (tooldir_prefix2);
add_prefix (&exec_prefixes,
@@ -6458,8 +6462,8 @@ main (int argc, char **argv)
/* Read specs from a file if there is one. */
- machine_suffix = concat (spec_machine, dir_separator_str,
- spec_version, dir_separator_str, NULL);
+ machine_suffix = concat (spec_host_machine, dir_separator_str, spec_version,
+ accel_dir_suffix, dir_separator_str, NULL);
just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
@@ -6469,16 +6473,17 @@ main (int argc, char **argv)
else
init_spec ();
+#ifndef ACCEL_COMPILER
/* We need to check standard_exec_prefix/just_machine_suffix/specs
for any override of as, ld and libraries. */
specs_file = (char *) alloca (strlen (standard_exec_prefix)
+ strlen (just_machine_suffix) + sizeof ("specs"));
-
strcpy (specs_file, standard_exec_prefix);
strcat (specs_file, just_machine_suffix);
strcat (specs_file, "specs");
if (access (specs_file, R_OK) == 0)
read_specs (specs_file, true, false);
+#endif
/* Process any configure-time defaults specified for the command line
options, via OPTION_DEFAULT_SPECS. */
@@ -6657,8 +6662,9 @@ main (int argc, char **argv)
/* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
if (gcc_exec_prefix)
- gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
- spec_version, dir_separator_str, NULL);
+ gcc_exec_prefix = concat (gcc_exec_prefix, spec_host_machine,
+ dir_separator_str, spec_version,
+ accel_dir_suffix, dir_separator_str, NULL);
/* Now we have the specs.
Set the `valid' bits for switches that match anything in any spec. */
@@ -6677,6 +6683,16 @@ main (int argc, char **argv)
obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
xputenv (XOBFINISH (&collect_obstack, char *));
+ if (strlen (OFFLOAD_TARGETS) > 0)
+ {
+ obstack_init (&collect_obstack);
+ obstack_grow (&collect_obstack, "OFFLOAD_TARGET_NAMES=",
+ sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
+ obstack_grow (&collect_obstack, OFFLOAD_TARGETS,
+ strlen (OFFLOAD_TARGETS) + 1);
+ xputenv (XOBFINISH (&collect_obstack, char *));
+ }
+
/* Set up to remember the pathname of the lto wrapper. */
if (have_c)