[binutils-gdb] loongarch ld testsuite xpasses

Alan Modra amodra@sourceware.org
Wed Aug 7 01:02:12 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b93dcd1cdd193f119d86d9a9ee84b8dabdef28c5

commit b93dcd1cdd193f119d86d9a9ee84b8dabdef28c5
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Aug 7 07:56:33 2024 +0930

    loongarch ld testsuite xpasses
    
    Some tests started passing with commit 3a83f0342e54.  However,
    supporting a changed ld output format is not so simple, and the change
    to the loongarch_elf_hash_table macro needs further changes to the
    rest of the code.  It is true that some uses of
    loongarch_elf_hash_table do not need to check the type of the hash
    table, but others like loongarch_elf_relax_section do need to check.
    bfd_relax_section is called in lang_size_sections using the input bfd,
    not the output bfd.  If the input bfd may be of different type to the
    output, then the hash table type must be checked before accessing
    elements of the hash table.  This patch corrects
    loongarch_elf_relax_section.  I haven't checked all the uses of the
    hash table throughout the loongarch backend.
    
    bfd/
            * elfnn-loongarch.c (loongarch_elf_relax_section): Don't relax
            unless the hash table is loongarch_elf_link_hash_table.
            Move variable declarations.  Formatting.
    ld/
            * testsuite/ld-elf/pr21884.d: Don't xfail loongarach.
            * testsuite/ld-unique/pr21529.d: Likewise.

Diff:
---
 bfd/elfnn-loongarch.c            | 18 ++++++++++--------
 ld/testsuite/ld-elf/pr21884.d    |  2 +-
 ld/testsuite/ld-unique/pr21529.d |  2 +-
 3 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index 71fa8fa6f01..af8cb2575e7 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -5247,16 +5247,15 @@ loongarch_get_max_alignment (asection *sec)
 
 static bool
 loongarch_elf_relax_section (bfd *abfd, asection *sec,
-			       struct bfd_link_info *info,
-			       bool *again)
+			     struct bfd_link_info *info,
+			     bool *again)
 {
-  struct loongarch_elf_link_hash_table *htab = loongarch_elf_hash_table (info);
-  struct bfd_elf_section_data *data = elf_section_data (sec);
-  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
-  Elf_Internal_Rela *relocs;
   *again = false;
-  bfd_vma max_alignment = 0;
+  if (!is_elf_hash_table (info->hash)
+      || elf_hash_table_id (elf_hash_table (info)) != LARCH_ELF_DATA)
+    return true;
 
+  struct loongarch_elf_link_hash_table *htab = loongarch_elf_hash_table (info);
   if (bfd_link_relocatable (info)
       || sec->sec_flg0
       || (sec->flags & SEC_RELOC) == 0
@@ -5268,6 +5267,8 @@ loongarch_elf_relax_section (bfd *abfd, asection *sec,
       || *(htab->data_segment_phase) == 4)
     return true;
 
+  struct bfd_elf_section_data *data = elf_section_data (sec);
+  Elf_Internal_Rela *relocs;
   if (data->relocs)
     relocs = data->relocs;
   else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
@@ -5278,6 +5279,7 @@ loongarch_elf_relax_section (bfd *abfd, asection *sec,
       && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
     return true;
 
+  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
   if (symtab_hdr->sh_info != 0
       && !symtab_hdr->contents
       && !(symtab_hdr->contents =
@@ -5290,7 +5292,7 @@ loongarch_elf_relax_section (bfd *abfd, asection *sec,
 
   /* Estimate the maximum alignment for all output sections once time
      should be enough.  */
-  max_alignment = htab->max_alignment;
+  bfd_vma max_alignment = htab->max_alignment;
   if (max_alignment == (bfd_vma) -1)
     {
       max_alignment = loongarch_get_max_alignment (sec);
diff --git a/ld/testsuite/ld-elf/pr21884.d b/ld/testsuite/ld-elf/pr21884.d
index e289b419f8f..3d44ccfe602 100644
--- a/ld/testsuite/ld-elf/pr21884.d
+++ b/ld/testsuite/ld-elf/pr21884.d
@@ -3,7 +3,7 @@
 #ld: -T pr21884.t
 #objdump: -b binary -s
 #xfail: aarch64*-*-* arm*-*-* avr-*-* ia64-*-* m68hc1*-*-* nds32*-*-*
-#xfail: riscv*-*-* score-*-* v850-*-* loongarch*-*-*
+#xfail: riscv*-*-* score-*-* v850-*-*
 # Skip targets which can't change output format to binary.
 
 .*:     file format binary
diff --git a/ld/testsuite/ld-unique/pr21529.d b/ld/testsuite/ld-unique/pr21529.d
index 896f8722782..fb637943909 100644
--- a/ld/testsuite/ld-unique/pr21529.d
+++ b/ld/testsuite/ld-unique/pr21529.d
@@ -1,6 +1,6 @@
 #ld: --oformat binary -T pr21529.ld -e main
 #objdump: -s -b binary
-#xfail: aarch64*-*-* arm*-*-* avr-*-* ia64-*-* m68hc1*-*-* nds32*-*-* riscv*-*-* score-*-* v850-*-* loongarch*-*-*
+#xfail: aarch64*-*-* arm*-*-* avr-*-* ia64-*-* m68hc1*-*-* nds32*-*-* riscv*-*-* score-*-* v850-*-*
 # Skip targets which can't change output format to binary.
 
 #pass


More information about the Binutils-cvs mailing list