This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 1/n] OpenMP 4.0 offloading infrastructure
- From: Ilya Verbin <iverbin at gmail dot com>
- To: Jakub Jelinek <jakub at redhat dot com>, Richard Biener <rguenther at suse dot de>, Richard Henderson <rth at redhat dot com>, gcc-patches at gcc dot gnu dot org
- Cc: Bernd Schmidt <bernds at codesourcery dot com>, Thomas Schwinge <thomas at codesourcery dot com>, Andrey Turetskiy <andrey dot turetskiy at gmail dot com>, Kirill Yukhin <kirill dot yukhin at gmail dot com>
- Date: Mon, 15 Sep 2014 20:52:27 +0400
- Subject: [PATCH 1/n] OpenMP 4.0 offloading infrastructure
- Authentication-results: sourceware.org; auth=none
Hello,
This patch contains necessary changes for the build system to support offloading.
It adds 2 new options for configure:
* --enable-as-accelerator-for=ARG is intended for the offload target compiler.
* --enable-offload-targets=LIST is intended for the offload host compiler.
Some more info: https://gcc.gnu.org/wiki/Offloading#Building_host_and_accel_compilers
Bootstrapped and regtested on i686-linux and x86_64-linux. Is it OK for trunk?
2014-09-15 Bernd Schmidt <bernds@codesourcery.com>
Thomas Schwinge <thomas@codesourcery.com>
Ilya Verbin <ilya.verbin@intel.com>
Andrey Turetskiy <andrey.turetskiy@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, install_driver): Tweak for the
possibility of being configured as an offload compiler.
(DRIVER_DEFINES): Pass new defines DEFAULT_REAL_TARGET_MACHINE and
ACCEL_DIR_SUFFIX.
* 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.
libgcc/
* Makefile.in (crtompbegin$(objext), crtompend$(objext)): New rule.
* configure: Regenerate.
* configure.ac (--enable-offload-targets): New configure option.
(extra_parts): Add crtompbegin.o and crtompend.o if
enable_offload_targets is not empty.
* ompstuff.c: New file.
libgomp/
* Makefile.in: Regenerate.
* config.h.in: Regenerate.
* configure: Regenerate.
* configure.ac: Check for libdl, required for plugin support.
(PLUGIN_SUPPORT): Define if plugins are supported.
(--enable-as-accelerator-for, --enable-offload-targets): New options.
(OFFLOAD_LIBRARY): Define if libgomp is built as offload target library.
(enable_offload_targets): Support Intel MIC targets.
(OFFLOAD_TARGETS): List of target names suitable for offloading.
* testsuite/Makefile.in: Regenerate.
Thanks,
-- Ilya
---
diff --git a/configure b/configure
index 55fca62..fb40a2f 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,11 @@ 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 LIST
--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 +2900,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..69e2d14 100644
--- a/configure.ac
+++ b/configure.ac
@@ -286,6 +286,22 @@ 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 LIST])],
+[
+ 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 e86382f..65c29b2 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
@@ -591,9 +598,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
@@ -601,7 +608,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:
@@ -1953,9 +1964,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)) \
@@ -3258,17 +3271,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.
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 fc78f42..50426d6 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,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-as-accelerator-for=ARG
+ build as offload target compiler. Specify offload
+ host triple by ARG.
+ --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
@@ -3194,6 +3204,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 +7405,47 @@ 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
+ 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
+
+enable_offload_targets=`echo "$enable_offload_targets" | sed -e 's#,#:#g'`
+
+cat >>confdefs.h <<_ACEOF
+#define OFFLOAD_TARGETS "$enable_offload_targets"
+_ACEOF
+
+if test x"$enable_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 :
@@ -18033,7 +18088,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 18036 "configure"
+#line 18091 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -18139,7 +18194,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 18142 "configure"
+#line 18197 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -27864,6 +27919,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 c7f0e6a..028b00e 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,37 @@ 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
+ 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 LIST])],
+[
+ if test x"$enable_offload_targets" = x; then
+ AC_MSG_ERROR([no offload targets specified])
+ fi
+], [enable_offload_targets=])
+enable_offload_targets=`echo "$enable_offload_targets" | sed -e 's#,#:#g'`
+AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$enable_offload_targets",
+ [Define to hold the list of target names suitable for offloading.])
+if test x"$enable_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 +5523,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/libgcc/Makefile.in b/libgcc/Makefile.in
index 6a6cf66..48f9173 100644
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -987,6 +987,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 35896de..832f82c 100644
--- a/libgcc/configure
+++ b/libgcc/configure
@@ -664,6 +664,7 @@ with_build_libsubdir
enable_decimal_float
with_system_libunwind
enable_sjlj_exceptions
+enable_offload_targets
enable_tls
'
ac_precious_vars='build_alias
@@ -1301,6 +1302,8 @@ Optional Features:
to use
--enable-sjlj-exceptions
force use of builtin_setjmp for exceptions
+ --enable-offload-targets=LIST
+ enable offloading to devices from LIST
--enable-tls Use thread-local storage [default=yes]
Optional Packages:
@@ -4357,6 +4360,21 @@ esac
# Collect host-machine-specific information.
. ${srcdir}/config.host
+# 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 d877d21..3abba2d 100644
--- a/libgcc/configure.ac
+++ b/libgcc/configure.ac
@@ -307,6 +307,18 @@ esac
# Collect host-machine-specific information.
. ${srcdir}/config.host
+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])
+ 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..7625e7c
--- /dev/null
+++ b/libgcc/ompstuff.c
@@ -0,0 +1,79 @@
+/* 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 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/Makefile.in b/libgomp/Makefile.in
index 5cd666f..d2e1ffc 100644
--- a/libgomp/Makefile.in
+++ b/libgomp/Makefile.in
@@ -246,6 +246,7 @@ datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
+enable_as_accelerator = @enable_as_accelerator@
enable_shared = @enable_shared@
enable_static = @enable_static@
exec_prefix = @exec_prefix@
diff --git a/libgomp/config.h.in b/libgomp/config.h.in
index 14c7e2a..e8466bf 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,12 @@
*/
#undef LT_OBJDIR
+/* Define if this library should be used on target device. */
+#undef OFFLOAD_LIBRARY
+
+/* Define to hold the list of target names suitable for offloading. */
+#undef OFFLOAD_TARGETS
+
/* Name of package */
#undef PACKAGE
@@ -107,6 +116,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..adb843d 100755
--- a/libgomp/configure
+++ b/libgomp/configure
@@ -616,6 +616,7 @@ OMP_LOCK_SIZE
USE_FORTRAN_FALSE
USE_FORTRAN_TRUE
link_gomp
+enable_as_accelerator
XLDFLAGS
XCFLAGS
config_path
@@ -770,6 +771,8 @@ enable_maintainer_mode
enable_linux_futex
enable_tls
enable_symvers
+enable_as_accelerator_for
+enable_offload_targets
'
ac_precious_vars='build_alias
host_alias
@@ -1421,6 +1424,10 @@ Optional Features:
--enable-tls Use thread-local storage [default=yes]
--enable-symvers=STYLE enables symbol versioning of the shared library
[default=yes]
+ --enable-as-accelerator-for=ARG
+ enable target implementation of libgomp routines
+ --enable-offload-targets=LIST
+ enable offloading to devices from LIST
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -11094,7 +11101,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 11104 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11200,7 +11207,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 11210 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -15052,6 +15059,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 +16214,52 @@ else
multilib_arg=
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 OFFLOAD_LIBRARY 1" >>confdefs.h
+
+ enable_as_accelerator=yes
+
+else
+ enable_as_accelerator=no
+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 $enable_offload_targets; do
+ case $tgt in
+ *-intelmic-*)
+ offload_target_name="mic"
+ ;;
+ *)
+ as_fn_error "unknown offload target specified" "$LINENO" 5
+ ;;
+ esac
+ if test x"$offload_targets" = x; then
+ offload_targets=$offload_target_name
+ else
+ offload_targets=$offload_targets,$offload_target_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..9367b91 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,44 @@ else
multilib_arg=
fi
+AC_ARG_ENABLE(as-accelerator-for,
+[AS_HELP_STRING([--enable-as-accelerator-for=ARG],
+ [enable target implementation of libgomp routines])],
+[
+ AC_DEFINE(OFFLOAD_LIBRARY, 1,
+ [Define if this library should be used on target device.])
+ enable_as_accelerator=yes
+], [enable_as_accelerator=no])
+AC_SUBST(enable_as_accelerator)
+
+offload_targets=
+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
+ for tgt in $enable_offload_targets; do
+ case $tgt in
+ *-intelmic-*)
+ offload_target_name="mic"
+ ;;
+ *)
+ AC_MSG_ERROR([unknown offload target specified])
+ ;;
+ esac
+ if test x"$offload_targets" = x; then
+ offload_targets=$offload_target_name
+ else
+ offload_targets=$offload_targets,$offload_target_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/libgomp/testsuite/Makefile.in b/libgomp/testsuite/Makefile.in
index 5273eaa..efb64f3 100644
--- a/libgomp/testsuite/Makefile.in
+++ b/libgomp/testsuite/Makefile.in
@@ -162,6 +162,7 @@ datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
+enable_as_accelerator = @enable_as_accelerator@
enable_shared = @enable_shared@
enable_static = @enable_static@
exec_prefix = @exec_prefix@
--
1.7.1