From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa3.mentor.iphmx.com (esa3.mentor.iphmx.com [68.232.137.180]) by sourceware.org (Postfix) with ESMTPS id 36D273989CAA for ; Tue, 27 Apr 2021 10:22:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 36D273989CAA Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Tobias_Burnus@mentor.com IronPort-SDR: lWDK89QdduIznppQvx9C3d0C8ZoSSd4uOmn1XYWpSF+e7wZJaDhTbSpXr1UWQ3GE+WiprCrwrD UHKzQRzWQWZlO+jiO+jzSR1G/ahQvr/mPTYgWuKkSeKmTVKXSdvFKFaGQ5z0RV3JItTihWYjwC lcjcLxdgb++uDPgBnzs+JqFQwXWh34Td0TqOIgTP7hP+F985HeXG1Zv16Z6tcIU9OZv04MeH9m 3QeoNoKOwexSkaHNmb1fGlLUH08+2z8cZgtNPe+R14kjS3VvmmJptnZyRyQ+mRTkCgWGTQ0Mup uP4= X-IronPort-AV: E=Sophos;i="5.82,254,1613462400"; d="diff'?scan'208";a="60559562" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 27 Apr 2021 02:22:51 -0800 IronPort-SDR: R+aEKx1Il4GhMjk4L6ECz8GlaLZldu/NcIDn7qD8cHZSjbWgtz4EEotTZM7x4U5fnAlfiII07D 5ISmApx3AIk9aEVCHSyW+a5UQPmcdVdGKjdiVGDrJ55oQzWn4xyh89M2+QIUFh13qgWdlk1oS7 nzFSPvQKW6XT0leXA6bfm1jYj87fPw2pLZUpdF2cTrSB766MFuiC9Edw4Go9auJ7pvJC8BuZRe PJqZN2PEs58VcgJfRGa8nm3W43gIDVzgUa9P6DTv2SQHO5OSLpZBHoOAHtNSlqdnfL2jvXdRBG 0jk= To: gcc-patches , Jakub Jelinek , Richard Biener CC: Matthias Klose From: Tobias Burnus Subject: [Patch] offload-defaulted: Config option to silently ignore uninstalled offload compilers Message-ID: <15f34348-0053-2f31-0603-fd0eefa33897@codesourcery.com> Date: Tue, 27 Apr 2021 12:22:44 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------C8086FB8E4C161FE94CB9F01" Content-Language: en-US X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-09.mgc.mentorg.com (139.181.222.9) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Apr 2021 10:22:57 -0000 --------------C8086FB8E4C161FE94CB9F01 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable This is based on Jakub's patch* which is used with many distributions =E2= =80=93 and is has to be maintained by all of them; otherwise issues like lp #1878760 might cr= eep in, as discussed in #gcc yesterday. - As I am a huge fan of reducing code dupli= cation and local patches, I propose to add it to GCC proper behind a configure fla= g. The patch idea is: offloading support is configured for one or multiple off= load devices but compilation silently ignores a target if its offload compiler is not fo= und at compile time and also dlopen errors of the associated libgomp plugin is als= o silently ignored such that also the system where the program is run do not = show a run-time error. This makes a lot of sense for distribution compilers =E2=80=93 as it permit= s to configure GCC to support offloading to one/multiple offload targets, but the actual offload compiler and the run-time support can be put into separate, optiona= l packages. (When -foffload=3D$TARGET is specified explicitly, it still gives an error if the offload compiler is not installed; this does not not affect= the libgomp/run-time side.) However, for nondistro builds, compilers are usually installed "as is" and = not split into different packages =E2=80=93 thus, compilation or run-time issue= s should give an error. Hence, the distro behaviour is only active when configured with --enable-offload-defaulted. Comments? OK for mainline? Tobias * https://src.fedoraproject.org/rpms/gcc/blob/rawhide/f/gcc11-foffload-defa= ult.patch ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 M=C3=BCnchen R= egistergericht M=C3=BCnchen HRB 106955, Gesch=C3=A4ftsf=C3=BChrer: Thomas H= eurung, Frank Th=C3=BCrauf --------------C8086FB8E4C161FE94CB9F01 Content-Type: text/x-patch; charset="UTF-8"; name="offload-defaulted.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="offload-defaulted.diff" offload-defaulted: Config option to silently ignore uninstalled offload compilers If configured with --enable-offload-defaulted, configured but not installed offload compilers and libgomp plugins are silently ignored. Useful for distribution compilers where those are in separate optional packages. 2021-04-27 Jakub Jelinek Tobias Burnus ChangeLog: * configure.ac (--enable-offload-defaulted): New. * configure: Regenerate. gcc/ChangeLog: * configure.ac (OFFLOAD_DEFAULTED): AC_DEFINE if offload-defaulted. * gcc.c (process_command): New variable. (driver::maybe_putenv_OFFLOAD_TARGETS): If OFFLOAD_DEFAULTED, set it if -foffload is defaulted. * lto-wrapper.c (OFFLOAD_TARGET_DEFAULT_ENV): Define. (compile_offload_image): If OFFLOAD_DEFAULTED and OFFLOAD_TARGET_DEFAULT is in the environment, don't fail if corresponding mkoffload can't be found. (compile_images_for_offload_targets): Likewise. Free and clear offload_names if no valid offload is found. * config.in: Regenerate. * configure: Regenerate. libgomp/ChangeLog: * configure.ac (OFFLOAD_DEFAULTED): AC_DEFINE if offload-defaulted. * target.c (gomp_load_plugin_for_device): If set and if a plugin can't be dlopened, silently assume it has no devices. * Makefile.in: Regenerate. * config.h.in: Regenerate. * configure: Regenerate. lto-plugin/ChangeLog: * Makefile.in: Regenerate. * configure: Regenerate. zlib/ChangeLog: * configure: Regenerate. configure | 14 ++++++++++++++ configure.ac | 8 ++++++++ gcc/config.in | 6 ++++++ gcc/configure | 10 ++++++++-- gcc/configure.ac | 5 +++++ gcc/gcc.c | 17 ++++++++++++++++- gcc/lto-wrapper.c | 26 ++++++++++++++++++++++++-- libgomp/Makefile.in | 2 +- libgomp/config.h.in | 3 +++ libgomp/configure | 6 ++++++ libgomp/configure.ac | 5 +++++ libgomp/target.c | 4 ++++ lto-plugin/Makefile.in | 4 ++-- lto-plugin/configure | 34 ++++++++++++++++++---------------- zlib/configure | 6 +++--- 15 files changed, 123 insertions(+), 27 deletions(-) diff --git a/configure.ac b/configure.ac index 088e735c5db..b923b0bb9cc 100644 --- a/configure.ac +++ b/configure.ac @@ -300,6 +300,14 @@ AC_ARG_ENABLE(offload-targets, fi ], [enable_offload_targets=]) +AC_ARG_ENABLE(offload-defaulted, +[AS_HELP_STRING([--enable-offload-defaulted] + [If enabled, configured but not installed offload compilers and + libgomp plugins are silently ignored. Useful for distribution + compilers where those are in separate optional packages.])], +[enable_offload_defaulted=$enableval], +[enable_offload_defaulted=]) + # Handle --enable-gold, --enable-ld. # --disable-gold [--enable-ld] # Build only ld. Default option. diff --git a/gcc/configure.ac b/gcc/configure.ac index 96a6f62b0d3..22305e37071 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -1139,6 +1139,11 @@ else [Define this to enable support for offloading.]) fi +if test "x$enable_offload_defaulted" = xyes; then + AC_DEFINE(OFFLOAD_DEFAULTED, 1, + [Define to 1 to if -foffload is defaulted]) +fi + AC_ARG_WITH(multilib-list, [AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, SH and x86-64 only)])], :, diff --git a/gcc/gcc.c b/gcc/gcc.c index 7837553958b..bd561ac570f 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -319,6 +319,12 @@ static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE; static char *offload_targets = NULL; +#if OFFLOAD_DEFAULTED +/* Set to true if -foffload has not been used and offload_targets + is set to the configured in default. */ +static bool offload_targets_default; +#endif + /* Nonzero if cross-compiling. When -b is used, the value comes from the `specs' file. */ @@ -4828,7 +4834,12 @@ process_command (unsigned int decoded_options_count, /* If the user didn't specify any, default to all configured offload targets. */ if (ENABLE_OFFLOADING && offload_targets == NULL) - handle_foffload_option (OFFLOAD_TARGETS); + { + handle_foffload_option (OFFLOAD_TARGETS); +#if OFFLOAD_DEFAULTED + offload_targets_default = true; +#endif + } if (output_file && strcmp (output_file, "-") != 0 @@ -8484,6 +8495,10 @@ driver::maybe_putenv_OFFLOAD_TARGETS () const obstack_grow (&collect_obstack, offload_targets, strlen (offload_targets) + 1); xputenv (XOBFINISH (&collect_obstack, char *)); +#if OFFLOAD_DEFAULTED + if (offload_targets_default) + xputenv ("OFFLOAD_TARGET_DEFAULT=1"); +#endif } free (offload_targets); diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index 49894e4fc61..e95b0d849ba 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see /* Environment variable, used for passing the names of offload targets from GCC driver to lto-wrapper. */ #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES" +#define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT" /* By default there is no special suffix for target executables. */ #ifdef TARGET_EXECUTABLE_SUFFIX @@ -906,6 +907,13 @@ compile_offload_image (const char *target, const char *compiler_path, compiler = paths[i]; break; } +#if OFFLOAD_DEFAULTED + if (!compiler && getenv (OFFLOAD_TARGET_DEFAULT_ENV)) + { + free_array_of_ptrs ((void **) paths, n_paths); + return NULL; + } +#endif if (!compiler) fatal_error (input_location, @@ -976,6 +984,7 @@ compile_images_for_offload_targets (unsigned in_argc, char *in_argv[], if (!target_names) return; unsigned num_targets = parse_env_var (target_names, &names, NULL); + int next_name_entry = 0; const char *compiler_path = getenv ("COMPILER_PATH"); if (!compiler_path) @@ -986,15 +995,28 @@ compile_images_for_offload_targets (unsigned in_argc, char *in_argv[], offload_names = XCNEWVEC (char *, num_targets + 1); for (unsigned i = 0; i < num_targets; i++) { - offload_names[i] + offload_names[next_name_entry] = compile_offload_image (names[i], compiler_path, in_argc, in_argv, compiler_opts, compiler_opt_count, linker_opts, linker_opt_count); - if (!offload_names[i]) + if (!offload_names[next_name_entry]) +#if OFFLOAD_DEFAULTED + continue; +#else fatal_error (input_location, "problem with building target image for %s", names[i]); +#endif + next_name_entry++; } +#if OFFLOAD_DEFAULTED + if (next_name_entry == 0) + { + free (offload_names); + offload_names = NULL; + } +#endif + out: free_array_of_ptrs ((void **) names, num_targets); } diff --git a/libgomp/target.c b/libgomp/target.c index 4a4e1f80745..2150e5d79b2 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -3173,7 +3173,11 @@ gomp_load_plugin_for_device (struct gomp_device_descr *device, void *plugin_handle = dlopen (plugin_name, RTLD_LAZY); if (!plugin_handle) +#if OFFLOAD_DEFAULTED + return 0; +#else goto dl_fail; +#endif /* Check if all required functions are available in the plugin and store their handlers. None of the symbols can legitimately be NULL, --------------C8086FB8E4C161FE94CB9F01 Content-Type: text/x-patch; charset="UTF-8"; name="offload-defaulted-gen.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="offload-defaulted-gen.diff" diff --git a/configure b/configure index 504f6410274..7dd1fd5bb69 100755 --- a/configure +++ b/configure @@ -786,6 +786,7 @@ with_build_libsubdir with_system_zlib enable_as_accelerator_for enable_offload_targets +enable_offload_defaulted enable_gold enable_ld enable_compressed_debug_sections @@ -1515,6 +1516,11 @@ Optional Features: enable offloading to devices from comma-separated LIST of TARGET[=DIR]. Use optional path to find offload target compiler during the build + --enable-offload-defaulted + If enabled, configured but not installed offload compilers and + libgomp plugins are silently ignored. Useful for distribution + compilers where those are in separate optional packages. + --enable-gold[=ARG] build gold [ARG={default,yes,no}] --enable-ld[=ARG] build ld [ARG={default,yes,no}] --enable-compressed-debug-sections={all,gas,gold,ld,none} @@ -2981,6 +2987,14 @@ else fi +# Check whether --enable-offload-defaulted was given. +if test "${enable_offload_defaulted+set}" = set; then : + enableval=$enable_offload_defaulted; enable_offload_defaulted=$enableval +else + enable_offload_defaulted= +fi + + # Handle --enable-gold, --enable-ld. # --disable-gold [--enable-ld] # Build only ld. Default option. diff --git a/gcc/config.in b/gcc/config.in index 313c13c8e49..fb88acb3c34 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -2190,6 +2190,12 @@ #endif +/* Define to 1 to if -foffload is defaulted */ +#ifndef USED_FOR_TARGET +#undef OFFLOAD_DEFAULTED +#endif + + /* Define to offload targets, separated by commas. */ #ifndef USED_FOR_TARGET #undef OFFLOAD_TARGETS diff --git a/gcc/configure b/gcc/configure index 33eae5451ad..f5bef76ef77 100755 --- a/gcc/configure +++ b/gcc/configure @@ -8058,6 +8058,12 @@ $as_echo "#define ENABLE_OFFLOADING 0" >>confdefs.h fi +if test "x$enable_offload_defaulted" = xyes; then + +$as_echo "#define OFFLOAD_DEFAULTED 1" >>confdefs.h + +fi + # Check whether --with-multilib-list was given. if test "${with_multilib_list+set}" = set; then : @@ -19392,7 +19398,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 19395 "configure" +#line 19401 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -19498,7 +19504,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 19501 "configure" +#line 19507 "configure" #include "confdefs.h" #if HAVE_DLFCN_H diff --git a/libgomp/Makefile.in b/libgomp/Makefile.in index eb868b36704..9685704c355 100644 --- a/libgomp/Makefile.in +++ b/libgomp/Makefile.in @@ -16,7 +16,7 @@ # Plugins for offload execution, Makefile.am fragment. # -# Copyright (C) 2014-2020 Free Software Foundation, Inc. +# Copyright (C) 2014-2021 Free Software Foundation, Inc. # # Contributed by Mentor Embedded. # diff --git a/libgomp/config.h.in b/libgomp/config.h.in index 03123dc1e60..e702625ab6e 100644 --- a/libgomp/config.h.in +++ b/libgomp/config.h.in @@ -143,6 +143,9 @@ */ #undef LT_OBJDIR +/* Define to 1 to if -foffload is defaulted */ +#undef OFFLOAD_DEFAULTED + /* Define to offload plugins, separated by commas. */ #undef OFFLOAD_PLUGINS diff --git a/libgomp/configure b/libgomp/configure index 1917d7e273b..6161da579c0 100755 --- a/libgomp/configure +++ b/libgomp/configure @@ -14995,6 +14995,12 @@ $as_echo "#define LIBGOMP_OFFLOADED_ONLY 1" >>confdefs.h fi +if test "x$enable_offload_defaulted" = xyes; then + +$as_echo "#define OFFLOAD_DEFAULTED 1" >>confdefs.h + +fi + # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. diff --git a/libgomp/configure.ac b/libgomp/configure.ac index c23fe004f1d..7df80a32765 100644 --- a/libgomp/configure.ac +++ b/libgomp/configure.ac @@ -221,6 +221,11 @@ if test x$libgomp_offloaded_only = xyes; then [Define to 1 if building libgomp for an accelerator-only target.]) fi +if test "x$enable_offload_defaulted" = xyes; then + AC_DEFINE(OFFLOAD_DEFAULTED, 1, + [Define to 1 to if -foffload is defaulted]) +fi + AC_CHECK_SIZEOF([void *]) m4_include([plugin/configfrag.ac]) diff --git a/lto-plugin/Makefile.in b/lto-plugin/Makefile.in index 20611c6b1e6..b33ffed6e48 100644 --- a/lto-plugin/Makefile.in +++ b/lto-plugin/Makefile.in @@ -350,8 +350,8 @@ libexecsub_LTLIBRARIES = liblto_plugin.la in_gcc_libs = $(foreach lib, $(libexecsub_LTLIBRARIES), $(gcc_build_dir)/$(lib)) liblto_plugin_la_SOURCES = lto-plugin.c # Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS. -liblto_plugin_la_LDFLAGS = $(AM_LDFLAGS) $(lt_host_flags) -module -avoid-version \ - -bindir $(libexecsubdir) $(if $(wildcard \ +liblto_plugin_la_LDFLAGS = $(AM_LDFLAGS) $(lt_host_flags) -module \ + -avoid-version -bindir $(libexecsubdir) $(if $(wildcard \ $(libiberty_noasan)),, $(if $(wildcard \ $(libiberty_pic)),,-Wc,$(libiberty))) # Can be simplified when libiberty becomes a normal convenience library. diff --git a/lto-plugin/configure b/lto-plugin/configure index baa84adbb6c..22a4357a58e 100755 --- a/lto-plugin/configure +++ b/lto-plugin/configure @@ -8429,23 +8429,25 @@ _LT_EOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) + # Allow for Darwin 4-7 (macOS 10.0-10.3) although these are not expect to + # build without first building modern cctools / linker. + case $host_cpu-$host_os in + *-rhapsody* | *-darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) + *-darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + *-darwin*) + # darwin 5.x (macOS 10.1) onwards we only need to adjust when the + # deployment target is forced to an earlier version. + case ${MACOSX_DEPLOYMENT_TARGET-UNSET},$host in + UNSET,*-darwin[89]*|UNSET,*-darwin[12][0123456789]*) + ;; 10.[012][,.]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + *) + ;; + esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then @@ -11950,7 +11952,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11963 "configure" +#line 11955 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12056,7 +12058,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12069 "configure" +#line 12061 "configure" #include "confdefs.h" #if HAVE_DLFCN_H diff --git a/zlib/configure b/zlib/configure index f489f31bc70..05c41b7e12d 100755 --- a/zlib/configure +++ b/zlib/configure @@ -4169,7 +4169,7 @@ case "$host" in case "$enable_cet" in auto) # Check if target supports multi-byte NOPs - # and if assembler supports CET insn. + # and if compiler and assembler support CET insn. cet_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fcf-protection" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -10735,7 +10735,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10748 "configure" +#line 10738 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10841,7 +10841,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10854 "configure" +#line 10844 "configure" #include "confdefs.h" #if HAVE_DLFCN_H --------------C8086FB8E4C161FE94CB9F01--