Hi,

The patch has been updated:

On 17 Sep 15:45, Jakub Jelinek wrote:
> Looks mostly ok, just some nits.  But see the patch I've just posted,
> perhaps we want to tweak the --enable-offload-targets arguments.  And

Now the targets in --enable-offload-targets can have optional path to the build
or install tree of the corresponding offload compiler.

> > --- /dev/null
> > +++ b/libgcc/ompstuff.c
> > @@ -0,0 +1,79 @@
> > +/* FIXME: Including auto-host is incorrect, but until we have
> > +   identified the set of defines that need to go into auto-target.h,
> > +   this will have to do.  */
> > +#include "auto-host.h"
> > +#undef pid_t
> > +#undef rlim_t
> > +#undef ssize_t
> > +#undef vfork
> 
> crtstuff.c undefs here also caddr_t, any reason not to do that too?

caddr_t was added to the crtstuff.c after ompstuff.c was created.  Fixed.

> > +#if defined(HAVE_GAS_HIDDEN) && defined(ENABLE_OFFLOADING)
> > +void *_omp_func_table[0]
> > +  __attribute__ ((__used__, visibility ("hidden"),
> > +             section (OFFLOAD_FUNC_TABLE_SECTION_NAME))) = { };
> > +void *_omp_var_table[0]
> > +  __attribute__ ((__used__, visibility ("hidden"),
> > +             section (OFFLOAD_VAR_TABLE_SECTION_NAME))) = { };
> > +#endif
> 
> Does this mean that if HAVE_GAS_HIDDEN is not defined, you don't
> define _omp_*_table at all and offloading will fail?
> I wonder if it just should avoid visibility ("hidden") if it isn't
> supported.

Without visibility ("hidden") offloading works in case if there is only an
executable.  If some dso will register their _omp_func_table in libgomp,
offloading will not work, since _omp_func_table from the executable override
the respective symbols in dso.  So, if there are exec and dso with offloading,
but without visibility ("hidden"), I'd prefer to perform host fallback, as is
now, rather than crashing at run-time.

Also, previous patch contains a bug: if a compiler is configured as accelerator,
it installs *-accel-*-g++, and other drivers.  But only *-accel-*-gcc is needed.
Therefore I suppressed their installation in corresponding Makefiles.

The define OFFLOAD_LIBRARY is now removed from libgomp, since it is no longer
needed.

And libexecsubdir in lto-plugin/Makefile.in is tweaked for the possibility of
being configured as accelerator (like it was done in gcc/Makefile.in).
Otherwise offload compiler is unable to find its plugin.

Bootstrapped and regtested on i686-linux and x86_64-linux.
OK for trunk (after everything has been reviewed)?


2014-09-26  Bernd Schmidt  <ber...@codesourcery.com>
            Thomas Schwinge  <tho...@codesourcery.com>
            Ilya Verbin  <ilya.ver...@intel.com>
            Andrey Turetskiy  <andrey.turets...@intel.com>

        * configure: Regenerate.
        * configure.ac (--enable-as-accelerator-for)
        (--enable-offload-targets): New configure options.
gcc/
        * Makefile.in (real_target_noncanonical, accel_dir_suffix)
        (enable_as_accelerator): New variables substituted by configure.
        (libsubdir, libexecsubdir, unlibsubdir): Tweak for the possibility of
        being configured as an offload compiler.
        (DRIVER_DEFINES): Pass new defines DEFAULT_REAL_TARGET_MACHINE and
        ACCEL_DIR_SUFFIX.
        (install-cpp, install-common, install_driver, install-gcc-ar): Do not
        install for the offload compiler.
        * config.in: Regenerate.
        * configure: Regenerate.
        * configure.ac (real_target_noncanonical, accel_dir_suffix)
        (enable_as_accelerator, enable_offload_targets): Compute new variables.
        (--enable-as-accelerator-for, --enable-offload-targets): New options.
        (ACCEL_COMPILER): Define if the compiler is built as the accel compiler.
        (OFFLOAD_TARGETS): List of target names suitable for offloading.
        (ENABLE_OFFLOADING): Define if list of offload targets is not empty.
gcc/cp/
        * Make-lang.in (c++.install-common): Do not install for the offload
        compiler.
gcc/fortran/
        * Make-lang.in (fortran.install-common): Do not install for the offload
        compiler.
libgcc/
        * Makefile.in (crtompbegin$(objext), crtompend$(objext)): New rule.
        * configure: Regenerate.
        * configure.ac (--enable-as-accelerator-for)
        (--enable-offload-targets): New configure options.
        (extra_parts): Add crtompbegin.o and crtompend.o if
        enable_offload_targets is not empty.
        * ompstuff.c: New file.
libgomp/
        * config.h.in: Regenerate.
        * configure: Regenerate.
        * configure.ac: Check for libdl, required for plugin support.
        (PLUGIN_SUPPORT): Define if plugins are supported.
        (--enable-offload-targets): New configure option.
        (enable_offload_targets): Support Intel MIC targets.
        (OFFLOAD_TARGETS): List of target names suitable for offloading.
lto-plugin/
        * Makefile.am (libexecsubdir): Tweak for the possibility of being
        configured for offload compiler.
        (accel_dir_suffix): New variable substituted by configure.
        * Makefile.in: Regenerate.
        * configure: Regenerate.
        * configure.ac (--enable-as-accelerator-for): New option.

Thanks,
  -- Ilya


---

diff --git a/configure b/configure
index 55fca62..956062a 100755
--- a/configure
+++ b/configure
@@ -747,6 +747,8 @@ ospace_frag'
 ac_user_opts='
 enable_option_checking
 with_build_libsubdir
+enable_as_accelerator_for
+enable_offload_targets
 enable_gold
 enable_ld
 enable_libquadmath
