This adds three options to gcc's configure for accelerator/offload targets.
--enable-as-accelerator-for=host This is used to build offload compilers. They get installed in a subdirectory of their host compiler's install directory, with the driver going into the standard bin/ directory but with a different names --enable-accelerator=target --enable-offload-targets=target-list These have similar purposes; --enable-accelerator= is used if there's just a single offload target being built in-tree in the accel-gcc subdirectory (implemented by the next patch, and expected to be used for ptx), --enable-offload-targets= is used if there are multiple offload target compilers already built and installed. Committed on gomp-4_0-branch. Bernd
Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 208706) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,26 @@ +2014-03-20 Bernd Schmidt <ber...@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 <ja...@redhat.com> PR plugins/59335 Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in (revision 208706) +++ gcc/Makefile.in (working copy) @@ -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. Index: gcc/config.in =================================================================== --- gcc/config.in (revision 208706) +++ gcc/config.in (working copy) @@ -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 Index: gcc/configure =================================================================== --- gcc/configure (revision 208706) +++ gcc/configure (working copy) @@ -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 + + + Index: gcc/configure.ac =================================================================== --- gcc/configure.ac (revision 208706) +++ gcc/configure.ac (working copy) @@ -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) Index: gcc/gcc.c =================================================================== --- gcc/gcc.c (revision 208706) +++ gcc/gcc.c (working copy) @@ -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)