aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2021-04-28 18:46:47 +0200
committerTobias Burnus <tobias@codesourcery.com>2021-04-28 18:46:47 +0200
commitfe5bfa6704179f8db7d1ae0b485439e9896df8eb (patch)
tree7687db287a1ef04b1399cf8db2a06eb9398cc995
parent3da80ed7efd582575e7850a403ce693ec882d087 (diff)
downloadgcc-fe5bfa6704179f8db7d1ae0b485439e9896df8eb.zip
gcc-fe5bfa6704179f8db7d1ae0b485439e9896df8eb.tar.gz
gcc-fe5bfa6704179f8db7d1ae0b485439e9896df8eb.tar.bz2
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-28 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.
-rwxr-xr-xconfigure14
-rw-r--r--configure.ac8
-rw-r--r--gcc/config.in6
-rwxr-xr-xgcc/configure10
-rw-r--r--gcc/configure.ac5
-rw-r--r--gcc/gcc.c17
-rw-r--r--gcc/lto-wrapper.c26
-rw-r--r--libgomp/Makefile.in2
-rw-r--r--libgomp/config.h.in3
-rwxr-xr-xlibgomp/configure6
-rw-r--r--libgomp/configure.ac5
-rw-r--r--libgomp/target.c4
12 files changed, 100 insertions, 6 deletions
diff --git a/configure b/configure
index 504f641..7dd1fd5 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/configure.ac b/configure.ac
index 088e735..b923b0b 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/config.in b/gcc/config.in
index 313c13c..fb88acb 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 33eae54..f5bef76 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/gcc/configure.ac b/gcc/configure.ac
index 96a6f62..22305e3 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 7837553..bd561ac 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 49894e4..e95b0d8 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/Makefile.in b/libgomp/Makefile.in
index eb868b3..9685704 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 03123dc..e702625 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 1917d7e..6161da5 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 c23fe00..7df80a3 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/libgomp/target.c b/libgomp/target.c
index 4a4e1f8..2150e5d 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,