@@ -1466,6 +1468,13 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-as-accelerator-for=ARG
+                          build as offload target compiler. Specify offload
+                          host triple by ARG
+  --enable-offload-targets=LIST
+                          enable offloading to devices from comma-separated
+                          LIST of TARGET[=DIR]. Use optional path to find
+                          offload target compiler during the build
   --enable-gold[=ARG]     build gold [ARG={default,yes,no}]
   --enable-ld[=ARG]       build ld [ARG={default,yes,no}]
   --disable-libquadmath   do not build libquadmath directory
@@ -2893,6 +2902,26 @@ case ${with_newlib} in
   yes) skipdirs=`echo " ${skipdirs} " | sed -e 's/ target-newlib / /'` ;;
 esac
 
+# Check whether --enable-as-accelerator-for was given.
+if test "${enable_as_accelerator_for+set}" = set; then :
+  enableval=$enable_as_accelerator_for; ENABLE_AS_ACCELERATOR_FOR=$enableval
+else
+  ENABLE_AS_ACCELERATOR_FOR=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
+  fi
+
+else
+  enable_offload_targets=
+fi
+
+
 # Handle --enable-gold, --enable-ld.
 # --disable-gold [--enable-ld]
 #     Build only ld.  Default option.
diff --git a/configure.ac b/configure.ac
index 2dc657f..d031452 100644
--- a/configure.ac
+++ b/configure.ac
@@ -286,6 +286,24 @@ case ${with_newlib} in
   yes) skipdirs=`echo " ${skipdirs} " | sed -e 's/ target-newlib / /'` ;;
 esac
 
+AC_ARG_ENABLE(as-accelerator-for,
+[AS_HELP_STRING([--enable-as-accelerator-for=ARG],
+               [build as offload target compiler.
+               Specify offload host triple by ARG])],
+ENABLE_AS_ACCELERATOR_FOR=$enableval,
+ENABLE_AS_ACCELERATOR_FOR=no)
+
+AC_ARG_ENABLE(offload-targets,
+[AS_HELP_STRING([--enable-offload-targets=LIST],
+               [enable offloading to devices from comma-separated LIST of
+               TARGET[=DIR]. Use optional path to find offload target compiler
+               during the build])],
+[
+  if test x"$enable_offload_targets" = x; then
+    AC_MSG_ERROR([no offload targets specified])
+  fi
+], [enable_offload_targets=])
+
 # Handle --enable-gold, --enable-ld.
 # --disable-gold [--enable-ld]
 #     Build only ld.  Default option.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 97b439a..36f2d0f 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -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,10 @@ program_transform_name := @program_transform_name@
 # Directories used during build
 # -----------------------------
 
+# Normally identical to target_noncanonical, except for compilers built
+# as accelerator targets.
+accel_dir_suffix = @accel_dir_suffix@
+
 # Directory where sources are, from where we are.
 srcdir = @srcdir@
 gcc_docdir = @srcdir@/doc
@@ -356,6 +361,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
 
@@ -567,9 +574,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
@@ -577,7 +584,11 @@ plugin_includedir = $(plugin_resourcesdir)/include
 # Directory in which plugin specific executables are installed
 plugin_bindir = $(libexecsubdir)/plugin
 # Used to produce a relative $(gcc_tooldir) in gcc.o
+ifeq ($(enable_as_accelerator),yes)
+unlibsubdir = ../../../../..
+else
 unlibsubdir = ../../..
+endif
 # $(prefix), expressed as a path relative to $(libsubdir).
 #
 # An explanation of the sed strings:
@@ -1929,9 +1940,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)) \
@@ -3103,12 +3116,14 @@ install-strip: install
 
 # Handle cpp installation.
 install-cpp: installdirs cpp$(exeext)
-       -rm -f $(DESTDIR)$(bindir)/$(CPP_INSTALL_NAME)$(exeext)
-       -$(INSTALL_PROGRAM) -m 755 cpp$(exeext) 
$(DESTDIR)$(bindir)/$(CPP_INSTALL_NAME)$(exeext)
-       -if [ x$(cpp_install_dir) != x ]; then \
-         rm -f 
$(DESTDIR)$(prefix)/$(cpp_install_dir)/$(CPP_INSTALL_NAME)$(exeext); \
-         $(INSTALL_PROGRAM) -m 755 cpp$(exeext) 
$(DESTDIR)$(prefix)/$(cpp_install_dir)/$(CPP_INSTALL_NAME)$(exeext); \
-       else true; fi
+       -if test "$(enable_as_accelerator)" != "yes" ; then \
+         rm -f $(DESTDIR)$(bindir)/$(CPP_INSTALL_NAME)$(exeext); \
+         $(INSTALL_PROGRAM) -m 755 cpp$(exeext) 
$(DESTDIR)$(bindir)/$(CPP_INSTALL_NAME)$(exeext); \
+         if [ x$(cpp_install_dir) != x ]; then \
+           rm -f 
$(DESTDIR)$(prefix)/$(cpp_install_dir)/$(CPP_INSTALL_NAME)$(exeext); \
+           $(INSTALL_PROGRAM) -m 755 cpp$(exeext) 
$(DESTDIR)$(prefix)/$(cpp_install_dir)/$(CPP_INSTALL_NAME)$(exeext); \
+         else true; fi; \
+       fi
 
 # Create the installation directories.
 # $(libdir)/gcc/include isn't currently searched by cpp.
@@ -3216,17 +3231,21 @@ install-common: native lang.install-common installdirs
 # otherwise override the specs built into the driver.
        rm -f $(DESTDIR)$(libsubdir)/specs
 # Install gcov if it was compiled.
-       -if [ -f gcov$(exeext) ]; \
-       then \
+       -if test "$(enable_as_accelerator)" != "yes" ; then \
+         if [ -f gcov$(exeext) ]; \
+         then \
            rm -f $(DESTDIR)$(bindir)/$(GCOV_INSTALL_NAME)$(exeext); \
            $(INSTALL_PROGRAM) gcov$(exeext) 
$(DESTDIR)$(bindir)/$(GCOV_INSTALL_NAME)$(exeext); \
+         fi; \
        fi
 # Install gcov-tool if it was compiled.
