aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfnn-riscv.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-10-09 22:03:42 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-10-09 22:04:00 -0700
commitfc3c534364ca6d6de4f0dbcaf347ec85f5e2f8ff (patch)
tree6c238d0947b088bfc688ed2be95db1314a296232 /bfd/elfnn-riscv.c
parentb9399fcf4ec90d898a610e39bd9141e85c008fbb (diff)
downloadgdb-fc3c534364ca6d6de4f0dbcaf347ec85f5e2f8ff.zip
gdb-fc3c534364ca6d6de4f0dbcaf347ec85f5e2f8ff.tar.gz
gdb-fc3c534364ca6d6de4f0dbcaf347ec85f5e2f8ff.tar.bz2
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.
Diffstat (limited to 'bfd/elfnn-riscv.c')
-rw-r--r--bfd/elfnn-riscv.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index b4d7b9b..52c461d 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++)