From patchwork Mon Sep 15 16:52:27 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Verbin X-Patchwork-Id: 389434 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 23FE3140086 for ; Tue, 16 Sep 2014 02:53:01 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:mime-version:content-type; q=dns; s=default; b=IMfbXuljgYFvwuhG2zgdcKPZcbJrkeXBrJit1gXl1LWQHhZeao ZbNLoS7olEeFhI4PcaBJWd0Z/OSzdcPJP5k9OZiHaQiXRYeuPaxadS26MMwhvE5c 3qzFru9VH1ftN5PvYwVcb4CAfsswGD5ajt3t7XHCsTqA3eTtKSapkVqaE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:mime-version:content-type; s= default; bh=bI5M/B7zGvvFKE1LkDArxtBUx9Q=; b=nSjDVzc5NjN1hHmGrXwe q5x0KOxE7mTdVsDetjbzAv33zMnSkpN/p+G1+TucmAqu4O1EUG1YCK02eQ7s2mq+ Z07xU9C7YqQFpeT2DYVfg0cnUGSZQzQM8UlfIPMz9loV5P1DUzxUC3zduy7n82/0 jH62yf/nPhajHVhazlBGP9U= Received: (qmail 31443 invoked by alias); 15 Sep 2014 16:52:53 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 31426 invoked by uid 89); 15 Sep 2014 16:52:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=AWL, BAYES_50, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qg0-f54.google.com Received: from mail-qg0-f54.google.com (HELO mail-qg0-f54.google.com) (209.85.192.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 15 Sep 2014 16:52:41 +0000 Received: by mail-qg0-f54.google.com with SMTP id z60so4290372qgd.27 for ; Mon, 15 Sep 2014 09:52:36 -0700 (PDT) X-Received: by 10.224.47.6 with SMTP id l6mr38388291qaf.32.1410799956066; Mon, 15 Sep 2014 09:52:36 -0700 (PDT) Received: from msticlxl57.ims.intel.com ([192.55.54.42]) by mx.google.com with ESMTPSA id g80sm5966196qge.5.2014.09.15.09.52.31 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 Sep 2014 09:52:35 -0700 (PDT) Date: Mon, 15 Sep 2014 20:52:27 +0400 From: Ilya Verbin To: Jakub Jelinek , Richard Biener , Richard Henderson , gcc-patches@gcc.gnu.org Cc: Bernd Schmidt , Thomas Schwinge , Andrey Turetskiy , Kirill Yukhin Subject: [PATCH 1/n] OpenMP 4.0 offloading infrastructure Message-ID: <20140915165227.GB48540@msticlxl57.ims.intel.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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 Thomas Schwinge Ilya Verbin Andrey Turetskiy * 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 +. */ + +/* 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 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 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@