aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog18
-rw-r--r--ld/emultempl/aarch64elf.em4
-rw-r--r--ld/emultempl/aix.em2
-rw-r--r--ld/emultempl/armelf.em4
-rw-r--r--ld/emultempl/hppaelf.em4
-rw-r--r--ld/emultempl/m68hc1xelf.em4
-rw-r--r--ld/emultempl/metagelf.em4
-rw-r--r--ld/emultempl/mipself.em5
-rw-r--r--ld/emultempl/ppc64elf.em4
-rw-r--r--ld/emultempl/spuelf.em5
-rw-r--r--ld/ldlang.c12
-rw-r--r--ld/ldlang.h2
12 files changed, 43 insertions, 25 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index ee26f64..a022cba 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,21 @@
+2014-01-20 Guy Martin <gmsoft@tuxicoman.be>
+ Alan Modra <amodra@gmail.com>
+
+ * 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.
+
2014-01-17 Alan Modra <amodra@gmail.com>
* genscripts.sh (COMPILE_IN): Don't set if already set.
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