public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [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).