This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix duplicate output section statement lookup


On Fri, Jan 17, 2014 at 10:06:47AM +0100, Guy Martin wrote:
> On 2014-01-17 07:33, Alan Modra wrote:
> >
> >This looks OK, except for the spuelf.em patch.
> >
> >>   if (o != NULL)
> >>-    output_name = o->name;
> >>-  os = lang_output_section_find (output_name);
> >>+  	os = lang_output_section_get (o);
> >
> >Please keep the lookup when o is NULL.  OK with that fixed.
> 
> Thanks for reviewing Alan, here is the fixed patch.

I didn't mean to omit the spuelf.em change entirely.  Also, I expect
you didn't know to configure with --enable-targets=all (and
--enable-64-bit-bfd if on a 32-bit host), which meant most of your
patch wasn't even compiled before you submitted it.  Now, what could
possibly go wrong with a simple patch like this?  :)  Another thing,
please configure your email app to not wrap lines or mess with
whitespace, both of which destroy inline patches.

This is what I've committed.

	* ldlang.h (lang_output_section_get): Define.
	* ldlang.c (lang_output_section_get): Likewise.
	(init_os): Set the output_section userdata to the output
	section statement.
	* emultempl/hppaelf.em: Use lang_output_section_get instead of
	lang_output_section_find where applicable.
	* emultempl/aarch64elf.em: Likewise.
	* emultempl/aix.em: Likewise.
	* emultempl/armelf.em: Likewise.
	* emultempl/m68hc1xelf.em: Likewise.
	* emultempl/metagelf.em: Likewise.
	* emultempl/mipself.em: Likewise.
	* emultempl/ppc64elf.em: Likewise.
	* emultempl/spuelf.em: Likewise.

diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em
index b3279bf..b631feb 100644
--- a/ld/emultempl/aarch64elf.em
+++ b/ld/emultempl/aarch64elf.em
@@ -159,7 +159,6 @@ elf${ELFSIZE}_aarch64_add_stub_section (const char *stub_sec_name,
   asection *stub_sec;
   flagword flags;
   asection *output_section;
-  const char *secname;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -173,8 +172,7 @@ elf${ELFSIZE}_aarch64_add_stub_section (const char *stub_sec_name,
   bfd_set_section_alignment (stub_file->the_bfd, stub_sec, 3);
 
   output_section = input_section->output_section;
-  secname = bfd_get_section_name (output_section->owner, output_section);
-  os = lang_output_section_find (secname);
+  os = lang_output_section_get (output_section);
 
   info.input_section = input_section;
   lang_list_init (&info.add);
diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em
index 084bb66..d080133 100644
--- a/ld/emultempl/aix.em
+++ b/ld/emultempl/aix.em
@@ -854,7 +854,7 @@ gld${EMULATION_NAME}_before_allocation (void)
       /* Remove this section from the list of the output section.
 	 This assumes we know what the script looks like.  */
       is = NULL;
-      os = lang_output_section_find (sec->output_section->name);
+      os = lang_output_section_get (sec->output_section);
       if (os == NULL)
 	einfo ("%P%F: can't find output section %s\n",
 	       sec->output_section->name);
diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em
index eee6af1..85e924f 100644
--- a/ld/emultempl/armelf.em
+++ b/ld/emultempl/armelf.em
@@ -189,7 +189,6 @@ elf32_arm_add_stub_section (const char * stub_sec_name,
   asection *stub_sec;
   flagword flags;
   asection *output_section;
-  const char *secname;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -203,8 +202,7 @@ elf32_arm_add_stub_section (const char * stub_sec_name,
   bfd_set_section_alignment (stub_file->the_bfd, stub_sec, alignment_power);
 
   output_section = input_section->output_section;
-  secname = bfd_get_section_name (output_section->owner, output_section);
-  os = lang_output_section_find (secname);
+  os = lang_output_section_get (output_section);
 
   info.input_section = input_section;
   lang_list_init (&info.add);
diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em
index 65c1ea5..1b7e384 100644
--- a/ld/emultempl/hppaelf.em
+++ b/ld/emultempl/hppaelf.em
@@ -178,7 +178,6 @@ hppaelf_add_stub_section (const char *stub_sec_name, asection *input_section)
   asection *stub_sec;
   flagword flags;
   asection *output_section;
-  const char *secname;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -190,8 +189,7 @@ hppaelf_add_stub_section (const char *stub_sec_name, asection *input_section)
     goto err_ret;
 
   output_section = input_section->output_section;
-  secname = bfd_get_section_name (output_section->owner, output_section);
-  os = lang_output_section_find (secname);
+  os = lang_output_section_get (output_section);
 
   info.input_section = input_section;
   lang_list_init (&info.add);
diff --git a/ld/emultempl/m68hc1xelf.em b/ld/emultempl/m68hc1xelf.em
index 594b193..4e1360f 100644
--- a/ld/emultempl/m68hc1xelf.em
+++ b/ld/emultempl/m68hc1xelf.em
@@ -250,7 +250,6 @@ m68hc11elf_add_stub_section (const char *stub_sec_name,
   asection *stub_sec;
   flagword flags;
   asection *output_section;
-  const char *secname;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -262,8 +261,7 @@ m68hc11elf_add_stub_section (const char *stub_sec_name,
     goto err_ret;
 
   output_section = tramp_section->output_section;
-  secname = bfd_get_section_name (output_section->owner, output_section);
-  os = lang_output_section_find (secname);
+  os = lang_output_section_get (output_section);
 
   /* Try to put the new section at the same place as an existing
      .tramp section.  Such .tramp section exists in most cases and
diff --git a/ld/emultempl/metagelf.em b/ld/emultempl/metagelf.em
index 21e3e94..7760f81 100644
--- a/ld/emultempl/metagelf.em
+++ b/ld/emultempl/metagelf.em
@@ -154,7 +154,6 @@ metagelf_add_stub_section (const char *stub_sec_name, asection *input_section)
   asection *stub_sec;
   flagword flags;
   asection *output_section;
-  const char *secname;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -166,8 +165,7 @@ metagelf_add_stub_section (const char *stub_sec_name, asection *input_section)
     goto err_ret;
 
   output_section = input_section->output_section;
-  secname = bfd_get_section_name (output_section->owner, output_section);
-  os = lang_output_section_find (secname);
+  os = lang_output_section_get (output_section);
 
   info.input_section = input_section;
   lang_list_init (&info.add);
diff --git a/ld/emultempl/mipself.em b/ld/emultempl/mipself.em
index 3c6ec9f..02043b7 100644
--- a/ld/emultempl/mipself.em
+++ b/ld/emultempl/mipself.em
@@ -136,7 +136,6 @@ mips_add_stub_section (const char *stub_sec_name, asection *input_section,
 {
   asection *stub_sec;
   flagword flags;
-  const char *secname;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -176,9 +175,7 @@ mips_add_stub_section (const char *stub_sec_name, asection *input_section,
   if (!bfd_set_section_flags (stub_bfd, stub_sec, flags))
     goto err_ret;
 
-  /* Create an output section statement.  */
-  secname = bfd_get_section_name (output_section->owner, output_section);
-  os = lang_output_section_find (secname);
+  os = lang_output_section_get (output_section);
 
   /* Initialize a statement list that contains only the new statement.  */
   lang_list_init (&info.add);
diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em
index f2085d7..c126297 100644
--- a/ld/emultempl/ppc64elf.em
+++ b/ld/emultempl/ppc64elf.em
@@ -378,7 +378,6 @@ ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
   asection *stub_sec;
   flagword flags;
   asection *output_section;
-  const char *secname;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -392,8 +391,7 @@ ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
     goto err_ret;
 
   output_section = input_section->output_section;
-  secname = bfd_get_section_name (output_section->owner, output_section);
-  os = lang_output_section_find (secname);
+  os = lang_output_section_get (output_section);
 
   info.input_section = input_section;
   lang_list_init (&info.add);
diff --git a/ld/emultempl/spuelf.em b/ld/emultempl/spuelf.em
index e14fa26..8feb8bf 100644
--- a/ld/emultempl/spuelf.em
+++ b/ld/emultempl/spuelf.em
@@ -138,8 +138,9 @@ spu_place_special_section (asection *s, asection *o, const char *output_name)
   lang_output_section_statement_type *os;
 
   if (o != NULL)
-    output_name = o->name;
-  os = lang_output_section_find (output_name);
+    os = lang_output_section_get (o);
+  else
+    os = lang_output_section_find (output_name);
   if (os == NULL)
     {
       os = gld${EMULATION_NAME}_place_orphan (s, output_name, 0);
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 2a6c4c5..f6d713c 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -1376,6 +1376,14 @@ lang_memory_default (asection * section)
   return lang_memory_region_lookup (DEFAULT_MEMORY_REGION, FALSE);
 }
 
+/* Get the output section statement directly from the userdata.  */
+
+lang_output_section_statement_type *
+lang_output_section_get (const asection *output_section)
+{
+  return get_userdata (output_section);
+}
+
 /* Find or create an output_section_statement with the given NAME.
    If CONSTRAINT is non-zero match one with that constraint, otherwise
    match any non-negative constraint.  If CREATE, always make a
@@ -2104,6 +2112,10 @@ init_os (lang_output_section_statement_type *s, flagword flags)
   s->bfd_section->output_section = s->bfd_section;
   s->bfd_section->output_offset = 0;
 
+  /* Set the userdata of the output section to the output section
+     statement to avoid lookup.  */
+  get_userdata (s->bfd_section) = s;
+
   /* If there is a base address, make sure that any sections it might
      mention are initialized.  */
   if (s->addr_tree != NULL)
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 6eb75dc..e91153c 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -584,6 +584,8 @@ extern lang_input_statement_type *lang_add_input_file
   (const char *, lang_input_file_enum_type, const char *);
 extern void lang_add_keepsyms_file
   (const char *);
+extern lang_output_section_statement_type *lang_output_section_get
+  (const asection *);
 extern lang_output_section_statement_type *lang_output_section_statement_lookup
   (const char *, int, bfd_boolean);
 extern lang_output_section_statement_type *next_matching_output_section_statement


-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]