* [PATCH] plugin: Use LDPT_ADD_SYMBOLS_V2 to get symbol type
@ 2020-03-19 16:50 H.J. Lu
2020-03-20 2:38 ` Alan Modra
0 siblings, 1 reply; 17+ messages in thread
From: H.J. Lu @ 2020-03-19 16:50 UTC (permalink / raw)
To: binutils
Since LTO plugin may generate more than one ltrans.o file from one input
IR object as LTO wrapper ignores -flto-partition=none:
lto-wrapper.c:608:
604 /* Drop arguments that we want to take from the link line. */
605 case OPT_flto_:
606 case OPT_flto:
607 case OPT_flto_partition_:
608 continue;
the LTO wrapper approach is not only slow but also unreliable. Since
the LTO plugin API has been extended to add LDPT_ADD_SYMBOLS_V2 with
symbol type and section kind, we can use LDPT_ADD_SYMBOLS_V2 to get
symbol type, instead of invoking the LTO wrapper.
PR binutils/25640
* plugin.c (plugin_list_entry): Add has_symbol_type.
(add_symbols_v2): New function.
(bfd_plugin_open_input): Don't invoke LTO wrapper if LTO plugin
provides symbol type.
(try_load_plugin): Add LDPT_ADD_SYMBOLS_V2.
(bfd_plugin_canonicalize_symtab): Use LTO plugin symbol type if
available.
---
bfd/plugin.c | 66 +++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 52 insertions(+), 14 deletions(-)
diff --git a/bfd/plugin.c b/bfd/plugin.c
index a0f172d363..13549d24e7 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -136,6 +136,7 @@ struct plugin_list_entry
asymbol **real_syms;
int lto_nsyms;
const struct ld_plugin_symbol *lto_syms;
+ bfd_boolean has_symbol_type;
struct plugin_list_entry *next;
@@ -503,6 +504,14 @@ add_symbols (void * handle,
return LDPS_OK;
}
+static enum ld_plugin_status
+add_symbols_v2 (void *handle, int nsyms,
+ const struct ld_plugin_symbol *syms)
+{
+ current_plugin->has_symbol_type = TRUE;
+ return add_symbols (handle, nsyms, syms);
+}
+
int
bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file)
{
@@ -560,7 +569,8 @@ try_claim (bfd *abfd)
current_plugin->claim_file (&file, &claimed);
if (claimed)
{
- if (current_plugin->all_symbols_read)
+ if (current_plugin->all_symbols_read
+ && !current_plugin->has_symbol_type)
{
struct plugin_data_struct *plugin_data
= abfd->tdata.plugin_data;
@@ -602,7 +612,7 @@ try_load_plugin (const char *pname,
bfd *abfd, bfd_boolean build_list_p)
{
void *plugin_handle;
- struct ld_plugin_tv tv[12];
+ struct ld_plugin_tv tv[13];
int i;
ld_plugin_onload onload;
enum ld_plugin_status status;
@@ -665,6 +675,10 @@ try_load_plugin (const char *pname,
tv[i].tv_tag = LDPT_ADD_SYMBOLS;
tv[i].tv_u.tv_add_symbols = add_symbols;
+ ++i;
+ tv[i].tv_tag = LDPT_ADD_SYMBOLS_V2;
+ tv[i].tv_u.tv_add_symbols = add_symbols_v2;
+
if (get_lto_wrapper (plugin_list_iter))
{
++i;
@@ -977,9 +991,15 @@ bfd_plugin_canonicalize_symtab (bfd *abfd,
struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
long nsyms = plugin_data->nsyms;
const struct ld_plugin_symbol *syms = plugin_data->syms;
- static asection fake_section
- = BFD_FAKE_SECTION (fake_section, NULL, "plug", 0,
+ static asection fake_text_section
+ = BFD_FAKE_SECTION (fake_text_section, NULL, "plug", 0,
SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS);
+ static asection fake_data_section
+ = BFD_FAKE_SECTION (fake_data_section, NULL, "plug", 0,
+ SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS);
+ static asection fake_bss_section
+ = BFD_FAKE_SECTION (fake_bss_section, NULL, "plug", 0,
+ SEC_ALLOC);
static asection fake_common_section
= BFD_FAKE_SECTION (fake_common_section, NULL, "plug", 0, SEC_IS_COMMON);
int i, j;
@@ -1014,16 +1034,34 @@ bfd_plugin_canonicalize_symtab (bfd *abfd,
break;
case LDPK_DEF:
case LDPK_WEAKDEF:
- s->section = &fake_section;
- if (real_nsyms)
- /* Use real LTO symbols if possible. */
- for (j = 0; j < real_nsyms; j++)
- if (real_syms[j]->name
- && strcmp (syms[i].name, real_syms[j]->name) == 0)
- {
- s->section = real_syms[j]->section;
- break;
- }
+ if (current_plugin->has_symbol_type)
+ switch (syms[i].symbol_type)
+ {
+ case LDST_UNKNOWN:
+ /* What is the best fake section for LDST_UNKNOWN? */
+ case LDST_FUNCTION:
+ s->section = &fake_text_section;
+ break;
+ case LDST_VARIABLE:
+ if (syms[i].section_kind == LDSSK_BSS)
+ s->section = &fake_bss_section;
+ else
+ s->section = &fake_data_section;
+ break;
+ }
+ else
+ {
+ s->section = &fake_text_section;
+ if (real_nsyms)
+ /* Use real LTO symbols if possible. */
+ for (j = 0; j < real_nsyms; j++)
+ if (real_syms[j]->name
+ && strcmp (syms[i].name, real_syms[j]->name) == 0)
+ {
+ s->section = real_syms[j]->section;
+ break;
+ }
+ }
break;
default:
BFD_ASSERT (0);
--
2.25.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Use LDPT_ADD_SYMBOLS_V2 to get symbol type
2020-03-19 16:50 [PATCH] plugin: Use LDPT_ADD_SYMBOLS_V2 to get symbol type H.J. Lu
@ 2020-03-20 2:38 ` Alan Modra
2020-03-20 4:42 ` [PATCH] plugin: Don't invoke LTO-wrapper H.J. Lu
0 siblings, 1 reply; 17+ messages in thread
From: Alan Modra @ 2020-03-20 2:38 UTC (permalink / raw)
To: H.J. Lu; +Cc: binutils
On Thu, Mar 19, 2020 at 09:50:17AM -0700, H.J. Lu via Binutils wrote:
> Since LTO plugin may generate more than one ltrans.o file from one input
> IR object as LTO wrapper ignores -flto-partition=none:
>
> lto-wrapper.c:608:
>
> 604 /* Drop arguments that we want to take from the link line. */
> 605 case OPT_flto_:
> 606 case OPT_flto:
> 607 case OPT_flto_partition_:
> 608 continue;
>
> the LTO wrapper approach is not only slow but also unreliable. Since
> the LTO plugin API has been extended to add LDPT_ADD_SYMBOLS_V2 with
> symbol type and section kind, we can use LDPT_ADD_SYMBOLS_V2 to get
> symbol type, instead of invoking the LTO wrapper.
>
> PR binutils/25640
> * plugin.c (plugin_list_entry): Add has_symbol_type.
> (add_symbols_v2): New function.
> (bfd_plugin_open_input): Don't invoke LTO wrapper if LTO plugin
> provides symbol type.
> (try_load_plugin): Add LDPT_ADD_SYMBOLS_V2.
> (bfd_plugin_canonicalize_symtab): Use LTO plugin symbol type if
> available.
OK. Are you going to remove the LTO wrapper code from binutils?
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-20 2:38 ` Alan Modra
@ 2020-03-20 4:42 ` H.J. Lu
2020-03-20 7:59 ` Martin Liška
2020-03-20 10:19 ` [PATCH] plugin: Don't invoke LTO-wrapper Alan Modra
0 siblings, 2 replies; 17+ messages in thread
From: H.J. Lu @ 2020-03-20 4:42 UTC (permalink / raw)
To: Alan Modra; +Cc: Binutils
[-- Attachment #1: Type: text/plain, Size: 1366 bytes --]
On Thu, Mar 19, 2020 at 7:38 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Thu, Mar 19, 2020 at 09:50:17AM -0700, H.J. Lu via Binutils wrote:
> > Since LTO plugin may generate more than one ltrans.o file from one input
> > IR object as LTO wrapper ignores -flto-partition=none:
> >
> > lto-wrapper.c:608:
> >
> > 604 /* Drop arguments that we want to take from the link line. */
> > 605 case OPT_flto_:
> > 606 case OPT_flto:
> > 607 case OPT_flto_partition_:
> > 608 continue;
> >
> > the LTO wrapper approach is not only slow but also unreliable. Since
> > the LTO plugin API has been extended to add LDPT_ADD_SYMBOLS_V2 with
> > symbol type and section kind, we can use LDPT_ADD_SYMBOLS_V2 to get
> > symbol type, instead of invoking the LTO wrapper.
> >
> > PR binutils/25640
> > * plugin.c (plugin_list_entry): Add has_symbol_type.
> > (add_symbols_v2): New function.
> > (bfd_plugin_open_input): Don't invoke LTO wrapper if LTO plugin
> > provides symbol type.
> > (try_load_plugin): Add LDPT_ADD_SYMBOLS_V2.
> > (bfd_plugin_canonicalize_symtab): Use LTO plugin symbol type if
> > available.
>
> OK. Are you going to remove the LTO wrapper code from binutils?
Here is the patch to remove the LTO wrapper code.
OK for master?
Thanks.
--
H.J.
[-- Attachment #2: 0001-plugin-Don-t-invoke-LTO-wrapper.patch --]
[-- Type: text/x-patch, Size: 18609 bytes --]
From 92846bebf6c45929003750bb0da2752e39fc28fa Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 19 Mar 2020 21:28:32 -0700
Subject: [PATCH] plugin: Don't invoke LTO-wrapper
Don't invoke LTO-wrapper since the LTO wrapper approach is not only
slow but also unreliable. For GCC 10 or newer, LDPT_ADD_SYMBOLS_V2
will be used.
bfd/
* plugin.c (bfd_plugin_close_and_cleanup): Defined as
_bfd_generic_close_and_cleanup.
(plugin_list_entry): Remove resolution_file, resolution_option,
real_bfd, real_nsyms, real_syms, lto_nsyms, lto_syms, gcc,
lto_wrapper, gcc_env and initialized,
(need_lto_wrapper_p): Removed.
(get_lto_wrapper): Likewise.
(setup_lto_wrapper_env): Likewise.
(register_all_symbols_read): Likewise.
(egister_cleanup): Likewise.
(get_symbols): Likewise.
(add_input_file): Likewise.
(bfd_plugin_set_program_name): Remove need_lto_wrapper.
(add_symbols): Updated.
(try_claim): Likewise.
(try_load_plugin): Likewise.
(bfd_plugin_canonicalize_symtab): Likewise.
* plugin.h (bfd_plugin_set_program_name): Remove int argument.
(plugin_data_struct): Remove real_bfd, real_nsyms and
real_syms.
binutils/
* ar.c (main): Update bfd_plugin_set_program_name call.
* nm.c (main): Likewise.
ld/
* testsuite/ld-plugin/lto.exp (lto_link_tests): Run PR ld/25355
test only for GCC 10 or newer.
---
bfd/plugin.c | 453 +--------------------------------
bfd/plugin.h | 5 +-
binutils/ar.c | 2 +-
binutils/nm.c | 2 +-
ld/testsuite/ld-plugin/lto.exp | 15 +-
5 files changed, 23 insertions(+), 454 deletions(-)
diff --git a/bfd/plugin.c b/bfd/plugin.c
index 13549d24e7..48387fa53e 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -69,6 +69,7 @@ dlerror (void)
#endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */
+#define bfd_plugin_close_and_cleanup _bfd_generic_close_and_cleanup
#define bfd_plugin_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
#define bfd_plugin_new_section_hook _bfd_generic_new_section_hook
#define bfd_plugin_get_section_contents _bfd_generic_get_section_contents
@@ -129,196 +130,20 @@ struct plugin_list_entry
ld_plugin_claim_file_handler claim_file;
ld_plugin_all_symbols_read_handler all_symbols_read;
ld_plugin_all_symbols_read_handler cleanup_handler;
- char *resolution_file;
- char *resolution_option;
- bfd *real_bfd;
- long real_nsyms;
- asymbol **real_syms;
- int lto_nsyms;
- const struct ld_plugin_symbol *lto_syms;
bfd_boolean has_symbol_type;
struct plugin_list_entry *next;
/* These can be reused for all IR objects. */
const char *plugin_name;
- char *gcc;
- char *lto_wrapper;
- char *gcc_env;
- bfd_boolean initialized;
};
static const char *plugin_program_name;
-static int need_lto_wrapper_p;
void
-bfd_plugin_set_program_name (const char *program_name,
- int need_lto_wrapper)
+bfd_plugin_set_program_name (const char *program_name)
{
plugin_program_name = program_name;
- need_lto_wrapper_p = need_lto_wrapper;
-}
-
-/* Use GCC LTO wrapper to covert LTO IR object to the real object. */
-
-static bfd_boolean
-get_lto_wrapper (struct plugin_list_entry *plugin)
-{
- struct stat st;
- const char *real_name;
- const char *base_name;
- size_t length;
- const char *target_start = NULL;
- const char *target_end = NULL;
- size_t target_length = 0;
- char *gcc_name;
- char *wrapper_name;
- char *p;
- char dir_seperator = '\0';
- char *resolution_file;
-
- if (!need_lto_wrapper_p)
- return FALSE;
-
- if (plugin->initialized)
- {
- if (plugin->lto_wrapper)
- {
- resolution_file = make_temp_file (".res");
- if (resolution_file)
- {
- plugin->resolution_file = resolution_file;
- plugin->resolution_option = concat ("-fresolution=",
- resolution_file, NULL);
- return TRUE;
- }
- else
- {
- /* Something is wrong. Give up. */
- free (plugin->gcc);
- free (plugin->lto_wrapper);
- free (plugin->gcc_env);
- plugin->gcc = NULL;
- plugin->gcc_env = NULL;
- plugin->lto_wrapper = NULL;
- }
- }
-
- return FALSE;
- }
-
- plugin->initialized = TRUE;
-
- /* Check for PREFIX/libexec/gcc/TARGET/VERSION/liblto_plugin.so. */
- real_name = lrealpath (plugin->plugin_name);
- base_name = lbasename (real_name);
-
- /* The directory length in plugin pathname. */
- length = base_name - real_name;
-
- /* Skip if there is no PREFIX. */
- if (!length)
- return FALSE;
-
- p = (char *) real_name + length - 1;
- if (IS_DIR_SEPARATOR (*p))
- {
- int level = 0;
- for (; p != real_name; p--)
- if (IS_DIR_SEPARATOR (*p))
- {
- level++;
- if (level == 2)
- target_end = p;
- else if (level == 3)
- {
- target_start = p + 1;
- target_length = target_end - target_start;
- }
- else if (level == 5)
- {
- dir_seperator = *p;
- break;
- }
- }
- }
-
- /* Skip if there is no TARGET nor PREFIX. */
- if (!target_length || !dir_seperator)
- return FALSE;
-
-#ifdef HAVE_EXECUTABLE_SUFFIX
-# define GCC_EXECUTABLE "gcc" EXECUTABLE_SUFFIX
-# define LTO_WRAPPER_EXECUTABLE "lto-wrapper" EXECUTABLE_SUFFIX
-#else
-# define GCC_EXECUTABLE "gcc"
-# define LTO_WRAPPER_EXECUTABLE "lto-wrapper"
-#endif
- gcc_name = bfd_malloc (length + target_length
- + sizeof (GCC_EXECUTABLE));
- if (gcc_name == NULL)
- return FALSE;
- memcpy (gcc_name, real_name, length);
-
- /* Get PREFIX/bin/. */
- p += gcc_name - real_name;
- memcpy (p + 1, "bin", 3);
- p[4] = dir_seperator;
-
- /* Try PREFIX/bin/TARGET-gcc first. */
- memcpy (p + 5, target_start, target_length);
- p[5 + target_length] = '-';
- memcpy (p + 5 + target_length + 1, GCC_EXECUTABLE,
- sizeof (GCC_EXECUTABLE));
- if (stat (gcc_name, &st) != 0 || !S_ISREG (st.st_mode))
- {
- /* Then try PREFIX/bin/gcc. */
- memcpy (p + 5, GCC_EXECUTABLE, sizeof (GCC_EXECUTABLE));
- if (stat (gcc_name, &st) != 0 || !S_ISREG (st.st_mode))
- {
- free (gcc_name);
- return FALSE;
- }
- }
-
- /* lto-wrapper should be in the same directory with LTO plugin. */
- wrapper_name = bfd_malloc (length + sizeof (LTO_WRAPPER_EXECUTABLE));
- if (wrapper_name == NULL)
- {
- free (gcc_name);
- return FALSE;
- }
- memcpy (wrapper_name, real_name, length);
- memcpy (wrapper_name + length, LTO_WRAPPER_EXECUTABLE,
- sizeof (LTO_WRAPPER_EXECUTABLE));
- if (stat (wrapper_name, &st) == 0 && S_ISREG (st.st_mode))
- {
- resolution_file = make_temp_file (".res");
- if (resolution_file)
- {
- plugin->gcc = gcc_name;
- plugin->lto_wrapper = wrapper_name;
- plugin->gcc_env = concat ("COLLECT_GCC=", gcc_name, NULL);
- plugin->resolution_file = resolution_file;
- plugin->resolution_option = concat ("-fresolution=",
- resolution_file, NULL);
- return TRUE;
- }
- }
-
- free (gcc_name);
- free (wrapper_name);
- return FALSE;
-}
-
-/* Set environment variables for GCC LTO wrapper to covert LTO IR
- object to the real object. */
-
-static int
-setup_lto_wrapper_env (struct plugin_list_entry *plugin)
-{
- return (putenv (plugin->gcc_env)
- || putenv ("COLLECT_GCC_OPTIONS="));
}
static struct plugin_list_entry *plugin_list = NULL;
@@ -333,119 +158,6 @@ register_claim_file (ld_plugin_claim_file_handler handler)
return LDPS_OK;
}
-/* Register an all-symbols-read handler. */
-
-static enum ld_plugin_status
-register_all_symbols_read (ld_plugin_all_symbols_read_handler handler)
-{
- current_plugin->all_symbols_read = handler;
- return LDPS_OK;
-}
-
-/* Register a cleanup handler. */
-
-static enum ld_plugin_status
-register_cleanup (ld_plugin_all_symbols_read_handler handler)
-{
- current_plugin->cleanup_handler = handler;
- return LDPS_OK;
-}
-
-/* Get the symbol resolution info for a plugin-claimed input file. */
-
-static enum ld_plugin_status
-get_symbols (const void *handle ATTRIBUTE_UNUSED, int nsyms,
- struct ld_plugin_symbol *syms)
-{
- if (syms)
- {
- int n;
- for (n = 0; n < nsyms; n++)
- {
- switch (syms[n].def)
- {
- default:
- BFD_ASSERT (0);
- break;
- case LDPK_UNDEF:
- case LDPK_WEAKUNDEF:
- syms[n].resolution = LDPR_UNDEF;
- break;
- case LDPK_DEF:
- case LDPK_WEAKDEF:
- case LDPK_COMMON:
- /* Tell plugin that LTO symbol has references from regular
- object code. */
- syms[n].resolution = LDPR_PREVAILING_DEF;
- break;
- }
- }
- }
-
- return LDPS_OK;
-}
-
-/* Add a new (real) input file generated by a plugin. */
-
-static enum ld_plugin_status
-add_input_file (const char *pathname)
-{
- /* Get symbols from the real LTO object. */
- char **matching;
- long real_symsize;
- long real_nsyms;
- asymbol **real_syms;
- int lto_nsyms;
- bfd_boolean lto_symbol_found = FALSE;
- const struct ld_plugin_symbol *lto_syms;
- bfd *rbfd;
- int i, j;
-
- rbfd = bfd_openr (pathname, NULL);
- if (!bfd_check_format_matches (rbfd, bfd_object, &matching))
- BFD_ASSERT (0);
-
- real_symsize = bfd_get_symtab_upper_bound (rbfd);
- if (real_symsize < 0)
- BFD_ASSERT (0);
-
- real_syms = (asymbol **) bfd_malloc (real_symsize);
- if (real_syms)
- {
- real_nsyms = bfd_canonicalize_symtab (rbfd, real_syms);
- if (real_nsyms < 0)
- BFD_ASSERT (0);
-
- /* NB: LTO plugin may generate more than one real object from one
- LTO IR object. We use the one which contains LTO symbols. */
- lto_syms = current_plugin->lto_syms;
- lto_nsyms = current_plugin->lto_nsyms;
- for (i = 0; i < lto_nsyms; i++)
- for (j = 0; j < real_nsyms; j++)
- if (real_syms[j]->name
- && strcmp (lto_syms[i].name, real_syms[j]->name) == 0)
- {
- lto_symbol_found = TRUE;
- break;
- }
- }
-
- if (lto_symbol_found)
- {
- current_plugin->real_nsyms = real_nsyms;
- current_plugin->real_syms = real_syms;
- /* NB: We can't close RBFD which own the real symbol info. */
- current_plugin->real_bfd = rbfd;
- }
- else
- {
- bfd_close (rbfd);
- free (real_syms);
- }
-
- return LDPS_OK;
-}
-
static enum ld_plugin_status
add_symbols (void * handle,
int nsyms,
@@ -455,52 +167,16 @@ add_symbols (void * handle,
struct plugin_data_struct *plugin_data =
bfd_alloc (abfd, sizeof (plugin_data_struct));
- if (plugin_data)
- {
- struct ld_plugin_symbol *sym_info;
- char *strtab;
- size_t sym_info_size, name_length;
- int i;
-
- memset (plugin_data, 0, sizeof (*plugin_data));
-
- abfd->tdata.plugin_data = plugin_data;
-
- /* NB: LTO symbols are owned by LTO plugin. Create a copy so
- that we can use it in bfd_plugin_canonicalize_symtab. */
- sym_info_size = nsyms * sizeof (*syms);
+ if (!plugin_data)
+ return LDPS_ERR;
- /* Allocate a string table */
- for (i = 0; i < nsyms; i++)
- sym_info_size += strlen (syms[i].name) + 1;
-
- sym_info = bfd_alloc (abfd, sym_info_size);
- if (sym_info)
- {
- /* Copy symbol table. */
- memcpy (sym_info, syms, nsyms * sizeof (*syms));
-
- /* Copy symbol names in symbol table. */
- strtab = (char *) (sym_info + nsyms);
- for (i = 0; i < nsyms; i++)
- {
- name_length = strlen (syms[i].name);
- memcpy (strtab, syms[i].name, name_length + 1);
- sym_info[i].name = strtab;
- strtab += name_length + 1;
- }
-
- plugin_data->nsyms = nsyms;
- plugin_data->syms = sym_info;
-
- current_plugin->lto_nsyms = nsyms;
- current_plugin->lto_syms = sym_info;
- }
- }
+ plugin_data->nsyms = nsyms;
+ plugin_data->syms = syms;
if (nsyms != 0)
abfd->flags |= HAS_SYMS;
+ abfd->tdata.plugin_data = plugin_data;
return LDPS_OK;
}
@@ -567,42 +243,9 @@ try_claim (bfd *abfd)
&& current_plugin->claim_file)
{
current_plugin->claim_file (&file, &claimed);
- if (claimed)
- {
- if (current_plugin->all_symbols_read
- && !current_plugin->has_symbol_type)
- {
- struct plugin_data_struct *plugin_data
- = abfd->tdata.plugin_data;
- if (plugin_data)
- {
- /* Get real symbols from LTO wrapper. */
- current_plugin->all_symbols_read ();
-
- /* Copy real symbols to plugin_data. */
- plugin_data->real_bfd = current_plugin->real_bfd;
- plugin_data->real_nsyms = current_plugin->real_nsyms;
- plugin_data->real_syms = current_plugin->real_syms;
-
- /* Clean up LTO plugin. */
- if (current_plugin->cleanup_handler)
- current_plugin->cleanup_handler ();
- }
- }
- }
-
close (file.fd);
}
- if (current_plugin->lto_wrapper)
- {
- /* Clean up for LTO wrapper. NB: Resolution file and option
- have been created regardless if an IR object is claimed or
- not. */
- unlink (current_plugin->resolution_file);
- free (current_plugin->resolution_option);
- }
-
return claimed;
}
@@ -612,7 +255,7 @@ try_load_plugin (const char *pname,
bfd *abfd, bfd_boolean build_list_p)
{
void *plugin_handle;
- struct ld_plugin_tv tv[13];
+ struct ld_plugin_tv tv[5];
int i;
ld_plugin_onload onload;
enum ld_plugin_status status;
@@ -679,41 +322,6 @@ try_load_plugin (const char *pname,
tv[i].tv_tag = LDPT_ADD_SYMBOLS_V2;
tv[i].tv_u.tv_add_symbols = add_symbols_v2;
- if (get_lto_wrapper (plugin_list_iter))
- {
- ++i;
- tv[i].tv_tag = LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK;
- tv[i].tv_u.tv_register_all_symbols_read = register_all_symbols_read;
-
- ++i;
- tv[i].tv_tag = LDPT_REGISTER_CLEANUP_HOOK;
- tv[i].tv_u.tv_register_cleanup = register_cleanup;
-
- ++i;
- tv[i].tv_tag = LDPT_GET_SYMBOLS;
- tv[i].tv_u.tv_get_symbols = get_symbols;
-
- ++i;
- tv[i].tv_tag = LDPT_GET_SYMBOLS_V2;
- tv[i].tv_u.tv_get_symbols = get_symbols;
-
- ++i;
- tv[i].tv_tag = LDPT_OPTION;
- tv[i].tv_u.tv_string = plugin_list_iter->lto_wrapper;
-
- ++i;
- tv[i].tv_tag = LDPT_OPTION;
- tv[i].tv_u.tv_string = plugin_list_iter->resolution_option;
-
- ++i;
- tv[i].tv_tag = LDPT_LINKER_OUTPUT;
- tv[i].tv_u.tv_val = LDPO_EXEC;
-
- ++i;
- tv[i].tv_tag = LDPT_ADD_INPUT_FILE;
- tv[i].tv_u.tv_add_input_file = add_input_file;
- }
-
++i;
tv[i].tv_tag = LDPT_NULL;
tv[i].tv_u.tv_val = 0;
@@ -724,10 +332,6 @@ try_load_plugin (const char *pname,
if (status != LDPS_OK)
goto short_circuit;
- if (current_plugin->lto_wrapper
- && setup_lto_wrapper_env (current_plugin))
- goto short_circuit;
-
abfd->plugin_format = bfd_plugin_no;
if (!current_plugin->claim_file)
@@ -1002,15 +606,7 @@ bfd_plugin_canonicalize_symtab (bfd *abfd,
SEC_ALLOC);
static asection fake_common_section
= BFD_FAKE_SECTION (fake_common_section, NULL, "plug", 0, SEC_IS_COMMON);
- int i, j;
- long real_nsyms;
- asymbol **real_syms;
-
- real_syms = plugin_data->real_syms;
- if (real_syms)
- real_nsyms = plugin_data->real_nsyms;
- else
- real_nsyms = 0;
+ int i;
for (i = 0; i < nsyms; i++)
{
@@ -1050,18 +646,7 @@ bfd_plugin_canonicalize_symtab (bfd *abfd,
break;
}
else
- {
- s->section = &fake_text_section;
- if (real_nsyms)
- /* Use real LTO symbols if possible. */
- for (j = 0; j < real_nsyms; j++)
- if (real_syms[j]->name
- && strcmp (syms[i].name, real_syms[j]->name) == 0)
- {
- s->section = real_syms[j]->section;
- break;
- }
- }
+ s->section = &fake_text_section;
break;
default:
BFD_ASSERT (0);
@@ -1110,24 +695,6 @@ bfd_plugin_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
return 0;
}
-static bfd_boolean
-bfd_plugin_close_and_cleanup (bfd *abfd)
-{
- struct plugin_data_struct *plugin_data;
-
- if (abfd->format != bfd_archive
- && (plugin_data = abfd->tdata.plugin_data))
- {
- if (plugin_data->real_bfd)
- bfd_close (plugin_data->real_bfd);
-
- if (plugin_data->real_syms)
- free (plugin_data->real_syms);
- }
-
- return _bfd_generic_close_and_cleanup (abfd);
-}
-
const bfd_target plugin_vec =
{
"plugin", /* Name. */
diff --git a/bfd/plugin.h b/bfd/plugin.h
index af5d1f4cfa..075532dca0 100644
--- a/bfd/plugin.h
+++ b/bfd/plugin.h
@@ -21,7 +21,7 @@
#ifndef _PLUGIN_H_
#define _PLUGIN_H_
-void bfd_plugin_set_program_name (const char *, int);
+void bfd_plugin_set_program_name (const char *);
int bfd_plugin_open_input (bfd *, struct ld_plugin_input_file *);
void bfd_plugin_set_plugin (const char *);
bfd_boolean bfd_plugin_target_p (const bfd_target *);
@@ -33,9 +33,6 @@ typedef struct plugin_data_struct
{
int nsyms;
const struct ld_plugin_symbol *syms;
- bfd *real_bfd;
- long real_nsyms;
- asymbol **real_syms;
}
plugin_data_struct;
diff --git a/binutils/ar.c b/binutils/ar.c
index 35dd51e04a..1057db9980 100644
--- a/binutils/ar.c
+++ b/binutils/ar.c
@@ -725,7 +725,7 @@ main (int argc, char **argv)
xmalloc_set_program_name (program_name);
bfd_set_error_program_name (program_name);
#if BFD_SUPPORTS_PLUGINS
- bfd_plugin_set_program_name (program_name, 0);
+ bfd_plugin_set_program_name (program_name);
#endif
expandargv (&argc, &argv);
diff --git a/binutils/nm.c b/binutils/nm.c
index 5b386592a6..0ee3f88386 100644
--- a/binutils/nm.c
+++ b/binutils/nm.c
@@ -1701,7 +1701,7 @@ main (int argc, char **argv)
xmalloc_set_program_name (program_name);
bfd_set_error_program_name (program_name);
#if BFD_SUPPORTS_PLUGINS
- bfd_plugin_set_program_name (program_name, 1);
+ bfd_plugin_set_program_name (program_name);
#endif
START_PROGRESS (program_name, 0);
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 31da465d00..8ffc03f01a 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -234,13 +234,18 @@ set lto_link_tests [list \
[list "Build pr24406-2b.o" \
"" "-O2 -fno-lto" \
{pr24406-2b.c}] \
- [list "pr25355.o" \
- "" \
- "-flto -fno-common $lto_no_fat" \
- {pr25355.c} \
- [list [list "nm" "$plug_opt" "pr25355.d"]]] \
]
+if { [at_least_gcc_version 10 0] } {
+ set lto_link_tests [concat $lto_link_tests [list \
+ [list "pr25355.o" \
+ "" \
+ "-flto -fno-common $lto_no_fat" \
+ {pr25355.c} \
+ [list [list "nm" "$plug_opt" "pr25355.d"]]] \
+ ]]
+}
+
if { [at_least_gcc_version 4 7] } {
set lto_link_tests [concat $lto_link_tests [list \
[list "Compile PR ld/12942 (1)" \
--
2.25.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-20 4:42 ` [PATCH] plugin: Don't invoke LTO-wrapper H.J. Lu
@ 2020-03-20 7:59 ` Martin Liška
2020-03-20 11:13 ` H.J. Lu
2020-03-20 10:19 ` [PATCH] plugin: Don't invoke LTO-wrapper Alan Modra
1 sibling, 1 reply; 17+ messages in thread
From: Martin Liška @ 2020-03-20 7:59 UTC (permalink / raw)
To: H.J. Lu, Alan Modra; +Cc: Binutils
On 3/20/20 5:42 AM, H.J. Lu via Binutils wrote:
> On Thu, Mar 19, 2020 at 7:38 PM Alan Modra <amodra@gmail.com> wrote:
>>
>> On Thu, Mar 19, 2020 at 09:50:17AM -0700, H.J. Lu via Binutils wrote:
>>> Since LTO plugin may generate more than one ltrans.o file from one input
>>> IR object as LTO wrapper ignores -flto-partition=none:
>>>
>>> lto-wrapper.c:608:
>>>
>>> 604 /* Drop arguments that we want to take from the link line. */
>>> 605 case OPT_flto_:
>>> 606 case OPT_flto:
>>> 607 case OPT_flto_partition_:
>>> 608 continue;
>>>
>>> the LTO wrapper approach is not only slow but also unreliable. Since
>>> the LTO plugin API has been extended to add LDPT_ADD_SYMBOLS_V2 with
>>> symbol type and section kind, we can use LDPT_ADD_SYMBOLS_V2 to get
>>> symbol type, instead of invoking the LTO wrapper.
>>>
>>> PR binutils/25640
>>> * plugin.c (plugin_list_entry): Add has_symbol_type.
>>> (add_symbols_v2): New function.
>>> (bfd_plugin_open_input): Don't invoke LTO wrapper if LTO plugin
>>> provides symbol type.
>>> (try_load_plugin): Add LDPT_ADD_SYMBOLS_V2.
>>> (bfd_plugin_canonicalize_symtab): Use LTO plugin symbol type if
>>> available.
>>
>> OK. Are you going to remove the LTO wrapper code from binutils?
>
> Here is the patch to remove the LTO wrapper code.
>
> OK for master?
>
> Thanks.
>
Hello.
Thank you very much for the patches. Can you please than backport this
to 2.34 branch?
Thanks,
Martin
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-20 4:42 ` [PATCH] plugin: Don't invoke LTO-wrapper H.J. Lu
2020-03-20 7:59 ` Martin Liška
@ 2020-03-20 10:19 ` Alan Modra
2020-03-20 10:52 ` H.J. Lu
1 sibling, 1 reply; 17+ messages in thread
From: Alan Modra @ 2020-03-20 10:19 UTC (permalink / raw)
To: H.J. Lu; +Cc: Binutils
On Thu, Mar 19, 2020 at 09:42:15PM -0700, H.J. Lu wrote:
> Here is the patch to remove the LTO wrapper code.
>
> OK for master?
OK. Remove the configury HAVE_EXECUTABLE_SUFFIX and EXECUTABLE_SUFFIX
too, please.
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-20 10:19 ` [PATCH] plugin: Don't invoke LTO-wrapper Alan Modra
@ 2020-03-20 10:52 ` H.J. Lu
0 siblings, 0 replies; 17+ messages in thread
From: H.J. Lu @ 2020-03-20 10:52 UTC (permalink / raw)
To: Alan Modra; +Cc: Binutils
[-- Attachment #1: Type: text/plain, Size: 353 bytes --]
On Fri, Mar 20, 2020 at 3:19 AM Alan Modra <amodra@gmail.com> wrote:
>
> On Thu, Mar 19, 2020 at 09:42:15PM -0700, H.J. Lu wrote:
> > Here is the patch to remove the LTO wrapper code.
> >
> > OK for master?
>
> OK. Remove the configury HAVE_EXECUTABLE_SUFFIX and EXECUTABLE_SUFFIX
> too, please.
This is the patch I am checking in.
Thanks.
--
H.J.
[-- Attachment #2: 0001-plugin-Don-t-invoke-LTO-wrapper.patch --]
[-- Type: text/x-patch, Size: 20315 bytes --]
From 142bcde955fb8c16d7316eb917ff4c4d359ac143 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 19 Mar 2020 21:28:32 -0700
Subject: [PATCH] plugin: Don't invoke LTO-wrapper
Don't invoke LTO-wrapper since the LTO wrapper approach is not only
slow but also unreliable. For GCC 10 or newer, LDPT_ADD_SYMBOLS_V2
will be used.
bfd/
* configure.ac (HAVE_EXECUTABLE_SUFFIX): Removed.
(EXECUTABLE_SUFFIX): Likewise.
* config.in: Regenerated.
* configure: Likewise.
* plugin.c (bfd_plugin_close_and_cleanup): Defined as
_bfd_generic_close_and_cleanup.
(plugin_list_entry): Remove resolution_file, resolution_option,
real_bfd, real_nsyms, real_syms, lto_nsyms, lto_syms, gcc,
lto_wrapper, gcc_env and initialized,
(need_lto_wrapper_p): Removed.
(get_lto_wrapper): Likewise.
(setup_lto_wrapper_env): Likewise.
(register_all_symbols_read): Likewise.
(egister_cleanup): Likewise.
(get_symbols): Likewise.
(add_input_file): Likewise.
(bfd_plugin_set_program_name): Remove need_lto_wrapper.
(add_symbols): Updated.
(try_claim): Likewise.
(try_load_plugin): Likewise.
(bfd_plugin_canonicalize_symtab): Likewise.
* plugin.h (bfd_plugin_set_program_name): Remove int argument.
(plugin_data_struct): Remove real_bfd, real_nsyms and
real_syms.
binutils/
* ar.c (main): Update bfd_plugin_set_program_name call.
* nm.c (main): Likewise.
ld/
* testsuite/ld-plugin/lto.exp (lto_link_tests): Run PR ld/25355
test only for GCC 10 or newer.
---
bfd/config.in | 6 -
bfd/configure | 10 -
bfd/configure.ac | 6 -
bfd/plugin.c | 453 +--------------------------------
bfd/plugin.h | 5 +-
binutils/ar.c | 2 +-
binutils/nm.c | 2 +-
ld/testsuite/ld-plugin/lto.exp | 15 +-
8 files changed, 23 insertions(+), 476 deletions(-)
diff --git a/bfd/config.in b/bfd/config.in
index e1dc0f0c44..be572969fc 100644
--- a/bfd/config.in
+++ b/bfd/config.in
@@ -18,9 +18,6 @@
language is requested. */
#undef ENABLE_NLS
-/* Suffix used for executables, if any. */
-#undef EXECUTABLE_SUFFIX
-
/* Define to 1 if you have the <alloca.h> header file. */
#undef HAVE_ALLOCA_H
@@ -98,9 +95,6 @@
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
-/* Does the platform use an executable suffix? */
-#undef HAVE_EXECUTABLE_SUFFIX
-
/* Define to 1 if you have the `fcntl' function. */
#undef HAVE_FCNTL
diff --git a/bfd/configure b/bfd/configure
index 0fdd81d897..a000929b4e 100755
--- a/bfd/configure
+++ b/bfd/configure
@@ -12813,16 +12813,6 @@ fi
-if test -n "$EXEEXT"; then
-
-$as_echo "#define HAVE_EXECUTABLE_SUFFIX 1" >>confdefs.h
-
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define EXECUTABLE_SUFFIX "${EXEEXT}"
-_ACEOF
-
host64=false
target64=false
diff --git a/bfd/configure.ac b/bfd/configure.ac
index 96684dbf65..84d07688ad 100644
--- a/bfd/configure.ac
+++ b/bfd/configure.ac
@@ -157,12 +157,6 @@ AM_MAINTAINER_MODE
AM_CONDITIONAL(GENINSRC_NEVER, false)
AM_INSTALL_LIBBFD
AC_EXEEXT
-if test -n "$EXEEXT"; then
- AC_DEFINE(HAVE_EXECUTABLE_SUFFIX, 1,
- [Does the platform use an executable suffix?])
-fi
-AC_DEFINE_UNQUOTED(EXECUTABLE_SUFFIX, "${EXEEXT}",
- [Suffix used for executables, if any.])
host64=false
target64=false
diff --git a/bfd/plugin.c b/bfd/plugin.c
index 13549d24e7..48387fa53e 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -69,6 +69,7 @@ dlerror (void)
#endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */
+#define bfd_plugin_close_and_cleanup _bfd_generic_close_and_cleanup
#define bfd_plugin_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
#define bfd_plugin_new_section_hook _bfd_generic_new_section_hook
#define bfd_plugin_get_section_contents _bfd_generic_get_section_contents
@@ -129,196 +130,20 @@ struct plugin_list_entry
ld_plugin_claim_file_handler claim_file;
ld_plugin_all_symbols_read_handler all_symbols_read;
ld_plugin_all_symbols_read_handler cleanup_handler;
- char *resolution_file;
- char *resolution_option;
- bfd *real_bfd;
- long real_nsyms;
- asymbol **real_syms;
- int lto_nsyms;
- const struct ld_plugin_symbol *lto_syms;
bfd_boolean has_symbol_type;
struct plugin_list_entry *next;
/* These can be reused for all IR objects. */
const char *plugin_name;
- char *gcc;
- char *lto_wrapper;
- char *gcc_env;
- bfd_boolean initialized;
};
static const char *plugin_program_name;
-static int need_lto_wrapper_p;
void
-bfd_plugin_set_program_name (const char *program_name,
- int need_lto_wrapper)
+bfd_plugin_set_program_name (const char *program_name)
{
plugin_program_name = program_name;
- need_lto_wrapper_p = need_lto_wrapper;
-}
-
-/* Use GCC LTO wrapper to covert LTO IR object to the real object. */
-
-static bfd_boolean
-get_lto_wrapper (struct plugin_list_entry *plugin)
-{
- struct stat st;
- const char *real_name;
- const char *base_name;
- size_t length;
- const char *target_start = NULL;
- const char *target_end = NULL;
- size_t target_length = 0;
- char *gcc_name;
- char *wrapper_name;
- char *p;
- char dir_seperator = '\0';
- char *resolution_file;
-
- if (!need_lto_wrapper_p)
- return FALSE;
-
- if (plugin->initialized)
- {
- if (plugin->lto_wrapper)
- {
- resolution_file = make_temp_file (".res");
- if (resolution_file)
- {
- plugin->resolution_file = resolution_file;
- plugin->resolution_option = concat ("-fresolution=",
- resolution_file, NULL);
- return TRUE;
- }
- else
- {
- /* Something is wrong. Give up. */
- free (plugin->gcc);
- free (plugin->lto_wrapper);
- free (plugin->gcc_env);
- plugin->gcc = NULL;
- plugin->gcc_env = NULL;
- plugin->lto_wrapper = NULL;
- }
- }
-
- return FALSE;
- }
-
- plugin->initialized = TRUE;
-
- /* Check for PREFIX/libexec/gcc/TARGET/VERSION/liblto_plugin.so. */
- real_name = lrealpath (plugin->plugin_name);
- base_name = lbasename (real_name);
-
- /* The directory length in plugin pathname. */
- length = base_name - real_name;
-
- /* Skip if there is no PREFIX. */
- if (!length)
- return FALSE;
-
- p = (char *) real_name + length - 1;
- if (IS_DIR_SEPARATOR (*p))
- {
- int level = 0;
- for (; p != real_name; p--)
- if (IS_DIR_SEPARATOR (*p))
- {
- level++;
- if (level == 2)
- target_end = p;
- else if (level == 3)
- {
- target_start = p + 1;
- target_length = target_end - target_start;
- }
- else if (level == 5)
- {
- dir_seperator = *p;
- break;
- }
- }
- }
-
- /* Skip if there is no TARGET nor PREFIX. */
- if (!target_length || !dir_seperator)
- return FALSE;
-
-#ifdef HAVE_EXECUTABLE_SUFFIX
-# define GCC_EXECUTABLE "gcc" EXECUTABLE_SUFFIX
-# define LTO_WRAPPER_EXECUTABLE "lto-wrapper" EXECUTABLE_SUFFIX
-#else
-# define GCC_EXECUTABLE "gcc"
-# define LTO_WRAPPER_EXECUTABLE "lto-wrapper"
-#endif
- gcc_name = bfd_malloc (length + target_length
- + sizeof (GCC_EXECUTABLE));
- if (gcc_name == NULL)
- return FALSE;
- memcpy (gcc_name, real_name, length);
-
- /* Get PREFIX/bin/. */
- p += gcc_name - real_name;
- memcpy (p + 1, "bin", 3);
- p[4] = dir_seperator;
-
- /* Try PREFIX/bin/TARGET-gcc first. */
- memcpy (p + 5, target_start, target_length);
- p[5 + target_length] = '-';
- memcpy (p + 5 + target_length + 1, GCC_EXECUTABLE,
- sizeof (GCC_EXECUTABLE));
- if (stat (gcc_name, &st) != 0 || !S_ISREG (st.st_mode))
- {
- /* Then try PREFIX/bin/gcc. */
- memcpy (p + 5, GCC_EXECUTABLE, sizeof (GCC_EXECUTABLE));
- if (stat (gcc_name, &st) != 0 || !S_ISREG (st.st_mode))
- {
- free (gcc_name);
- return FALSE;
- }
- }
-
- /* lto-wrapper should be in the same directory with LTO plugin. */
- wrapper_name = bfd_malloc (length + sizeof (LTO_WRAPPER_EXECUTABLE));
- if (wrapper_name == NULL)
- {
- free (gcc_name);
- return FALSE;
- }
- memcpy (wrapper_name, real_name, length);
- memcpy (wrapper_name + length, LTO_WRAPPER_EXECUTABLE,
- sizeof (LTO_WRAPPER_EXECUTABLE));
- if (stat (wrapper_name, &st) == 0 && S_ISREG (st.st_mode))
- {
- resolution_file = make_temp_file (".res");
- if (resolution_file)
- {
- plugin->gcc = gcc_name;
- plugin->lto_wrapper = wrapper_name;
- plugin->gcc_env = concat ("COLLECT_GCC=", gcc_name, NULL);
- plugin->resolution_file = resolution_file;
- plugin->resolution_option = concat ("-fresolution=",
- resolution_file, NULL);
- return TRUE;
- }
- }
-
- free (gcc_name);
- free (wrapper_name);
- return FALSE;
-}
-
-/* Set environment variables for GCC LTO wrapper to covert LTO IR
- object to the real object. */
-
-static int
-setup_lto_wrapper_env (struct plugin_list_entry *plugin)
-{
- return (putenv (plugin->gcc_env)
- || putenv ("COLLECT_GCC_OPTIONS="));
}
static struct plugin_list_entry *plugin_list = NULL;
@@ -333,119 +158,6 @@ register_claim_file (ld_plugin_claim_file_handler handler)
return LDPS_OK;
}
-/* Register an all-symbols-read handler. */
-
-static enum ld_plugin_status
-register_all_symbols_read (ld_plugin_all_symbols_read_handler handler)
-{
- current_plugin->all_symbols_read = handler;
- return LDPS_OK;
-}
-
-/* Register a cleanup handler. */
-
-static enum ld_plugin_status
-register_cleanup (ld_plugin_all_symbols_read_handler handler)
-{
- current_plugin->cleanup_handler = handler;
- return LDPS_OK;
-}
-
-/* Get the symbol resolution info for a plugin-claimed input file. */
-
-static enum ld_plugin_status
-get_symbols (const void *handle ATTRIBUTE_UNUSED, int nsyms,
- struct ld_plugin_symbol *syms)
-{
- if (syms)
- {
- int n;
- for (n = 0; n < nsyms; n++)
- {
- switch (syms[n].def)
- {
- default:
- BFD_ASSERT (0);
- break;
- case LDPK_UNDEF:
- case LDPK_WEAKUNDEF:
- syms[n].resolution = LDPR_UNDEF;
- break;
- case LDPK_DEF:
- case LDPK_WEAKDEF:
- case LDPK_COMMON:
- /* Tell plugin that LTO symbol has references from regular
- object code. */
- syms[n].resolution = LDPR_PREVAILING_DEF;
- break;
- }
- }
- }
-
- return LDPS_OK;
-}
-
-/* Add a new (real) input file generated by a plugin. */
-
-static enum ld_plugin_status
-add_input_file (const char *pathname)
-{
- /* Get symbols from the real LTO object. */
- char **matching;
- long real_symsize;
- long real_nsyms;
- asymbol **real_syms;
- int lto_nsyms;
- bfd_boolean lto_symbol_found = FALSE;
- const struct ld_plugin_symbol *lto_syms;
- bfd *rbfd;
- int i, j;
-
- rbfd = bfd_openr (pathname, NULL);
- if (!bfd_check_format_matches (rbfd, bfd_object, &matching))
- BFD_ASSERT (0);
-
- real_symsize = bfd_get_symtab_upper_bound (rbfd);
- if (real_symsize < 0)
- BFD_ASSERT (0);
-
- real_syms = (asymbol **) bfd_malloc (real_symsize);
- if (real_syms)
- {
- real_nsyms = bfd_canonicalize_symtab (rbfd, real_syms);
- if (real_nsyms < 0)
- BFD_ASSERT (0);
-
- /* NB: LTO plugin may generate more than one real object from one
- LTO IR object. We use the one which contains LTO symbols. */
- lto_syms = current_plugin->lto_syms;
- lto_nsyms = current_plugin->lto_nsyms;
- for (i = 0; i < lto_nsyms; i++)
- for (j = 0; j < real_nsyms; j++)
- if (real_syms[j]->name
- && strcmp (lto_syms[i].name, real_syms[j]->name) == 0)
- {
- lto_symbol_found = TRUE;
- break;
- }
- }
-
- if (lto_symbol_found)
- {
- current_plugin->real_nsyms = real_nsyms;
- current_plugin->real_syms = real_syms;
- /* NB: We can't close RBFD which own the real symbol info. */
- current_plugin->real_bfd = rbfd;
- }
- else
- {
- bfd_close (rbfd);
- free (real_syms);
- }
-
- return LDPS_OK;
-}
-
static enum ld_plugin_status
add_symbols (void * handle,
int nsyms,
@@ -455,52 +167,16 @@ add_symbols (void * handle,
struct plugin_data_struct *plugin_data =
bfd_alloc (abfd, sizeof (plugin_data_struct));
- if (plugin_data)
- {
- struct ld_plugin_symbol *sym_info;
- char *strtab;
- size_t sym_info_size, name_length;
- int i;
-
- memset (plugin_data, 0, sizeof (*plugin_data));
-
- abfd->tdata.plugin_data = plugin_data;
-
- /* NB: LTO symbols are owned by LTO plugin. Create a copy so
- that we can use it in bfd_plugin_canonicalize_symtab. */
- sym_info_size = nsyms * sizeof (*syms);
+ if (!plugin_data)
+ return LDPS_ERR;
- /* Allocate a string table */
- for (i = 0; i < nsyms; i++)
- sym_info_size += strlen (syms[i].name) + 1;
-
- sym_info = bfd_alloc (abfd, sym_info_size);
- if (sym_info)
- {
- /* Copy symbol table. */
- memcpy (sym_info, syms, nsyms * sizeof (*syms));
-
- /* Copy symbol names in symbol table. */
- strtab = (char *) (sym_info + nsyms);
- for (i = 0; i < nsyms; i++)
- {
- name_length = strlen (syms[i].name);
- memcpy (strtab, syms[i].name, name_length + 1);
- sym_info[i].name = strtab;
- strtab += name_length + 1;
- }
-
- plugin_data->nsyms = nsyms;
- plugin_data->syms = sym_info;
-
- current_plugin->lto_nsyms = nsyms;
- current_plugin->lto_syms = sym_info;
- }
- }
+ plugin_data->nsyms = nsyms;
+ plugin_data->syms = syms;
if (nsyms != 0)
abfd->flags |= HAS_SYMS;
+ abfd->tdata.plugin_data = plugin_data;
return LDPS_OK;
}
@@ -567,42 +243,9 @@ try_claim (bfd *abfd)
&& current_plugin->claim_file)
{
current_plugin->claim_file (&file, &claimed);
- if (claimed)
- {
- if (current_plugin->all_symbols_read
- && !current_plugin->has_symbol_type)
- {
- struct plugin_data_struct *plugin_data
- = abfd->tdata.plugin_data;
- if (plugin_data)
- {
- /* Get real symbols from LTO wrapper. */
- current_plugin->all_symbols_read ();
-
- /* Copy real symbols to plugin_data. */
- plugin_data->real_bfd = current_plugin->real_bfd;
- plugin_data->real_nsyms = current_plugin->real_nsyms;
- plugin_data->real_syms = current_plugin->real_syms;
-
- /* Clean up LTO plugin. */
- if (current_plugin->cleanup_handler)
- current_plugin->cleanup_handler ();
- }
- }
- }
-
close (file.fd);
}
- if (current_plugin->lto_wrapper)
- {
- /* Clean up for LTO wrapper. NB: Resolution file and option
- have been created regardless if an IR object is claimed or
- not. */
- unlink (current_plugin->resolution_file);
- free (current_plugin->resolution_option);
- }
-
return claimed;
}
@@ -612,7 +255,7 @@ try_load_plugin (const char *pname,
bfd *abfd, bfd_boolean build_list_p)
{
void *plugin_handle;
- struct ld_plugin_tv tv[13];
+ struct ld_plugin_tv tv[5];
int i;
ld_plugin_onload onload;
enum ld_plugin_status status;
@@ -679,41 +322,6 @@ try_load_plugin (const char *pname,
tv[i].tv_tag = LDPT_ADD_SYMBOLS_V2;
tv[i].tv_u.tv_add_symbols = add_symbols_v2;
- if (get_lto_wrapper (plugin_list_iter))
- {
- ++i;
- tv[i].tv_tag = LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK;
- tv[i].tv_u.tv_register_all_symbols_read = register_all_symbols_read;
-
- ++i;
- tv[i].tv_tag = LDPT_REGISTER_CLEANUP_HOOK;
- tv[i].tv_u.tv_register_cleanup = register_cleanup;
-
- ++i;
- tv[i].tv_tag = LDPT_GET_SYMBOLS;
- tv[i].tv_u.tv_get_symbols = get_symbols;
-
- ++i;
- tv[i].tv_tag = LDPT_GET_SYMBOLS_V2;
- tv[i].tv_u.tv_get_symbols = get_symbols;
-
- ++i;
- tv[i].tv_tag = LDPT_OPTION;
- tv[i].tv_u.tv_string = plugin_list_iter->lto_wrapper;
-
- ++i;
- tv[i].tv_tag = LDPT_OPTION;
- tv[i].tv_u.tv_string = plugin_list_iter->resolution_option;
-
- ++i;
- tv[i].tv_tag = LDPT_LINKER_OUTPUT;
- tv[i].tv_u.tv_val = LDPO_EXEC;
-
- ++i;
- tv[i].tv_tag = LDPT_ADD_INPUT_FILE;
- tv[i].tv_u.tv_add_input_file = add_input_file;
- }
-
++i;
tv[i].tv_tag = LDPT_NULL;
tv[i].tv_u.tv_val = 0;
@@ -724,10 +332,6 @@ try_load_plugin (const char *pname,
if (status != LDPS_OK)
goto short_circuit;
- if (current_plugin->lto_wrapper
- && setup_lto_wrapper_env (current_plugin))
- goto short_circuit;
-
abfd->plugin_format = bfd_plugin_no;
if (!current_plugin->claim_file)
@@ -1002,15 +606,7 @@ bfd_plugin_canonicalize_symtab (bfd *abfd,
SEC_ALLOC);
static asection fake_common_section
= BFD_FAKE_SECTION (fake_common_section, NULL, "plug", 0, SEC_IS_COMMON);
- int i, j;
- long real_nsyms;
- asymbol **real_syms;
-
- real_syms = plugin_data->real_syms;
- if (real_syms)
- real_nsyms = plugin_data->real_nsyms;
- else
- real_nsyms = 0;
+ int i;
for (i = 0; i < nsyms; i++)
{
@@ -1050,18 +646,7 @@ bfd_plugin_canonicalize_symtab (bfd *abfd,
break;
}
else
- {
- s->section = &fake_text_section;
- if (real_nsyms)
- /* Use real LTO symbols if possible. */
- for (j = 0; j < real_nsyms; j++)
- if (real_syms[j]->name
- && strcmp (syms[i].name, real_syms[j]->name) == 0)
- {
- s->section = real_syms[j]->section;
- break;
- }
- }
+ s->section = &fake_text_section;
break;
default:
BFD_ASSERT (0);
@@ -1110,24 +695,6 @@ bfd_plugin_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
return 0;
}
-static bfd_boolean
-bfd_plugin_close_and_cleanup (bfd *abfd)
-{
- struct plugin_data_struct *plugin_data;
-
- if (abfd->format != bfd_archive
- && (plugin_data = abfd->tdata.plugin_data))
- {
- if (plugin_data->real_bfd)
- bfd_close (plugin_data->real_bfd);
-
- if (plugin_data->real_syms)
- free (plugin_data->real_syms);
- }
-
- return _bfd_generic_close_and_cleanup (abfd);
-}
-
const bfd_target plugin_vec =
{
"plugin", /* Name. */
diff --git a/bfd/plugin.h b/bfd/plugin.h
index af5d1f4cfa..075532dca0 100644
--- a/bfd/plugin.h
+++ b/bfd/plugin.h
@@ -21,7 +21,7 @@
#ifndef _PLUGIN_H_
#define _PLUGIN_H_
-void bfd_plugin_set_program_name (const char *, int);
+void bfd_plugin_set_program_name (const char *);
int bfd_plugin_open_input (bfd *, struct ld_plugin_input_file *);
void bfd_plugin_set_plugin (const char *);
bfd_boolean bfd_plugin_target_p (const bfd_target *);
@@ -33,9 +33,6 @@ typedef struct plugin_data_struct
{
int nsyms;
const struct ld_plugin_symbol *syms;
- bfd *real_bfd;
- long real_nsyms;
- asymbol **real_syms;
}
plugin_data_struct;
diff --git a/binutils/ar.c b/binutils/ar.c
index 35dd51e04a..1057db9980 100644
--- a/binutils/ar.c
+++ b/binutils/ar.c
@@ -725,7 +725,7 @@ main (int argc, char **argv)
xmalloc_set_program_name (program_name);
bfd_set_error_program_name (program_name);
#if BFD_SUPPORTS_PLUGINS
- bfd_plugin_set_program_name (program_name, 0);
+ bfd_plugin_set_program_name (program_name);
#endif
expandargv (&argc, &argv);
diff --git a/binutils/nm.c b/binutils/nm.c
index 5b386592a6..0ee3f88386 100644
--- a/binutils/nm.c
+++ b/binutils/nm.c
@@ -1701,7 +1701,7 @@ main (int argc, char **argv)
xmalloc_set_program_name (program_name);
bfd_set_error_program_name (program_name);
#if BFD_SUPPORTS_PLUGINS
- bfd_plugin_set_program_name (program_name, 1);
+ bfd_plugin_set_program_name (program_name);
#endif
START_PROGRESS (program_name, 0);
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 31da465d00..8ffc03f01a 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -234,13 +234,18 @@ set lto_link_tests [list \
[list "Build pr24406-2b.o" \
"" "-O2 -fno-lto" \
{pr24406-2b.c}] \
- [list "pr25355.o" \
- "" \
- "-flto -fno-common $lto_no_fat" \
- {pr25355.c} \
- [list [list "nm" "$plug_opt" "pr25355.d"]]] \
]
+if { [at_least_gcc_version 10 0] } {
+ set lto_link_tests [concat $lto_link_tests [list \
+ [list "pr25355.o" \
+ "" \
+ "-flto -fno-common $lto_no_fat" \
+ {pr25355.c} \
+ [list [list "nm" "$plug_opt" "pr25355.d"]]] \
+ ]]
+}
+
if { [at_least_gcc_version 4 7] } {
set lto_link_tests [concat $lto_link_tests [list \
[list "Compile PR ld/12942 (1)" \
--
2.25.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-20 7:59 ` Martin Liška
@ 2020-03-20 11:13 ` H.J. Lu
2020-03-20 14:08 ` Martin Liška
0 siblings, 1 reply; 17+ messages in thread
From: H.J. Lu @ 2020-03-20 11:13 UTC (permalink / raw)
To: Martin Liška; +Cc: Alan Modra, Binutils
On Fri, Mar 20, 2020 at 12:59 AM Martin Liška <mliska@suse.cz> wrote:
>
> On 3/20/20 5:42 AM, H.J. Lu via Binutils wrote:
> > On Thu, Mar 19, 2020 at 7:38 PM Alan Modra <amodra@gmail.com> wrote:
> >>
> >> On Thu, Mar 19, 2020 at 09:50:17AM -0700, H.J. Lu via Binutils wrote:
> >>> Since LTO plugin may generate more than one ltrans.o file from one input
> >>> IR object as LTO wrapper ignores -flto-partition=none:
> >>>
> >>> lto-wrapper.c:608:
> >>>
> >>> 604 /* Drop arguments that we want to take from the link line. */
> >>> 605 case OPT_flto_:
> >>> 606 case OPT_flto:
> >>> 607 case OPT_flto_partition_:
> >>> 608 continue;
> >>>
> >>> the LTO wrapper approach is not only slow but also unreliable. Since
> >>> the LTO plugin API has been extended to add LDPT_ADD_SYMBOLS_V2 with
> >>> symbol type and section kind, we can use LDPT_ADD_SYMBOLS_V2 to get
> >>> symbol type, instead of invoking the LTO wrapper.
> >>>
> >>> PR binutils/25640
> >>> * plugin.c (plugin_list_entry): Add has_symbol_type.
> >>> (add_symbols_v2): New function.
> >>> (bfd_plugin_open_input): Don't invoke LTO wrapper if LTO plugin
> >>> provides symbol type.
> >>> (try_load_plugin): Add LDPT_ADD_SYMBOLS_V2.
> >>> (bfd_plugin_canonicalize_symtab): Use LTO plugin symbol type if
> >>> available.
> >>
> >> OK. Are you going to remove the LTO wrapper code from binutils?
> >
> > Here is the patch to remove the LTO wrapper code.
> >
> > OK for master?
> >
> > Thanks.
> >
>
> Hello.
>
> Thank you very much for the patches. Can you please than backport this
> to 2.34 branch?
https://gitlab.com/x86-binutils/binutils-gdb/-/commits/users/hjl/plugin/2.34
--
H.J.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-20 11:13 ` H.J. Lu
@ 2020-03-20 14:08 ` Martin Liška
2020-03-20 14:23 ` H.J. Lu
0 siblings, 1 reply; 17+ messages in thread
From: Martin Liška @ 2020-03-20 14:08 UTC (permalink / raw)
To: H.J. Lu; +Cc: Alan Modra, Binutils
On 3/20/20 12:13 PM, H.J. Lu wrote:
> On Fri, Mar 20, 2020 at 12:59 AM Martin Liška <mliska@suse.cz> wrote:
>>
>> On 3/20/20 5:42 AM, H.J. Lu via Binutils wrote:
>>> On Thu, Mar 19, 2020 at 7:38 PM Alan Modra <amodra@gmail.com> wrote:
>>>>
>>>> On Thu, Mar 19, 2020 at 09:50:17AM -0700, H.J. Lu via Binutils wrote:
>>>>> Since LTO plugin may generate more than one ltrans.o file from one input
>>>>> IR object as LTO wrapper ignores -flto-partition=none:
>>>>>
>>>>> lto-wrapper.c:608:
>>>>>
>>>>> 604 /* Drop arguments that we want to take from the link line. */
>>>>> 605 case OPT_flto_:
>>>>> 606 case OPT_flto:
>>>>> 607 case OPT_flto_partition_:
>>>>> 608 continue;
>>>>>
>>>>> the LTO wrapper approach is not only slow but also unreliable. Since
>>>>> the LTO plugin API has been extended to add LDPT_ADD_SYMBOLS_V2 with
>>>>> symbol type and section kind, we can use LDPT_ADD_SYMBOLS_V2 to get
>>>>> symbol type, instead of invoking the LTO wrapper.
>>>>>
>>>>> PR binutils/25640
>>>>> * plugin.c (plugin_list_entry): Add has_symbol_type.
>>>>> (add_symbols_v2): New function.
>>>>> (bfd_plugin_open_input): Don't invoke LTO wrapper if LTO plugin
>>>>> provides symbol type.
>>>>> (try_load_plugin): Add LDPT_ADD_SYMBOLS_V2.
>>>>> (bfd_plugin_canonicalize_symtab): Use LTO plugin symbol type if
>>>>> available.
>>>>
>>>> OK. Are you going to remove the LTO wrapper code from binutils?
>>>
>>> Here is the patch to remove the LTO wrapper code.
>>>
>>> OK for master?
>>>
>>> Thanks.
>>>
>>
>> Hello.
>>
>> Thank you very much for the patches. Can you please than backport this
>> to 2.34 branch?
>
> https://gitlab.com/x86-binutils/binutils-gdb/-/commits/users/hjl/plugin/2.34
>
In openSUSE we package binutils only from official release branch. So I'm going
to wait until all patches land in it.
Martin
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-20 14:08 ` Martin Liška
@ 2020-03-20 14:23 ` H.J. Lu
2020-03-23 15:04 ` Martin Liška
0 siblings, 1 reply; 17+ messages in thread
From: H.J. Lu @ 2020-03-20 14:23 UTC (permalink / raw)
To: Martin Liška, Nick Clifton; +Cc: Alan Modra, Binutils
On Fri, Mar 20, 2020 at 7:08 AM Martin Liška <mliska@suse.cz> wrote:
>
> On 3/20/20 12:13 PM, H.J. Lu wrote:
> > On Fri, Mar 20, 2020 at 12:59 AM Martin Liška <mliska@suse.cz> wrote:
> >>
> >> On 3/20/20 5:42 AM, H.J. Lu via Binutils wrote:
> >>> On Thu, Mar 19, 2020 at 7:38 PM Alan Modra <amodra@gmail.com> wrote:
> >>>>
> >>>> On Thu, Mar 19, 2020 at 09:50:17AM -0700, H.J. Lu via Binutils wrote:
> >>>>> Since LTO plugin may generate more than one ltrans.o file from one input
> >>>>> IR object as LTO wrapper ignores -flto-partition=none:
> >>>>>
> >>>>> lto-wrapper.c:608:
> >>>>>
> >>>>> 604 /* Drop arguments that we want to take from the link line. */
> >>>>> 605 case OPT_flto_:
> >>>>> 606 case OPT_flto:
> >>>>> 607 case OPT_flto_partition_:
> >>>>> 608 continue;
> >>>>>
> >>>>> the LTO wrapper approach is not only slow but also unreliable. Since
> >>>>> the LTO plugin API has been extended to add LDPT_ADD_SYMBOLS_V2 with
> >>>>> symbol type and section kind, we can use LDPT_ADD_SYMBOLS_V2 to get
> >>>>> symbol type, instead of invoking the LTO wrapper.
> >>>>>
> >>>>> PR binutils/25640
> >>>>> * plugin.c (plugin_list_entry): Add has_symbol_type.
> >>>>> (add_symbols_v2): New function.
> >>>>> (bfd_plugin_open_input): Don't invoke LTO wrapper if LTO plugin
> >>>>> provides symbol type.
> >>>>> (try_load_plugin): Add LDPT_ADD_SYMBOLS_V2.
> >>>>> (bfd_plugin_canonicalize_symtab): Use LTO plugin symbol type if
> >>>>> available.
> >>>>
> >>>> OK. Are you going to remove the LTO wrapper code from binutils?
> >>>
> >>> Here is the patch to remove the LTO wrapper code.
> >>>
> >>> OK for master?
> >>>
> >>> Thanks.
> >>>
> >>
> >> Hello.
> >>
> >> Thank you very much for the patches. Can you please than backport this
> >> to 2.34 branch?
> >
> > https://gitlab.com/x86-binutils/binutils-gdb/-/commits/users/hjl/plugin/2.34
> >
>
> In openSUSE we package binutils only from official release branch. So I'm going
> to wait until all patches land in it.
Hi Nick,
Is that OK to backport these 4 patches to 2.34 branch?
--
H.J.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-20 14:23 ` H.J. Lu
@ 2020-03-23 15:04 ` Martin Liška
2020-03-24 10:47 ` Martin Liška
0 siblings, 1 reply; 17+ messages in thread
From: Martin Liška @ 2020-03-23 15:04 UTC (permalink / raw)
To: H.J. Lu, Nick Clifton; +Cc: Alan Modra, Binutils
On 3/20/20 3:23 PM, H.J. Lu wrote:
> Hi Nick,
>
> Is that OK to backport these 4 patches to 2.34 branch?
I would like to postpone it for a while as we're discussing a problem
seen today:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94249
https://gcc.gnu.org/pipermail/gcc-patches/2020-March/542497.html
Thanks,
Martin
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] plugin: Don't invoke LTO-wrapper
2020-03-23 15:04 ` Martin Liška
@ 2020-03-24 10:47 ` Martin Liška
2020-03-24 11:34 ` [PATCH] include: Sync plugin-api.h with GCC H.J. Lu
0 siblings, 1 reply; 17+ messages in thread
From: Martin Liška @ 2020-03-24 10:47 UTC (permalink / raw)
To: H.J. Lu, Nick Clifton; +Cc: Binutils
On 3/23/20 4:04 PM, Martin Liška wrote:
> On 3/20/20 3:23 PM, H.J. Lu wrote:
>> Hi Nick,
>>
>> Is that OK to backport these 4 patches to 2.34 branch?
>
> I would like to postpone it for a while as we're discussing a problem
> seen today:
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94249
> https://gcc.gnu.org/pipermail/gcc-patches/2020-March/542497.html
Ok, it's fixed now and I would like to ask H.J. to do one more sync
of plugin-api.h:
https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=906b3eb9df6c577d3f6e9c3ea5c9d7e4d1e90536
Martin
>
> Thanks,
> Martin
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH] include: Sync plugin-api.h with GCC
2020-03-24 10:47 ` Martin Liška
@ 2020-03-24 11:34 ` H.J. Lu
2020-03-25 13:36 ` Martin Liška
0 siblings, 1 reply; 17+ messages in thread
From: H.J. Lu @ 2020-03-24 11:34 UTC (permalink / raw)
To: Martin Liška; +Cc: Nick Clifton, Binutils
[-- Attachment #1: Type: text/plain, Size: 743 bytes --]
On Tue, Mar 24, 2020 at 3:47 AM Martin Liška <mliska@suse.cz> wrote:
>
> On 3/23/20 4:04 PM, Martin Liška wrote:
> > On 3/20/20 3:23 PM, H.J. Lu wrote:
> >> Hi Nick,
> >>
> >> Is that OK to backport these 4 patches to 2.34 branch?
> >
> > I would like to postpone it for a while as we're discussing a problem
> > seen today:
> >
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94249
> > https://gcc.gnu.org/pipermail/gcc-patches/2020-March/542497.html
>
> Ok, it's fixed now and I would like to ask H.J. to do one more sync
> of plugin-api.h:
> https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=906b3eb9df6c577d3f6e9c3ea5c9d7e4d1e90536
>
I am checking in this and will backport this patch to my 2.34
branch.
--
H.J.
[-- Attachment #2: 0001-include-Sync-plugin-api.h-with-GCC.patch --]
[-- Type: text/x-patch, Size: 3307 bytes --]
From dfb68cc35803369cbd163c2ebc07fb27e81d9950 Mon Sep 17 00:00:00 2001
From: Martin Liska <mliska@suse.cz>
Date: Tue, 24 Mar 2020 11:40:10 +0100
Subject: [PATCH] include: Sync plugin-api.h with GCC
Improve endianess detection.
PR lto/94249
* plugin-api.h: Add more robust endianess detection.
---
include/ChangeLog | 5 ++++
include/plugin-api.h | 65 ++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/include/ChangeLog b/include/ChangeLog
index 357124762e..3d26a570ca 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2020-03-24 Martin Liska <mliska@suse.cz>
+
+ PR lto/94249
+ * plugin-api.h: Add more robust endianess detection.
+
2020-03-21 Martin Liska <mliska@suse.cz>
* plugin-api.h (enum ld_plugin_symbol_type): Remove
diff --git a/include/plugin-api.h b/include/plugin-api.h
index 673f136ce6..864d2bf91a 100644
--- a/include/plugin-api.h
+++ b/include/plugin-api.h
@@ -37,6 +37,60 @@
#error cannot find uint64_t type
#endif
+/* Detect endianess based on __BYTE_ORDER__ macro. */
+#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
+ defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_PDP_ENDIAN__)
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#define PLUGIN_LITTLE_ENDIAN 1
+#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#define PLUGIN_BIG_ENDIAN 1
+#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
+#define PLUGIN_PDP_ENDIAN 1
+#endif
+#else
+/* Older GCC releases (<4.6.0) can make detection from glibc macros. */
+#if defined(__GLIBC__) || defined(__GNU_LIBRARY__) || defined(__ANDROID__)
+#include <endian.h>
+#ifdef _BYTE_ORDER
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define PLUGIN_LITTLE_ENDIAN 1
+#elif __BYTE_ORDER == __BIG_ENDIAN
+#define PLUGIN_BIG_ENDIAN 1
+#endif
+#endif
+#endif
+/* Include all necessary header files based on target. */
+#if defined(__SVR4) && defined(__sun)
+#include <sys/byteorder.h>
+#endif
+#if defined(__FreeBSD__) || defined(__NetBSD__) || \
+ defined(__DragonFly__) || defined(__minix)
+#include <sys/endian.h>
+#endif
+#if defined(__OpenBSD__)
+#include <machine/endian.h>
+#endif
+/* Detect endianess based on _BYTE_ORDER. */
+#ifdef _BYTE_ORDER
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#define PLUGIN_LITTLE_ENDIAN 1
+#elif _BYTE_ORDER == _BIG_ENDIAN
+#define PLUGIN_BIG_ENDIAN 1
+#endif
+#endif
+/* Detect based on _WIN32. */
+#if defined(_WIN32)
+#define PLUGIN_LITTLE_ENDIAN 1
+#endif
+/* Detect based on __BIG_ENDIAN__ and __LITTLE_ENDIAN__ */
+#ifdef __LITTLE_ENDIAN__
+#define PLUGIN_LITTLE_ENDIAN 1
+#endif
+#ifdef __BIG_ENDIAN__
+#define PLUGIN_BIG_ENDIAN 1
+#endif
+#endif
+
#ifdef __cplusplus
extern "C"
{
@@ -89,16 +143,23 @@ struct ld_plugin_symbol
char *version;
/* This is for compatibility with older ABIs. The older ABI defined
only 'def' field. */
-#ifdef __BIG_ENDIAN__
+#if PLUGIN_BIG_ENDIAN == 1
char unused;
char section_kind;
char symbol_type;
char def;
-#else
+#elif PLUGIN_LITTLE_ENDIAN == 1
char def;
char symbol_type;
char section_kind;
char unused;
+#elif PLUGIN_PDP_ENDIAN == 1
+ char symbol_type;
+ char def;
+ char unused;
+ char section_kind;
+#else
+#error "Could not detect architecture endianess"
#endif
int visibility;
uint64_t size;
--
2.25.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] include: Sync plugin-api.h with GCC
2020-03-24 11:34 ` [PATCH] include: Sync plugin-api.h with GCC H.J. Lu
@ 2020-03-25 13:36 ` Martin Liška
2020-03-25 13:38 ` Martin Liška
2020-03-25 13:41 ` Nick Clifton
0 siblings, 2 replies; 17+ messages in thread
From: Martin Liška @ 2020-03-25 13:36 UTC (permalink / raw)
To: H.J. Lu; +Cc: Nick Clifton, Binutils
On 3/24/20 12:34 PM, H.J. Lu wrote:
> On Tue, Mar 24, 2020 at 3:47 AM Martin Liška <mliska@suse.cz> wrote:
>>
>> On 3/23/20 4:04 PM, Martin Liška wrote:
>>> On 3/20/20 3:23 PM, H.J. Lu wrote:
>>>> Hi Nick,
>>>>
>>>> Is that OK to backport these 4 patches to 2.34 branch?
>>>
>>> I would like to postpone it for a while as we're discussing a problem
>>> seen today:
>>>
>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94249
>>> https://gcc.gnu.org/pipermail/gcc-patches/2020-March/542497.html
>>
>> Ok, it's fixed now and I would like to ask H.J. to do one more sync
>> of plugin-api.h:
>> https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=906b3eb9df6c577d3f6e9c3ea5c9d7e4d1e90536
>>
>
> I am checking in this and will backport this patch to my 2.34
> branch.
>
@Nick: Can we please backport that to the official 2.34 branch?
Thanks,
Martin
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] include: Sync plugin-api.h with GCC
2020-03-25 13:36 ` Martin Liška
@ 2020-03-25 13:38 ` Martin Liška
2020-03-25 13:41 ` Nick Clifton
1 sibling, 0 replies; 17+ messages in thread
From: Martin Liška @ 2020-03-25 13:38 UTC (permalink / raw)
To: H.J. Lu; +Cc: Binutils, Nick Clifton
Adding @Nick to CC.
> @Nick: Can we please backport that to the official 2.34 branch?
>
> Thanks,
> Martin
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] include: Sync plugin-api.h with GCC
2020-03-25 13:36 ` Martin Liška
2020-03-25 13:38 ` Martin Liška
@ 2020-03-25 13:41 ` Nick Clifton
2020-03-25 13:42 ` H.J. Lu
1 sibling, 1 reply; 17+ messages in thread
From: Nick Clifton @ 2020-03-25 13:41 UTC (permalink / raw)
To: Martin Liška, H.J. Lu; +Cc: Binutils
Hi Martin,
> @Nick: Can we please backport that to the official 2.34 branch?
Of course, please do. Or do you want me to do the backporting ?
Cheers
Nick
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] include: Sync plugin-api.h with GCC
2020-03-25 13:41 ` Nick Clifton
@ 2020-03-25 13:42 ` H.J. Lu
2020-03-25 14:10 ` H.J. Lu
0 siblings, 1 reply; 17+ messages in thread
From: H.J. Lu @ 2020-03-25 13:42 UTC (permalink / raw)
To: Nick Clifton; +Cc: Martin Liška, Binutils
On Wed, Mar 25, 2020 at 6:41 AM Nick Clifton <nickc@redhat.com> wrote:
>
> Hi Martin,
>
> > @Nick: Can we please backport that to the official 2.34 branch?
>
> Of course, please do. Or do you want me to do the backporting ?
>
I will do it.
Thanks.
--
H.J.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] include: Sync plugin-api.h with GCC
2020-03-25 13:42 ` H.J. Lu
@ 2020-03-25 14:10 ` H.J. Lu
0 siblings, 0 replies; 17+ messages in thread
From: H.J. Lu @ 2020-03-25 14:10 UTC (permalink / raw)
To: Nick Clifton; +Cc: Martin Liška, Binutils
On Wed, Mar 25, 2020 at 6:42 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Wed, Mar 25, 2020 at 6:41 AM Nick Clifton <nickc@redhat.com> wrote:
> >
> > Hi Martin,
> >
> > > @Nick: Can we please backport that to the official 2.34 branch?
> >
> > Of course, please do. Or do you want me to do the backporting ?
> >
>
> I will do it.
>
Done. Tested with GCC 9 and GCC 10.
--
H.J.
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2020-03-25 14:11 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-19 16:50 [PATCH] plugin: Use LDPT_ADD_SYMBOLS_V2 to get symbol type H.J. Lu
2020-03-20 2:38 ` Alan Modra
2020-03-20 4:42 ` [PATCH] plugin: Don't invoke LTO-wrapper H.J. Lu
2020-03-20 7:59 ` Martin Liška
2020-03-20 11:13 ` H.J. Lu
2020-03-20 14:08 ` Martin Liška
2020-03-20 14:23 ` H.J. Lu
2020-03-23 15:04 ` Martin Liška
2020-03-24 10:47 ` Martin Liška
2020-03-24 11:34 ` [PATCH] include: Sync plugin-api.h with GCC H.J. Lu
2020-03-25 13:36 ` Martin Liška
2020-03-25 13:38 ` Martin Liška
2020-03-25 13:41 ` Nick Clifton
2020-03-25 13:42 ` H.J. Lu
2020-03-25 14:10 ` H.J. Lu
2020-03-20 10:19 ` [PATCH] plugin: Don't invoke LTO-wrapper Alan Modra
2020-03-20 10:52 ` H.J. Lu
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).