From fc3c534364ca6d6de4f0dbcaf347ec85f5e2f8ff Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 9 Oct 2017 22:03:42 -0700 Subject: 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. --- bfd/ChangeLog | 9 +++++++++ bfd/elfnn-riscv.c | 16 +++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e6bd06f4f29..f98881266eb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2017-10-09 H.J. Lu + + 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 * elf64-ppc.c (ppc64_elf_before_check_relocs): Set sec_type for diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index b4d7b9b0045..52c461d20a8 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -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++) -- cgit v1.2.1