-       -if [ -f gcov-tool$(exeext) ]; \
-       then \
+       -if test "$(enable_as_accelerator)" != "yes" ; then \
+         if [ -f gcov-tool$(exeext) ]; \
+         then \
            rm -f $(DESTDIR)$(bindir)/$(GCOV_TOOL_INSTALL_NAME)$(exeext); \
            $(INSTALL_PROGRAM) \
            gcov-tool$(exeext) 
$(DESTDIR)$(bindir)/$(GCOV_TOOL_INSTALL_NAME)$(exeext); \
+         fi; \
        fi
 
 # Install the driver program as $(target_noncanonical)-gcc,
@@ -3234,17 +3253,19 @@ install-common: native lang.install-common installdirs
 install-driver: installdirs xgcc$(exeext)
        -rm -f $(DESTDIR)$(bindir)/$(GCC_INSTALL_NAME)$(exeext)
        -$(INSTALL_PROGRAM) xgcc$(exeext) 
$(DESTDIR)$(bindir)/$(GCC_INSTALL_NAME)$(exeext)
-       -if [ "$(GCC_INSTALL_NAME)" != "$(target_noncanonical)-gcc-$(version)" 
]; then \
-         rm -f 
$(DESTDIR)$(bindir)/$(target_noncanonical)-gcc-$(version)$(exeext); \
-         ( cd $(DESTDIR)$(bindir) && \
-           $(LN) $(GCC_INSTALL_NAME)$(exeext) 
$(target_noncanonical)-gcc-$(version)$(exeext) ); \
-       fi
-       -if [ ! -f gcc-cross$(exeext) ] \
-           && [ "$(GCC_INSTALL_NAME)" != "$(GCC_TARGET_INSTALL_NAME)" ]; then \
-         rm -f $(DESTDIR)$(bindir)/$(target_noncanonical)-gcc-tmp$(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) ); \
+       -if test "$(enable_as_accelerator)" != "yes" ; then \
+         if [ "$(GCC_INSTALL_NAME)" != "$(target_noncanonical)-gcc-$(version)" 
]; then \
+           rm -f 
$(DESTDIR)$(bindir)/$(target_noncanonical)-gcc-$(version)$(exeext); \
+           ( cd $(DESTDIR)$(bindir) && \
+             $(LN) $(GCC_INSTALL_NAME)$(exeext) 
$(target_noncanonical)-gcc-$(version)$(exeext) ); \
+         fi; \
+         if [ ! -f gcc-cross$(exeext) ] \
+             && [ "$(GCC_INSTALL_NAME)" != "$(GCC_TARGET_INSTALL_NAME)" ]; 
then \
+           rm -f $(DESTDIR)$(bindir)/$(target_noncanonical)-gcc-tmp$(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) ); \
+         fi; \
        fi
 
 # Install the info files.
@@ -3441,19 +3462,21 @@ install-lto-wrapper: lto-wrapper$(exeext)
        $(INSTALL_PROGRAM) lto-wrapper$(exeext) 
$(DESTDIR)$(libexecsubdir)/lto-wrapper$(exeext)
 
 install-gcc-ar: installdirs gcc-ar$(exeext) gcc-nm$(exeext) gcc-ranlib$(exeext)
-       for i in gcc-ar gcc-nm gcc-ranlib; do \
-         install_name=`echo $$i|sed '$(program_transform_name)'` ;\
-         target_install_name=$(target_noncanonical)-`echo $$i|sed 
'$(program_transform_name)'` ; \
-         rm -f $(DESTDIR)$(bindir)/$$install_name$(exeext) ; \
-         $(INSTALL_PROGRAM) $$i$(exeext) 
$(DESTDIR)$(bindir)/$$install_name$(exeext) ;\
-         if test -f gcc-cross$(exeext); then \
-           :; \
-         else \
-           rm -f $(DESTDIR)$(bindir)/$$target_install_name$(exeext); \
-           ( cd $(DESTDIR)$(bindir) && \
-             $(LN) $$install_name$(exeext) $$target_install_name$(exeext) ) ; \
-         fi ; \
-       done
+       if test "$(enable_as_accelerator)" != "yes" ; then \
+         for i in gcc-ar gcc-nm gcc-ranlib; do \
+           install_name=`echo $$i|sed '$(program_transform_name)'` ;\
+           target_install_name=$(target_noncanonical)-`echo $$i|sed 
'$(program_transform_name)'` ; \
+           rm -f $(DESTDIR)$(bindir)/$$install_name$(exeext) ; \
+           $(INSTALL_PROGRAM) $$i$(exeext) 
$(DESTDIR)$(bindir)/$$install_name$(exeext) ;\
+           if test -f gcc-cross$(exeext); then \
+             :; \
+           else \
+             rm -f $(DESTDIR)$(bindir)/$$target_install_name$(exeext); \
+             ( cd $(DESTDIR)$(bindir) && \
+               $(LN) $$install_name$(exeext) $$target_install_name$(exeext) ) 
; \
+           fi ; \
+         done; \
+       fi
 
 # Cancel installation by deleting the installed files.
 uninstall: lang.uninstall
diff --git a/gcc/config.in b/gcc/config.in
index 90809e3..bf07125 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -1,5 +1,11 @@
 /* config.in.  Generated from configure.ac by autoheader.  */
 
+/* Define if this compiler should be built as the offload target compiler. */
+#ifndef USED_FOR_TARGET
+#undef ACCEL_COMPILER
+#endif
+
+
 /* Define if building universal (internal helper macro) */
 #ifndef USED_FOR_TARGET
 #undef AC_APPLE_UNIVERSAL_BUILD
@@ -144,6 +150,12 @@
 #endif
 
 
+/* Define this to enable support for offloading. */
+#ifndef USED_FOR_TARGET
+#undef ENABLE_OFFLOADING
+#endif
+
+
 /* Define to enable plugin support. */
 #ifndef USED_FOR_TARGET
 #undef ENABLE_PLUGIN
@@ -1699,16 +1711,19 @@
 #undef HAVE_WORKING_VFORK
 #endif
 
