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.
This commit is contained in:
Tobias Burnus 2021-04-28 18:46:47 +02:00
parent 3da80ed7ef
commit fe5bfa6704
12 changed files with 100 additions and 6 deletions

14
configure vendored
View File

@ -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.

View File

@ -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.

View File

@ -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

10
gcc/configure vendored
View File

@ -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

View File

@ -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)])],
:,

View File

@ -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);

View File

@ -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);
}

View File

@ -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.
#

View File

@ -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

6
libgomp/configure vendored
View File

@ -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]];'.

View File

@ -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])

View File

@ -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,