diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-03-02 05:05:42 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-03-02 05:07:50 -0800 |
commit | 523f4c9234439fd6ccc0dd2c3b387331dd64c54b (patch) | |
tree | b05e390abf459b9a34281e09c364b7e5f229d26c /ld/emultempl/mmo.em | |
parent | Regenerate rl78 opcodes file (diff) | |
download | binutils-gdb-523f4c9234439fd6ccc0dd2c3b387331dd64c54b.tar.gz binutils-gdb-523f4c9234439fd6ccc0dd2c3b387331dd64c54b.tar.bz2 binutils-gdb-523f4c9234439fd6ccc0dd2c3b387331dd64c54b.zip |
Speedup mmo and pe orphan placement for relocatable link
Since there is no need to place output sections in specific order for
relocatable link, we can skip merging flags of other input sections.
PR ld/19739
* emultempl/mmo.em (mmo_place_orphan): Don't merge flags of other
input sections for relocatable link.
* emultempl/pe.em (gld_${EMULATION_NAME}_place_orphan): Likewise.
* emultempl/pep.em (gld_${EMULATION_NAME}_place_orphan): Likewise.
Diffstat (limited to 'ld/emultempl/mmo.em')
-rw-r--r-- | ld/emultempl/mmo.em | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/ld/emultempl/mmo.em b/ld/emultempl/mmo.em index c2dcc76ead3..b5a7aa02439 100644 --- a/ld/emultempl/mmo.em +++ b/ld/emultempl/mmo.em @@ -107,22 +107,28 @@ mmo_place_orphan (asection *s, return os; } + flags = s->flags; + if (!bfd_link_relocatable (&link_info)) + { + nexts = s; + while ((nexts = bfd_get_next_section_by_name (nexts->owner, nexts)) + != NULL) + if (nexts->output_section == NULL + && (nexts->flags & SEC_EXCLUDE) == 0 + && ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0 + && (nexts->owner->flags & DYNAMIC) == 0 + && nexts->owner->usrdata != NULL + && !(((lang_input_statement_type *) nexts->owner->usrdata) + ->flags.just_syms)) + flags = (((flags ^ SEC_READONLY) | (nexts->flags ^ SEC_READONLY)) + ^ SEC_READONLY); + } + /* Check for matching section type flags for sections we care about. A section without contents can have SEC_LOAD == 0, but we still want it attached to a sane section so the symbols appear as expected. */ - flags = s->flags; - nexts = s; - while ((nexts = bfd_get_next_section_by_name (nexts->owner, nexts)) != NULL) - if (nexts->output_section == NULL - && (nexts->flags & SEC_EXCLUDE) == 0 - && ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0 - && (nexts->owner->flags & DYNAMIC) == 0 - && nexts->owner->usrdata != NULL - && !(((lang_input_statement_type *) nexts->owner->usrdata) - ->flags.just_syms)) - flags = (((flags ^ SEC_READONLY) | (nexts->flags ^ SEC_READONLY)) - ^ SEC_READONLY); + if ((flags & (SEC_ALLOC | SEC_READONLY)) != SEC_READONLY) for (i = 0; i < sizeof (holds) / sizeof (holds[0]); i++) if ((flags & holds[i].nonzero_flags) != 0) |