-/* Define if isl is in use. */
-#ifndef USED_FOR_TARGET
-#undef HAVE_isl
-#endif
 
 /* Define if cloog is in use. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_cloog
 #endif
 
+
+/* Define if isl is in use. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_isl
+#endif
+
+
 /* Define if F_SETLKW supported by fcntl. */
 #ifndef USED_FOR_TARGET
 #undef HOST_HAS_F_SETLKW
@@ -1783,6 +1798,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
diff --git a/gcc/configure b/gcc/configure
index 380a235..b02df3f 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -610,6 +610,8 @@ ISLINC
 ISLLIBS
 GMPINC
 GMPLIBS
+accel_dir_suffix
+real_target_noncanonical
 target_cpu_default
 fortran_target_objs
 cxx_target_objs
@@ -761,6 +763,7 @@ LN
 LN_S
 AWK
 SET_MAKE
+enable_as_accelerator
 REPORT_BUGS_TEXI
 REPORT_BUGS_TO
 PKGVERSION
@@ -901,6 +904,8 @@ with_specs
 with_pkgversion
 with_bugurl
 enable_languages
+enable_as_accelerator_for
+enable_offload_targets
 with_multilib_list
 enable_rpath
 with_libiconv_prefix
@@ -1610,6 +1615,13 @@ Optional Features:
                           GNU Objective-C runtime
   --disable-shared        don't provide a shared libgcc
   --enable-languages=LIST specify which front-ends to build
+  --enable-as-accelerator-for=ARG
+                          build as offload target compiler. Specify offload
+                          host triple by ARG
+  --enable-offload-targets=LIST
+                          enable offloading to devices from comma-separated
+                          LIST of TARGET[=DIR]. Use optional path to find
+                          offload target compiler during the build
   --disable-rpath         do not hardcode runtime library paths
   --enable-sjlj-exceptions
                           arrange to use setjmp/longjmp exception handling
@@ -3194,6 +3206,10 @@ esac
 
 
 
+# Used for constructing correct paths for offload compilers.
+real_target_noncanonical=${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
@@ -7391,6 +7407,61 @@ else
 fi
 
 
+# Check whether --enable-as-accelerator-for was given.
+if test "${enable_as_accelerator_for+set}" = set; then :
+  enableval=$enable_as_accelerator_for;
+
+$as_echo "#define ACCEL_COMPILER 1" >>confdefs.h
+
+  enable_as_accelerator=yes
+  case "${target}" in
+    *-intelmicemul-*)
+      # In this case we expect offload compiler to be built as native, so we
+      # need to rename the driver to avoid clashes with host's drivers.
+      program_transform_name="s&^&${target}-&" ;;
+  esac
+  
sedscript="s#${target_noncanonical}#${enable_as_accelerator_for}-accel-${target_noncanonical}#"
+  program_transform_name=`echo $program_transform_name | sed $sedscript`
+  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
+  fi
+
+else
+  enable_offload_targets=
+fi
+
+offload_targets=
+for tgt in `echo $enable_offload_targets | sed 's/,/ /g'`; do
+  tgt=`echo $tgt | sed 's/=.*//'`
+  if test x"$offload_targets" = x; then
+    offload_targets=$tgt
+  else
+    offload_targets="$offload_targets:$tgt"
+  fi
+done
+
+cat >>confdefs.h <<_ACEOF
+#define OFFLOAD_TARGETS "$offload_targets"
+_ACEOF
+
+if test x"$offload_targets" != x; then
+
+$as_echo "#define ENABLE_OFFLOADING 1" >>confdefs.h
+
+fi
+
 
 # Check whether --with-multilib-list was given.
 if test "${with_multilib_list+set}" = set; then :
@@ -18049,7 +18120,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18052 "configure"
+#line 18123 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -18155,7 +18226,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18158 "configure"
+#line 18229 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -27864,6 +27935,8 @@ fi
 
 
 
+
+
 # Echo link setup.
 if test x${build} = x${host} ; then
   if test x${host} = x${target} ; then
diff --git a/gcc/configure.ac b/gcc/configure.ac
index eb480de..b8eba3b 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -38,6 +38,10 @@ 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}
+accel_dir_suffix=
+
 # Determine the target- and build-specific subdirectories
 GCC_TOPLEV_SUBDIRS
 
@@ -883,6 +887,53 @@ AC_ARG_ENABLE(languages,
 esac],
 [enable_languages=c])
 
+AC_ARG_ENABLE(as-accelerator-for,
+[AS_HELP_STRING([--enable-as-accelerator-for=ARG],
+               [build as offload target compiler.
+               Specify offload host triple by ARG])],
+[
+  AC_DEFINE(ACCEL_COMPILER, 1,
+    [Define if this compiler should be built as the offload target compiler.])
+  enable_as_accelerator=yes
+  case "${target}" in
+    *-intelmicemul-*)
+      # In this case we expect offload compiler to be built as native, so we
+      # need to rename the driver to avoid clashes with host's drivers.
+      program_transform_name="s&^&${target}-&" ;;
+  esac
+  
sedscript="s#${target_noncanonical}#${enable_as_accelerator_for}-accel-${target_noncanonical}#"
+  program_transform_name=`echo $program_transform_name | sed $sedscript`
+  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 comma-separated LIST of
+               TARGET[=DIR]. Use optional path to find offload target compiler
+               during the build])],
+[
+  if test x"$enable_offload_targets" = x; then
+    AC_MSG_ERROR([no offload targets specified])
+  fi
+], [enable_offload_targets=])
+offload_targets=
+for tgt in `echo $enable_offload_targets | sed 's/,/ /g'`; do
+  tgt=`echo $tgt | sed 's/=.*//'`
+  if test x"$offload_targets" = x; then
+    offload_targets=$tgt
+  else
+    offload_targets="$offload_targets:$tgt"
+  fi
+done
+AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
+  [Define to hold the list of target names suitable for offloading.])
+if test x"$offload_targets" != x; then
+  AC_DEFINE(ENABLE_OFFLOADING, 1,
+    [Define this to enable support for offloading.])
+fi
+
 AC_ARG_WITH(multilib-list,
 [AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, SH and 
x86-64 only)])],
 :,
