Hi,
the link phase is always partial (-r) for VxWorks in kernel mode, which means
that it uses incremental LTO linking by default (-flinker-output=rel). But in
this mode the LTO plugin outputs a warning if one of the object files involved
in the link does not contain LTO bytecode, before switching to nolto-rel mode.
We do not do repeated incremental linking for VxWorks so silence the warning.
Tested on PowerPC/VxWorks 7.2, OK for the mainline?
2020-05-05 Eric Botcazou <ebotca...@adacore.com>
* lto-plugin.c (linker_output_set): Change type to bool.
(linker_output_known): Likewise.
(linker_output_no_warning): New variable.
(all_symbols_read_handler): Take it into account.
<LDPO_REL>: Do not issue the warning if it is set.
(process_option): Process it.
(cleanup_handler): Remove unused variable.
(onload) <LDPT_LINKER_OUTPUT>: Adjust to above type change.
2020-05-05 Eric Botcazou <ebotca...@adacore.com>
* gcc.c (LTO_PLUGIN_SPEC): Define if not already.
(LINK_PLUGIN_SPEC): Execute LTO_PLUGIN_SPEC.
* config/vxworks.h (LTO_PLUGIN_SPEC): Define.
--
Eric Botcazou
diff --git a/gcc/config/vxworks.h b/gcc/config/vxworks.h
index 58c0e782dae..5cef26f6bef 100644
--- a/gcc/config/vxworks.h
+++ b/gcc/config/vxworks.h
@@ -273,3 +273,11 @@ extern void vxworks_asm_out_destructor (rtx symbol, int priority);
#undef DWARF_GNAT_ENCODINGS_DEFAULT
#define DWARF_GNAT_ENCODINGS_DEFAULT \
(TARGET_VXWORKS7 ? DWARF_GNAT_ENCODINGS_MINIMAL : DWARF_GNAT_ENCODINGS_ALL)
+
+/* The default configuration of incremental LTO linking (-flinker-output=rel)
+ warns if an object file included in the link does not contain LTO bytecode,
+ because in this case the output will not contain it either, thus preventing
+ further incremental LTO linking. We do not do repeated incremental linking
+ so silence the warning (instead of passing -flinker-output=nolto-rel). */
+#undef LTO_PLUGIN_SPEC
+#define LTO_PLUGIN_SPEC "%{!mrtp:-plugin-opt=-linker-output-no-warning}"
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 9f790db0daf..b0d0308f127 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -944,6 +944,10 @@ proper position among the other output files. */
# endif
#endif
+#ifndef LTO_PLUGIN_SPEC
+#define LTO_PLUGIN_SPEC ""
+#endif
+
/* Conditional to test whether the LTO plugin is used or not.
FIXME: For slim LTO we will need to enable plugin unconditionally. This
still cause problems with PLUGIN_LD != LD and when plugin is built but
@@ -968,6 +972,7 @@ proper position among the other output files. */
-plugin %(linker_plugin_file) \
-plugin-opt=%(lto_wrapper) \
-plugin-opt=-fresolution=%u.res \
+ " LTO_PLUGIN_SPEC "\
%{flinker-output=*:-plugin-opt=-linker-output-known} \
%{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
}" PLUGIN_COND_CLOSE
diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c
index ca6c84a1ffd..0ebe99585d2 100644
--- a/lto-plugin/lto-plugin.c
+++ b/lto-plugin/lto-plugin.c
@@ -195,8 +195,9 @@ static bool verbose;
static char nop;
static char *resolution_file = NULL;
static enum ld_plugin_output_file_type linker_output;
-static int linker_output_set;
-static int linker_output_known;
+static bool linker_output_set;
+static bool linker_output_known;
+static bool linker_output_no_warning;
static const char *link_output_name = NULL;
/* The version of gold being used, or -1 if not gold. The number is
@@ -711,7 +712,7 @@ all_symbols_read_handler (void)
{
unsigned i;
unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 2
- + !linker_output_known;
+ + !linker_output_known + !linker_output_no_warning;
char **lto_argv;
const char *linker_output_str = NULL;
const char **lto_arg_ptr;
@@ -743,9 +744,10 @@ all_symbols_read_handler (void)
case LDPO_REL:
if (non_claimed_files)
{
- message (LDPL_WARNING, "incremental linking of LTO and non-LTO "
- "objects; using -flinker-output=nolto-rel which will "
- "bypass whole program optimization");
+ if (!linker_output_no_warning)
+ message (LDPL_WARNING, "incremental linking of LTO and non-LTO"
+ " objects; using -flinker-output=nolto-rel which will"
+ " bypass whole program optimization");
linker_output_str = "-flinker-output=nolto-rel";
}
else
@@ -1291,8 +1293,10 @@ static void
process_option (const char *option)
{
if (strcmp (option, "-linker-output-known") == 0)
- linker_output_known = 1;
- if (strcmp (option, "-debug") == 0)
+ linker_output_known = true;
+ else if (strcmp (option, "-linker-output-no-warning") == 0)
+ linker_output_no_warning = true;
+ else if (strcmp (option, "-debug") == 0)
debug = true;
else if ((strcmp (option, "-v") == 0)
|| (strcmp (option, "--verbose") == 0))
@@ -1390,7 +1394,7 @@ onload (struct ld_plugin_tv *tv)
break;
case LDPT_LINKER_OUTPUT:
linker_output = (enum ld_plugin_output_file_type) p->tv_u.tv_val;
- linker_output_set = 1;
+ linker_output_set = true;
break;
case LDPT_OUTPUT_NAME:
/* We only use this to make user-friendly temp file names. */