riscv: Cache the max alignment of output sections
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 10 Oct 2017 05:03:42 +0000 (22:03 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 10 Oct 2017 05:04:00 +0000 (22:04 -0700)
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
bfd/elfnn-riscv.c

index e6bd06f..f988812 100644 (file)
@@ -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
index b4d7b9b..52c461d 100644 (file)
@@ -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++)