MIPS: Support `-gnuabi64' target triplet suffix for 64-bit Linux targets
authorYunQiang Su <yunqiang.su@cipunited.com>
Fri, 28 Jul 2023 05:00:37 +0000 (06:00 +0100)
committerMaciej W. Rozycki <macro@orcam.me.uk>
Fri, 28 Jul 2023 05:00:37 +0000 (06:00 +0100)
Make the n64 ABI the default for 64-bit Linux targets specified with
`-gnuabi64' suffix included in the target triplet, for configurations
such as the Debian mips64el and mips64r6el ports.  Adjust testsuite
configuration accordingly.

There are the following regressions with the new target triplet:

mips64-linux-gnuabi64  +FAIL: readelf -S bintest
mips64-linux-gnuabi64  +FAIL: MIPS reloc estimation 1
mips64el-linux-gnuabi64  +FAIL: readelf -S bintest
mips64el-linux-gnuabi64  +FAIL: MIPS reloc estimation 1

The `readelf' issue comes from a difference in section headers produced
that the `binutils/testsuite/binutils-all/readelf.s-64' pattern template
does not match.  While there has been a precedent it does not appear to
me that there is a clear advantage from adding more and more variations
to the template rather than forking the existing template into multiple
ones for a more exact match.  So this is best deferred to a separate
discussion.

