public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch] offload-defaulted: Config option to silently ignore uninstalled offload compilers
@ 2021-04-27 10:22 Tobias Burnus
  2021-04-28 14:05 ` Jakub Jelinek
  2021-04-28 14:13 ` Matthias Klose
  0 siblings, 2 replies; 6+ messages in thread
From: Tobias Burnus @ 2021-04-27 10:22 UTC (permalink / raw)
  To: gcc-patches, Jakub Jelinek, Richard Biener; +Cc: Matthias Klose

[-- Attachment #1: Type: text/plain, Size: 1685 bytes --]

This is based on Jakub's patch* which is used with many distributions – and is has
to be maintained by all of them; otherwise issues like lp #1878760 might creep in,
as discussed in #gcc yesterday. - As I am a huge fan of reducing code duplication
and local patches, I propose to add it to GCC proper behind a configure flag.

The patch idea is: offloading support is configured for one or multiple offload devices
but compilation silently ignores a target if its offload compiler is not found at
compile time and also dlopen errors of the associated libgomp plugin is also
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 – as it permits 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, optional packages.

(When -foffload=$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 – thus, compilation or run-time issues 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-default.patch

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf

[-- Attachment #2: offload-defaulted.diff --]
[-- Type: text/x-patch, Size: 7237 bytes --]

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  <jakub@redhat.com>
	    Tobias Burnus  <tobias@codesourcery.com>

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,

[-- Attachment #3: offload-defaulted-gen.diff --]
[-- Type: text/x-patch, Size: 8409 bytes --]

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-04-28 17:02 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-27 10:22 [Patch] offload-defaulted: Config option to silently ignore uninstalled offload compilers Tobias Burnus
2021-04-28 14:05 ` Jakub Jelinek
2021-04-28 14:13 ` Matthias Klose
2021-04-28 16:56   ` Tobias Burnus
2021-04-28 16:59     ` Matthias Klose
2021-04-28 17:02     ` Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).