@@ -5488,6 +5539,8 @@ AC_SUBST(c_target_objs)
 AC_SUBST(cxx_target_objs)
 AC_SUBST(fortran_target_objs)
 AC_SUBST(target_cpu_default)
+AC_SUBST(real_target_noncanonical)
+AC_SUBST(accel_dir_suffix)
 
 AC_SUBST_FILE(language_hooks)
 
diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index 36f9583..d6fbdce 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -164,21 +164,23 @@ check_g++_parallelize = 10000
 # Install the driver program as $(target)-g++ and $(target)-c++, and
 # also as g++ and c++ if native.
 c++.install-common: installdirs
-       -rm -f $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext)
-       -$(INSTALL_PROGRAM) xg++$(exeext) 
$(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext)
-       -chmod a+x $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext)
-       -rm -f $(DESTDIR)$(bindir)/$(CXX_INSTALL_NAME)$(exeext)
-       -( cd $(DESTDIR)$(bindir) && \
-             $(LN) $(GXX_INSTALL_NAME)$(exeext) $(CXX_INSTALL_NAME)$(exeext) )
-       -if [ -f cc1plus$(exeext) ] ; then \
-         if [ ! -f g++-cross$(exeext) ] ; then \
-           rm -f $(DESTDIR)$(bindir)/$(GXX_TARGET_INSTALL_NAME)$(exeext); \
-           ( cd $(DESTDIR)$(bindir) && \
-             $(LN) $(GXX_INSTALL_NAME)$(exeext) 
$(GXX_TARGET_INSTALL_NAME)$(exeext) ); \
-           rm -f $(DESTDIR)$(bindir)/$(CXX_TARGET_INSTALL_NAME)$(exeext); \
-           ( cd $(DESTDIR)$(bindir) && \
-             $(LN) $(CXX_INSTALL_NAME)$(exeext) 
$(CXX_TARGET_INSTALL_NAME)$(exeext) ); \
-         fi ; \
+       -if test "$(enable_as_accelerator)" != "yes" ; then \
+         rm -f $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext); \
+         $(INSTALL_PROGRAM) xg++$(exeext) 
$(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext); \
+         chmod a+x $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext); \
+         rm -f $(DESTDIR)$(bindir)/$(CXX_INSTALL_NAME)$(exeext); \
+         ( cd $(DESTDIR)$(bindir) && \
+           $(LN) $(GXX_INSTALL_NAME)$(exeext) $(CXX_INSTALL_NAME)$(exeext) ); \
+         if [ -f cc1plus$(exeext) ] ; then \
+           if [ ! -f g++-cross$(exeext) ] ; then \
+             rm -f $(DESTDIR)$(bindir)/$(GXX_TARGET_INSTALL_NAME)$(exeext); \
+             ( cd $(DESTDIR)$(bindir) && \
+               $(LN) $(GXX_INSTALL_NAME)$(exeext) 
$(GXX_TARGET_INSTALL_NAME)$(exeext) ); \
+             rm -f $(DESTDIR)$(bindir)/$(CXX_TARGET_INSTALL_NAME)$(exeext); \
+             ( cd $(DESTDIR)$(bindir) && \
+               $(LN) $(CXX_INSTALL_NAME)$(exeext) 
$(CXX_TARGET_INSTALL_NAME)$(exeext) ); \
+           fi ; \
+         fi; \
        fi
 
 # We can't use links because not everyone supports them.  So just copy the
diff --git a/gcc/fortran/Make-lang.in b/gcc/fortran/Make-lang.in
index ca0a4e6..3621b4f 100644
--- a/gcc/fortran/Make-lang.in
+++ b/gcc/fortran/Make-lang.in
@@ -235,14 +235,16 @@ install-finclude-dir: installdirs
 # Install the driver program as $(target)-gfortran, and also as gfortran
 # if native.
 fortran.install-common: install-finclude-dir installdirs
-       -if [ -f f951$(exeext) ] ; then \
-         rm -f $(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext); \
-         $(INSTALL_PROGRAM) gfortran$(exeext) 
$(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext); \
-         chmod a+x $(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext); \
-         if [ ! -f gfortran-cross$(exeext) ] ; then \
-           rm -f $(DESTDIR)$(bindir)/$(GFORTRAN_TARGET_INSTALL_NAME)$(exeext); 
\
-           $(LN) $(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext) 
$(DESTDIR)$(bindir)/$(GFORTRAN_TARGET_INSTALL_NAME)$(exeext); \
-         fi ; \
+       -if test "$(enable_as_accelerator)" != "yes" ; then \
+         if [ -f f951$(exeext) ] ; then \
+           rm -f $(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext); \
+           $(INSTALL_PROGRAM) gfortran$(exeext) 
$(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext); \
+           chmod a+x $(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext); \
+           if [ ! -f gfortran-cross$(exeext) ] ; then \
+             rm -f 
$(DESTDIR)$(bindir)/$(GFORTRAN_TARGET_INSTALL_NAME)$(exeext); \
+             $(LN) $(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext) 
$(DESTDIR)$(bindir)/$(GFORTRAN_TARGET_INSTALL_NAME)$(exeext); \
+           fi ; \
+         fi; \
        fi
 
 fortran.install-plugin:
diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
index 0d2c0b4..be8300d 100644
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -184,7 +184,7 @@ STRIP = @STRIP@
 STRIP_FOR_TARGET = $(STRIP)
 
 # Directory in which the compiler finds libraries etc.
-libsubdir = $(libdir)/gcc/$(host_noncanonical)/$(version)
+libsubdir = $(libdir)/gcc/$(host_noncanonical)/$(version)@accel_dir_suffix@
 # Used to install the shared libgcc.
 slibdir = @slibdir@
 # Maybe used for DLLs on Windows targets.
