diff options
author | Guy Martin <gmsoft@tuxicoman.be> | 2014-01-20 14:16:16 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2014-01-20 14:21:36 +1030 |
commit | 24ef1aa73ed312282bd1a755b3ac94681c9f1544 (patch) | |
tree | d16b770019d07c69d750fe0f8252cf00db9c3157 /ld/ldlang.c | |
parent | d7c85de1c3d15d7abf68212e4b18cd140dd3f397 (diff) | |
download | gdb-24ef1aa73ed312282bd1a755b3ac94681c9f1544.zip gdb-24ef1aa73ed312282bd1a755b3ac94681c9f1544.tar.gz gdb-24ef1aa73ed312282bd1a755b3ac94681c9f1544.tar.bz2 |
Fix duplicate output section statement lookup
Tie output section statements to their associated output section via
output section userdata. This allows us to avoid hash lookups which
are slower and fail when multiple output sections have the same name.
* 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.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r-- | ld/ldlang.c | 12 |
1 files changed, 12 insertions, 0 deletions
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) |