riscv: Cache the max alignment of output sections
Cache the max alignment of output sections instead of scanning all output sections for each input section, which can take a very long time if there are millions of input/output sections. PR ld/22274 * elfnn-riscv.c (riscv_elf_link_hash_table): Add max_alignment. (riscv_elf_link_hash_table_create): Initialize max_alignment to (bfd_vma) -1. (_bfd_riscv_relax_section): Cache the max alignment of output sections if possible.
This commit is contained in:
parent
b9399fcf4e
commit
fc3c534364
@ -1,3 +1,12 @@
|
||||
2017-10-09 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/22274
|
||||
* elfnn-riscv.c (riscv_elf_link_hash_table): Add max_alignment.
|
||||
(riscv_elf_link_hash_table_create): Initialize max_alignment to
|
||||
(bfd_vma) -1.
|
||||
(_bfd_riscv_relax_section): Cache the max alignment of output
|
||||
sections if possible.
|
||||
|
||||
2017-10-10 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf64-ppc.c (ppc64_elf_before_check_relocs): Set sec_type for
|
||||
|
@ -127,6 +127,9 @@ struct riscv_elf_link_hash_table
|
||||
|
||||
/* Small local sym to section mapping cache. */
|
||||
struct sym_cache sym_cache;
|
||||
|
||||
/* The max alignment of output sections. */
|
||||
bfd_vma max_alignment;
|
||||
};
|
||||
|
||||
|
||||
@ -274,6 +277,7 @@ riscv_elf_link_hash_table_create (bfd *abfd)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret->max_alignment = (bfd_vma) -1;
|
||||
return &ret->elf.root;
|
||||
}
|
||||
|
||||
@ -3070,7 +3074,17 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec,
|
||||
info->keep_memory)))
|
||||
goto fail;
|
||||
|
||||
max_alignment = _bfd_riscv_get_max_alignment (sec);
|
||||
if (htab)
|
||||
{
|
||||
max_alignment = htab->max_alignment;
|
||||
if (max_alignment == (bfd_vma) -1)
|
||||
{
|
||||
max_alignment = _bfd_riscv_get_max_alignment (sec);
|
||||
htab->max_alignment = max_alignment;
|
||||
}
|
||||
}
|
||||
else
|
||||
max_alignment = _bfd_riscv_get_max_alignment (sec);
|
||||
|
||||
/* Examine and consider relaxing each reloc. */
|
||||
for (i = 0; i < sec->reloc_count; i++)
|
||||
|
Loading…
Reference in New Issue
Block a user