@@ -990,6 +990,14 @@ crtendS$(objext): $(srcdir)/crtstuff.c
 crtbeginT$(objext): $(srcdir)/crtstuff.c
        $(crt_compile) $(CRTSTUFF_T_CFLAGS) -c $< -DCRT_BEGIN -DCRTSTUFFT_O
 
+# crtompbegin and crtompend contain symbols, that mark the begin and the end of
+# tables with addresses, required for OpenMP offloading.
+crtompbegin$(objext): $(srcdir)/ompstuff.c
+       $(crt_compile) $(CRTSTUFF_T_CFLAGS) -c $< -DCRT_BEGIN
+
+crtompend$(objext): $(srcdir)/ompstuff.c
+       $(crt_compile) $(CRTSTUFF_T_CFLAGS) -c $< -DCRT_END
+
 ifeq ($(enable_vtable_verify),yes)
 # These are used in vtable verification; see comments in source files for
 # more details.
diff --git a/libgcc/configure b/libgcc/configure
index 19c4ed6..f09c2a9 100644
--- a/libgcc/configure
+++ b/libgcc/configure
@@ -566,6 +566,7 @@ sfp_machine_header
 set_use_emutls
 set_have_cc_tls
 vis_hide
+accel_dir_suffix
 force_explicit_eh_registry
 fixed_point
 enable_decimal_float
@@ -666,6 +667,8 @@ enable_decimal_float
 with_system_libunwind
 enable_sjlj_exceptions
 enable_explicit_exception_frame_registration
+enable_as_accelerator_for
+enable_offload_targets
 enable_tls
 '
       ac_precious_vars='build_alias
@@ -1307,6 +1310,13 @@ Optional Features:
                           register exception tables explicitly at module
                           start, for use e.g. for compatibility with
                           installations without PT_GNU_EH_FRAME support
+  --enable-as-accelerator-for=ARG
+                          build as offload target compiler. Specify offload
+                          host triple by ARG
+  --enable-offload-targets=LIST
+                          enable offloading to devices from comma-separated
+                          LIST of TARGET[=DIR]. Use optional path to find
+                          offload target compiler during the build
   --enable-tls            Use thread-local storage [default=yes]
 
 Optional Packages:
@@ -4379,6 +4389,38 @@ esac
 # Collect host-machine-specific information.
 . ${srcdir}/config.host
 
+# Used for constructing correct paths for offload compilers.
+accel_dir_suffix=
+# Check whether --enable-as-accelerator-for was given.
+if test "${enable_as_accelerator_for+set}" = set; then :
+  enableval=$enable_as_accelerator_for;
+  accel_dir_suffix=/accel/${target_noncanonical}
+  case "${target_noncanonical}" in
+    *-intelmicemul-*)
+      # In this case we expect offload compiler to be built as native, so we
+      # need to change install directory for driver to be able to find libgcc.
+      host_noncanonical=${enable_as_accelerator_for} ;;
+  esac
+
+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
+  fi
+
+else
+  enable_offload_targets=
+fi
+
+if test x"$enable_offload_targets" != x; then
+  extra_parts="${extra_parts} crtompbegin.o crtompend.o"
+fi
+
 # Check if Solaris/x86 linker supports ZERO terminator unwind entries.
 # This is after config.host so we can augment tmake_file.
 # Link with -nostartfiles -nodefaultlibs since neither are present while
diff --git a/libgcc/configure.ac b/libgcc/configure.ac
index 72a21a9..6cce5d5 100644
--- a/libgcc/configure.ac
+++ b/libgcc/configure.ac
@@ -323,6 +323,37 @@ esac
 # Collect host-machine-specific information.
 . ${srcdir}/config.host
 
+# Used for constructing correct paths for offload compilers.
+accel_dir_suffix=
+AC_ARG_ENABLE(as-accelerator-for,
+[AS_HELP_STRING([--enable-as-accelerator-for=ARG],
+               [build as offload target compiler.
+               Specify offload host triple by ARG])],
+[
+  accel_dir_suffix=/accel/${target_noncanonical}
+  case "${target_noncanonical}" in
+    *-intelmicemul-*)
+      # In this case we expect offload compiler to be built as native, so we
+      # need to change install directory for driver to be able to find libgcc.
+      host_noncanonical=${enable_as_accelerator_for} ;;
+  esac
+])
+AC_SUBST(accel_dir_suffix)
+
+AC_ARG_ENABLE(offload-targets,
+[AS_HELP_STRING([--enable-offload-targets=LIST],
+               [enable offloading to devices from comma-separated LIST of
+               TARGET[=DIR]. Use optional path to find offload target compiler
+               during the build])],
+[
+  if test x"$enable_offload_targets" = x; then
+    AC_MSG_ERROR([no offload targets specified])
+  fi
+], [enable_offload_targets=])
+if test x"$enable_offload_targets" != x; then
+  extra_parts="${extra_parts} crtompbegin.o crtompend.o"
+fi
+
 # Check if Solaris/x86 linker supports ZERO terminator unwind entries.
 # This is after config.host so we can augment tmake_file.
 # Link with -nostartfiles -nodefaultlibs since neither are present while