The MIPS reloc estimation issue is an actual bug in `objdump', which
discards a number of trailing entries from output here for n64 composed
relocations:

DYNAMIC RELOCATION RECORDS
OFFSET           TYPE              VALUE
0000000000000000 R_MIPS_NONE       *ABS*
0000000000000000 R_MIPS_NONE       *ABS*

and consequently `ld/testsuite/ld-mips-elf/reloc-estimate-1.d' does not
match even though ELF output produced is correct according to `readelf':

Relocation section '.rel.dyn' at offset 0x10400 contains 2 entries:
  Offset          Info           Type           Sym. Value    Sym. Name
000000000000  000000000000 R_MIPS_NONE
                    Type2: R_MIPS_NONE
                    Type3: R_MIPS_NONE
000000010000  000300001203 R_MIPS_REL32      0000000000010010 foo@@V2
                    Type2: R_MIPS_64
                    Type3: R_MIPS_NONE

As a genuine bug this has to be handled separately.

Co-Authored by: Maciej W. Rozycki <macro@orcam.me.uk>

bfd/
* config.bfd: Add `mips64*el-*-linux*-gnuabi64' and
`mips64*-*-linux*-gnuabi64' targets.

binutils/
* testsuite/binutils-all/mips/mips.exp: Handle `*-*-*-gnuabi64'
targets.
* testsuite/binutils-all/objcopy.exp: Handle
`mips64*-*-*-gnuabi64' targets.
* testsuite/binutils-all/remove-relocs-01.d: Likewise.
* testsuite/binutils-all/remove-relocs-04.d: Likewise.
* testsuite/binutils-all/remove-relocs-05.d: Likewise.
* testsuite/binutils-all/remove-relocs-06.d: Likewise.

gas/
* configure.ac: Handle `mips64*-linux-gnuabi64' targets.
* configure: Regenerate.
* testsuite/gas/mips/compact-eh-eb-7.d: Handle
`mips64*-*-*-gnuabi64' targets.
* testsuite/gas/mips/compact-eh-el-7.d: Likewise.

ld/
* configure.tgt: Add `mips64*el-*-linux-gnuabi64' and
`mips64*-*-linux-gnuabi64' targets.
* testsuite/ld-undefined/undefined.exp: Handle
`mips64*-*-*-gnuabi64' targets.
* testsuite/ld-mips-elf/attr-gnu-4-10.d: Likewise.
* testsuite/ld-mips-elf/compact-eh6.d: Likewise.
* testsuite/ld-mips-elf/mips-elf.exp: Handle `*-*-*-gnuabi64'
targets.

16 files changed:
bfd/config.bfd
binutils/testsuite/binutils-all/mips/mips.exp
binutils/testsuite/binutils-all/objcopy.exp
binutils/testsuite/binutils-all/remove-relocs-01.d
binutils/testsuite/binutils-all/remove-relocs-04.d
binutils/testsuite/binutils-all/remove-relocs-05.d
binutils/testsuite/binutils-all/remove-relocs-06.d
gas/configure
gas/configure.ac
gas/testsuite/gas/mips/compact-eh-eb-7.d
gas/testsuite/gas/mips/compact-eh-el-7.d
ld/configure.tgt
ld/testsuite/ld-mips-elf/attr-gnu-4-10.d
ld/testsuite/ld-mips-elf/compact-eh6.d
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-undefined/undefined.exp

index 54a30ef901f5782c4c254171356330b1df8ee92d..3b39ff36c006bdfba65eb3584105a856156010fb 100644 (file)
@@ -941,10 +941,20 @@ case "${targ}" in
     targ_defvec=mips_elf32_be_vec
     targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec"
     ;;
+  mips64*el-*-linux*-gnuabi64)
+    targ_defvec=mips_elf64_trad_le_vec
+    targ_selvecs="mips_elf64_trad_be_vec mips_elf32_ntrad_le_vec mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec"
+    want64=true
+    ;;
   mips64*el-*-linux*)
     targ_defvec=mips_elf32_ntrad_le_vec
     targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec"
     ;;
+  mips64*-*-linux*-gnuabi64)
+    targ_defvec=mips_elf64_trad_be_vec
+    targ_selvecs="mips_elf64_trad_le_vec mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec"
+    want64=true
+    ;;
   mips64*-*-linux*)
     targ_defvec=mips_elf32_ntrad_be_vec
     targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec"
index 91bf32745925e9a449217c2e79ba69850c05e06e..fdab97180e33e55382893e9c7e38b41f6b37eca8 100644 (file)
@@ -125,13 +125,23 @@ if {[istarget *-*-openbsd*] } {
     if [istarget *el-*-*] {
        set abi_asflags(o32) -32
        set abi_ldflags(o32) -melf32ltsmip
-       set abi_asflags(n64) "-march=from-abi -64"
-       set abi_ldflags(n64) -melf64ltsmip
+       if [istarget *-*-*-gnuabi64] {
+           set abi_asflags(n32) "-march=from-abi -n32"
+           set abi_ldflags(n32) -melf32ltsmipn32
+       } else {
+           set abi_asflags(n64) "-march=from-abi -64"
+           set abi_ldflags(n64) -melf64ltsmip
+       }
     } else {
        set abi_asflags(o32) -32
        set abi_ldflags(o32) -melf32btsmip
-       set abi_asflags(n64) "-march=from-abi -64"
-       set abi_ldflags(n64) -melf64btsmip
+       if [istarget *-*-*-gnuabi64] {
+           set abi_asflags(n32) "-march=from-abi -n32"
+           set abi_ldflags(n32) -melf32btsmipn32
+       } else {
+           set abi_asflags(n64) "-march=from-abi -64"
+           set abi_ldflags(n64) -melf64btsmip
+       }
     }
     set irixemul 0
 } elseif {[istarget *-*-linux*] } {
index 41add0fecda0088c57cdd63dff804604ee4fa703..1145835d8b75ee78301a8ad2572ca455e7fe352a 100644 (file)
@@ -1269,7 +1269,8 @@ if [is_elf_format] {
     run_dump_test "strip-9"
     run_dump_test "strip-12"
 
-    if { [istarget "mips64*-*-openbsd*"] } {
+    if { [istarget "mips64*-*-openbsd*"] \
+        || [istarget "mips64*-*-*-gnuabi64"] } {
        set reloc_format mips64
     }
     # A relocation type not supported by any target
index 702747bc3f3c5c0aa48919cdb4f77db0bb27ed7f..aeceba117d12c57c0d30c579b34a6b62ba557ecd 100644 (file)
@@ -2,7 +2,7 @@
 #source: remove-relocs-01.s
 #objcopy: --remove-relocations=.data.relocs.01
 #readelf: -r
-#notarget: "mips64*-*-openbsd*"
+#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
 
 Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
 .*
index 1b8eab39a1a3c892839711a5150200f5a53071a0..4ae7a90f0f100dc7210b71c3c725b2bc5ffae561 100644 (file)
@@ -2,7 +2,7 @@
 #source: remove-relocs-01.s
 #objcopy: --remove-relocations=.data.relocs.0\[12\]
 #readelf: -r
-#notarget: "mips64*-*-openbsd*"
+#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
 
 Relocation section '\.rela?\.data\.relocs\.03' at offset 0x[0-9a-f]+ contains 3 entries:
 .*
index a429182d258f5a7afe2daa4ea6d207b13d5c5285..0f3591786b390589f8f28571d44d40bb6710ad33 100644 (file)
@@ -2,7 +2,7 @@
 #source: remove-relocs-01.s
 #objcopy: --remove-section=.rela.data.relocs.01 --remove-section=.rel.data.relocs.01
 #readelf: -r
-#notarget: "mips64*-*-openbsd*"
+#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
 
 Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
 .*
index 5214bc7297ab6b8ceec9068f7548b52c7ffa7619..f530d30008779a9c0d00acd73feac604de36fb75 100644 (file)
@@ -2,7 +2,7 @@
 #source: remove-relocs-01.s
 #objcopy: --remove-relocations=.data.relocs.* --remove-relocations=!.data.relocs.02
 #readelf: -r
-#notarget: "mips64*-*-openbsd*"
+#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
 
 Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
 .*
index e5023ff727f0ac932f2fba3aee8c72475c4ab73b..aff5aec462571e81337c3c337224aacb3cf98ad5 100755 (executable)
@@ -12225,6 +12225,9 @@ _ACEOF
        esac
        # Decide which ABI to target by default.
        case ${target} in
+         mips64*-openbsd* | mips64*-linux-gnuabi64)
+           mips_default_abi=N64_ABI
+           ;;
          mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \
          | mips64*-kfreebsd*-gnu | mips64*-ps2-elf*)
            mips_default_abi=N32_ABI
@@ -12232,9 +12235,6 @@ _ACEOF
          mips*-linux* | mips*-freebsd* | mips*-kfreebsd*-gnu)
            mips_default_abi=O32_ABI
            ;;
-         mips64*-openbsd*)
-           mips_default_abi=N64_ABI
-           ;;
          *)
            mips_default_abi=NO_ABI
            ;;
index e8e8f31f79a5710b2877ffcef00bda0829743633..c3bd1178d41de5d10969b2ad20854dbc0a988fba 100644 (file)
@@ -394,6 +394,9 @@ changequote([,])dnl
        esac
        # Decide which ABI to target by default.
        case ${target} in
+         mips64*-openbsd* | mips64*-linux-gnuabi64)
+           mips_default_abi=N64_ABI
+           ;;
          mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \
          | mips64*-kfreebsd*-gnu | mips64*-ps2-elf*)
            mips_default_abi=N32_ABI
@@ -401,9 +404,6 @@ changequote([,])dnl
          mips*-linux* | mips*-freebsd* | mips*-kfreebsd*-gnu)
            mips_default_abi=O32_ABI
            ;;
-         mips64*-openbsd*)
-           mips_default_abi=N64_ABI
-           ;;
          *)
            mips_default_abi=NO_ABI
            ;;
index 6576e43bbdcded2011580b581ccd92e76f880720..973e69fe31a1658a68c07cc10b226d3d5d93de76 100644 (file)
@@ -2,7 +2,7 @@
 #name: Compact EH EB #7 with personality id and fallback FDE
 #source: compact-eh-7.s
 #as: -EB -mno-pdr
-#notarget: mips64*-*-openbsd*
+#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
 
 .*:     file format.*
 
index 9a12da7676e5c9b6c37088c3a5e67de0edac4235..fb7dde9252f0c8bc758a73e2c99e7ed2023cf588 100644 (file)
@@ -2,7 +2,7 @@
 #name: Compact EH EL #7 with personality id and fallback FDE
 #source: compact-eh-7.s
 #as: -EL -mno-pdr
-#notarget: mips64*-*-openbsd*
+#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
 
 .*:     file format.*
 
index 34c9d67c3659b47e912ab6853a3f0986524677a9..c62b9581d9b8bb0bb000ff83247baa6144b9921b 100644 (file)
@@ -580,10 +580,20 @@ mips*-*-vxworks*) targ_emul=elf32ebmipvxworks
                        ;;
 mips*-*-windiss)       targ_emul=elf32mipswindiss
                        ;;
+mips64*el-*-linux-gnuabi64)
+                       targ_emul=elf64ltsmip
+                       targ_extra_emuls="elf64btsmip elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip"
+                       targ_extra_libpath=$targ_extra_emuls
+                       ;;
 mips64*el-*-linux-*)   targ_emul=elf32ltsmipn32
                        targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
                        targ_extra_libpath=$targ_extra_emuls
                        ;;
+mips64*-*-linux-gnuabi64)
+                       targ_emul=elf64btsmip
+                       targ_extra_emuls="elf64ltsmip elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip"
+                       targ_extra_libpath=$targ_extra_emuls
+                       ;;
 mips64*-*-linux-*)     targ_emul=elf32btsmipn32
                        targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
                        targ_extra_libpath=$targ_extra_emuls
index 2ddb3d36f4025604faafe5aa9cb04905f9a50be7..fe39ece80f83d8b2ba188cfe67fbcee304a4d2f5 100644 (file)
@@ -3,7 +3,7 @@
 #as: -mpdr
 #ld: -r
 #readelf: -hA
-#notarget: mips64*-*-openbsd*
+#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
 
 ELF Header:
   Magic:   .*
index e81285afc027d8798ece938d9ed916bc108c0a9e..a4a6978ccbd5a4d64733e54906d044e6f6198a48 100644 (file)
@@ -4,7 +4,7 @@
 #as: -EB
 #readelf: -x .eh_frame_hdr
 #ld: -EB -e main
-#
+#notarget: mips64*-*-*-gnuabi64
 
 Hex dump of section \'\.eh_frame_hdr\':
 
index 8be2bfc7a1df5266787bc08897b44fa6a2348887..e123ef52b06cdb04b79af434751c15a81d4f339b 100644 (file)
@@ -155,13 +155,23 @@ if {[istarget *-*-openbsd*] } {
     if [istarget *el-*-*] {
        set abi_asflags(o32) -32
        set abi_ldflags(o32) -melf32ltsmip
-       set abi_asflags(n64) "-march=from-abi -64"
-       set abi_ldflags(n64) -melf64ltsmip
+       if [istarget *-*-*-gnuabi64] {
+           set abi_asflags(n32) "-march=from-abi -n32"
+           set abi_ldflags(n32) -melf32ltsmipn32
+       } else {
+           set abi_asflags(n64) "-march=from-abi -64"
+           set abi_ldflags(n64) -melf64ltsmip
+       }
     } else {
        set abi_asflags(o32) -32
        set abi_ldflags(o32) -melf32btsmip
-       set abi_asflags(n64) "-march=from-abi -64"
-       set abi_ldflags(n64) -melf64btsmip
+       if [istarget *-*-*-gnuabi64] {
+           set abi_asflags(n32) "-march=from-abi -n32"
+           set abi_ldflags(n32) -melf32btsmipn32
+       } else {
+           set abi_asflags(n64) "-march=from-abi -64"
+           set abi_ldflags(n64) -melf64btsmip
+       }
     }
     set irixemul 0
 } elseif {[istarget *-*-linux*] } {
@@ -811,7 +821,8 @@ if { $linux_gnu } {
     run_dump_test "got-page-1"
     run_dump_test_n32 "got-page-2"
     run_dump_test_n64 "dyn-sec64" noarch
-    run_dump_test "got-page-3"
+    run_dump_test_o32 "got-page-3"
+    run_dump_test_n32 "got-page-3" [list [list name (n32)]]
     if $has_abi(o32) {
        run_ld_link_tests [subst {
            {"GOT page 4 (one file)"
index 05b1131d5b4476a4830a65c17d9539e6d4a76c37..c0479a227331cee7eafe4792f4b234b970f6f7c6 100644 (file)
@@ -206,7 +206,8 @@ if { ![is_elf_format] || ![check_shared_lib_support]} then {
     # triplets, and S+core targets using an extra R_SCORE_NONE
     # relocation, so adjust for that.
     switch -glob $target_triplet {
-       "mips64*-*-openbsd*" {
+       "mips64*-*-openbsd*" -
+       "mips64*-*-*-gnuabi64" {
            set none_count 6
            set reloc_count 4
        }