diff --git a/libgcc/ompstuff.c b/libgcc/ompstuff.c
new file mode 100644
index 0000000..96bdf5f
--- /dev/null
+++ b/libgcc/ompstuff.c
@@ -0,0 +1,80 @@
+/* Specialized bits of code needed for the OpenMP offloading tables.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC 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.
+
+GCC 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/>.  */
+
+/* Target machine header files require this define. */
+#define IN_LIBGCC2
+
+/* FIXME: Including auto-host is incorrect, but until we have
+   identified the set of defines that need to go into auto-target.h,
+   this will have to do.  */
+#include "auto-host.h"
+#undef caddr_t
+#undef pid_t
+#undef rlim_t
+#undef ssize_t
+#undef vfork
+#include "tconfig.h"
+#include "tsystem.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "libgcc_tm.h"
+
+#define OFFLOAD_FUNC_TABLE_SECTION_NAME "__gnu_offload_funcs"
+#define OFFLOAD_VAR_TABLE_SECTION_NAME "__gnu_offload_vars"
+
+#ifdef CRT_BEGIN
+
+#if defined(HAVE_GAS_HIDDEN) && defined(ENABLE_OFFLOADING)
+void *_omp_func_table[0]
+  __attribute__ ((__used__, visibility ("hidden"),
+                 section (OFFLOAD_FUNC_TABLE_SECTION_NAME))) = { };
+void *_omp_var_table[0]
+  __attribute__ ((__used__, visibility ("hidden"),
+                 section (OFFLOAD_VAR_TABLE_SECTION_NAME))) = { };
+#endif
+
+#elif defined CRT_END
+
+#if defined(HAVE_GAS_HIDDEN) && defined(ENABLE_OFFLOADING)
+void *_omp_funcs_end[0]
+  __attribute__ ((__used__, visibility ("hidden"),
+                 section (OFFLOAD_FUNC_TABLE_SECTION_NAME))) = { };
+void *_omp_vars_end[0]
+  __attribute__ ((__used__, visibility ("hidden"),
+                 section (OFFLOAD_VAR_TABLE_SECTION_NAME))) = { };
+
+extern void *_omp_func_table[];
+extern void *_omp_var_table[];
+
+void *__OPENMP_TARGET__[]
+  __attribute__ ((__visibility__ ("hidden"))) =
+{
+  &_omp_func_table, &_omp_funcs_end,
+  &_omp_var_table, &_omp_vars_end
+};
+#endif
+
+#else /* ! CRT_BEGIN && ! CRT_END */
+#error "One of CRT_BEGIN or CRT_END must be defined."
+#endif
diff --git a/libgomp/config.h.in b/libgomp/config.h.in
index 14c7e2a..94a2b3b 100644
--- a/libgomp/config.h.in
+++ b/libgomp/config.h.in
@@ -30,6 +30,9 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Define to 1 if you have the `dl' library (-ldl). */
+#undef HAVE_LIBDL
+
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H
 
@@ -86,6 +89,9 @@
    */
 #undef LT_OBJDIR
 
+/* Define to hold the list of target names suitable for offloading. */
+#undef OFFLOAD_TARGETS
+
 /* Name of package */
 #undef PACKAGE
 
@@ -107,6 +113,9 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* Define if all infrastructure, needed for plugins, is supported. */
+#undef PLUGIN_SUPPORT
+
 /* The size of `char', as computed by sizeof. */
 #undef SIZEOF_CHAR
 
diff --git a/libgomp/configure b/libgomp/configure
index 766eb09..60d1492 100755
--- a/libgomp/configure
+++ b/libgomp/configure
@@ -770,6 +770,7 @@ enable_maintainer_mode
 enable_linux_futex
 enable_tls
 enable_symvers
+enable_offload_targets
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1421,6 +1422,10 @@ Optional Features:
   --enable-tls            Use thread-local storage [default=yes]
   --enable-symvers=STYLE  enables symbol versioning of the shared library
                           [default=yes]
+  --enable-offload-targets=LIST
+                          enable offloading to devices from comma-separated
+                          LIST of TARGET[=DIR]. Use optional path to find
+                          offload target compiler during the build
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -11094,7 +11099,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11097 "configure"
+#line 11102 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11200,7 +11205,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11203 "configure"
+#line 11208 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -15052,6 +15057,60 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 
+plugin_support=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5
+$as_echo_n "checking for dlsym in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlsym+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlsym ();
+int
+main ()
+{
+return dlsym ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlsym=yes
+else
+  ac_cv_lib_dl_dlsym=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlsym" >&5
+$as_echo "$ac_cv_lib_dl_dlsym" >&6; }
+if test "x$ac_cv_lib_dl_dlsym" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBDL 1
+_ACEOF
+
+  LIBS="-ldl $LIBS"
+
+else
+  plugin_support=no
+fi
+
+if test x"$plugin_support" = xyes; then
+
+$as_echo "#define PLUGIN_SUPPORT 1" >>confdefs.h
+
+fi
+
 # Check for functions needed.
 for ac_func in getloadavg clock_gettime strtoull
 do :
@@ -16153,6 +16212,37 @@ else
   multilib_arg=
 fi
 
+offload_targets=
+# 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
+    for tgt in `echo $enable_offload_targets | sed -e 's#,# #g'`; do
+      tgt=`echo $tgt | sed 's/=.*//'`
+      case $tgt in
+       *-intelmic-* | *-intelmicemul-*)
+         tgt_name="intelmic" ;;
+       *)
+         as_fn_error "unknown offload target specified" "$LINENO" 5 ;;
+      esac
+      if test x"$offload_targets" = x; then
+       offload_targets=$tgt_name
+      else
+       offload_targets=$offload_targets,$tgt_name
+      fi
+    done
+  fi
+
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define OFFLOAD_TARGETS "$offload_targets"
+_ACEOF
+
+
 # Set up the set of libraries that we need to link against for libgomp.
 # Note that the GOMP_SELF_SPEC in gcc.c may force -pthread,
 # which will force linkage against -lpthread (or equivalent for the system).
diff --git a/libgomp/configure.ac b/libgomp/configure.ac
index 84d250f..da2c040 100644
--- a/libgomp/configure.ac
+++ b/libgomp/configure.ac
@@ -193,6 +193,13 @@ AC_LINK_IFELSE(
    [],
    [AC_MSG_ERROR([Pthreads are required to build libgomp])])])
 
+plugin_support=yes
+AC_CHECK_LIB(dl, dlsym, , [plugin_support=no])
+if test x"$plugin_support" = xyes; then
+  AC_DEFINE(PLUGIN_SUPPORT, 1,
+    [Define if all infrastructure, needed for plugins, is supported.])
+fi
+
 # Check for functions needed.
 AC_CHECK_FUNCS(getloadavg clock_gettime strtoull)
 
@@ -273,6 +280,35 @@ else
   multilib_arg=
 fi
 
+offload_targets=
+AC_ARG_ENABLE(offload-targets,
+[AS_HELP_STRING([--enable-offload-targets=LIST],
+               [enable offloading to devices from comma-separated LIST of
+               TARGET[=DIR]. Use optional path to find offload target compiler
+               during the build])],
+[
+  if test x"$enable_offload_targets" = x; then
+    AC_MSG_ERROR([no offload targets specified])
+  else
+    for tgt in `echo $enable_offload_targets | sed -e 's#,# #g'`; do
+      tgt=`echo $tgt | sed 's/=.*//'`
+      case $tgt in
+       *-intelmic-* | *-intelmicemul-*)
+         tgt_name="intelmic" ;;
+       *)
+         AC_MSG_ERROR([unknown offload target specified]) ;;
+      esac
+      if test x"$offload_targets" = x; then
+       offload_targets=$tgt_name
+      else
+       offload_targets=$offload_targets,$tgt_name
+      fi
+    done
+  fi
+])
+AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
+  [Define to hold the list of target names suitable for offloading.])
+
 # Set up the set of libraries that we need to link against for libgomp.
 # Note that the GOMP_SELF_SPEC in gcc.c may force -pthread,
 # which will force linkage against -lpthread (or equivalent for the system).
diff --git a/lto-plugin/Makefile.am b/lto-plugin/Makefile.am
index 93ea649..c637ecb 100644
--- a/lto-plugin/Makefile.am
+++ b/lto-plugin/Makefile.am
@@ -5,7 +5,7 @@ AUTOMAKE_OPTIONS = no-dependencies
 
 gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
 target_noncanonical := @target_noncanonical@
-libexecsubdir := $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version)
+libexecsubdir := 
$(libexecdir)/gcc/$(real_target_noncanonical)/$(gcc_version)$(accel_dir_suffix)
 
 AM_CPPFLAGS = -I$(top_srcdir)/../include $(DEFS)
 AM_CFLAGS = @ac_lto_plugin_warn_cflags@
diff --git a/lto-plugin/Makefile.in b/lto-plugin/Makefile.in
index b15d901..4bd943b 100644
--- a/lto-plugin/Makefile.in
+++ b/lto-plugin/Makefile.in
@@ -167,6 +167,7 @@ ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 ac_lto_plugin_ldflags = @ac_lto_plugin_ldflags@
 ac_lto_plugin_warn_cflags = @ac_lto_plugin_warn_cflags@
+accel_dir_suffix = @accel_dir_suffix@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -209,6 +210,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+real_target_noncanonical = @real_target_noncanonical@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -227,7 +229,7 @@ with_libiberty = @with_libiberty@
 ACLOCAL_AMFLAGS = -I .. -I ../config
 AUTOMAKE_OPTIONS = no-dependencies
 gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
-libexecsubdir := $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version)
+libexecsubdir := 
$(libexecdir)/gcc/$(real_target_noncanonical)/$(gcc_version)$(accel_dir_suffix)
 AM_CPPFLAGS = -I$(top_srcdir)/../include $(DEFS)
 AM_CFLAGS = @ac_lto_plugin_warn_cflags@
 AM_LDFLAGS = @ac_lto_plugin_ldflags@
diff --git a/lto-plugin/configure b/lto-plugin/configure
index c34e653..0a81817 100755
--- a/lto-plugin/configure
+++ b/lto-plugin/configure
@@ -622,6 +622,8 @@ EGREP
 GREP
 SED
 LIBTOOL
+real_target_noncanonical
+accel_dir_suffix
 gcc_build_dir
 ac_lto_plugin_ldflags
 ac_lto_plugin_warn_cflags
@@ -730,6 +732,7 @@ enable_maintainer_mode
 with_libiberty
 enable_dependency_tracking
 enable_largefile
+enable_as_accelerator_for
 enable_shared
 enable_static
 with_pic
@@ -1371,6 +1374,9 @@ Optional Features:
   --disable-dependency-tracking  speeds up one-time build
   --enable-dependency-tracking   do not reject slow dependency extractors
   --disable-largefile     omit support for large files
+  --enable-as-accelerator-for=ARG
+                          build as offload target compiler. Specify offload
+                          host triple by ARG.
   --enable-shared[=PKGS]  build shared libraries [default=yes]
   --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
@@ -4135,6 +4141,20 @@ else
 fi
 
 
+# Used for constructing correct paths for offload compilers.
+accel_dir_suffix=
+real_target_noncanonical=${target_noncanonical}
+# Check whether --enable-as-accelerator-for was given.
+if test "${enable_as_accelerator_for+set}" = set; then :
+  enableval=$enable_as_accelerator_for;
+    accel_dir_suffix=/accel/${target_noncanonical}
+    real_target_noncanonical=${enable_as_accelerator_for}
+
+fi
+
+
+
+
 case `pwd` in
   *\ * | *\    *)
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope 
well with whitespace in \`pwd\`" >&5
@@ -10607,7 +10627,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10610 "configure"
+#line 10630 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10713,7 +10733,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10716 "configure"
+#line 10736 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
diff --git a/lto-plugin/configure.ac b/lto-plugin/configure.ac
index c3ae93e..807e941 100644
--- a/lto-plugin/configure.ac
+++ b/lto-plugin/configure.ac
@@ -34,6 +34,20 @@ else
 fi
 AC_SUBST(gcc_build_dir)
 
+# Used for constructing correct paths for offload compilers.
+accel_dir_suffix=
+real_target_noncanonical=${target_noncanonical}
+AC_ARG_ENABLE(as-accelerator-for,
+  [AS_HELP_STRING([--enable-as-accelerator-for=ARG],
+                 [build as offload target compiler.
+                 Specify offload host triple by ARG.])],
+  [
+    accel_dir_suffix=/accel/${target_noncanonical}
+    real_target_noncanonical=${enable_as_accelerator_for}
+  ])
+AC_SUBST(accel_dir_suffix)
+AC_SUBST(real_target_noncanonical)
+
 AM_PROG_LIBTOOL
 ACX_LT_HOST_FLAGS
 AC_SUBST(target_noncanonical)
-- 
1.7.1

Reply via email to