aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYunQiang Su <yunqiang.su@cipunited.com>2023-07-28 06:00:37 +0100
committerMaciej W. Rozycki <macro@orcam.me.uk>2023-07-28 06:00:37 +0100
commit29c108c9610640439daa5244a573348b7c47d994 (patch)
tree5065cd49cff1683cb17c80c66de8923a4b6eb13e
parent316be2b229f5bd07ebef48fd1d7b8cb103e4d815 (diff)
downloadbinutils-29c108c9610640439daa5244a573348b7c47d994.zip
binutils-29c108c9610640439daa5244a573348b7c47d994.tar.gz
binutils-29c108c9610640439daa5244a573348b7c47d994.tar.bz2
MIPS: Support `-gnuabi64' target triplet suffix for 64-bit Linux targets
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.
-rw-r--r--bfd/config.bfd10
-rw-r--r--binutils/testsuite/binutils-all/mips/mips.exp18
-rw-r--r--binutils/testsuite/binutils-all/objcopy.exp3
-rw-r--r--binutils/testsuite/binutils-all/remove-relocs-01.d2
-rw-r--r--binutils/testsuite/binutils-all/remove-relocs-04.d2
-rw-r--r--binutils/testsuite/binutils-all/remove-relocs-05.d2
-rw-r--r--binutils/testsuite/binutils-all/remove-relocs-06.d2
-rwxr-xr-xgas/configure6
-rw-r--r--gas/configure.ac6
-rw-r--r--gas/testsuite/gas/mips/compact-eh-eb-7.d2
-rw-r--r--gas/testsuite/gas/mips/compact-eh-el-7.d2
-rw-r--r--ld/configure.tgt10
-rw-r--r--ld/testsuite/ld-mips-elf/attr-gnu-4-10.d2
-rw-r--r--ld/testsuite/ld-mips-elf/compact-eh6.d2
-rw-r--r--ld/testsuite/ld-mips-elf/mips-elf.exp21
-rw-r--r--ld/testsuite/ld-undefined/undefined.exp3
16 files changed, 68 insertions, 25 deletions
diff --git a/bfd/config.bfd b/bfd/config.bfd
index 54a30ef..3b39ff3 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -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"
diff --git a/binutils/testsuite/binutils-all/mips/mips.exp b/binutils/testsuite/binutils-all/mips/mips.exp
index 91bf327..fdab971 100644
--- a/binutils/testsuite/binutils-all/mips/mips.exp
+++ b/binutils/testsuite/binutils-all/mips/mips.exp
@@ -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*] } {
diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp
index 41add0f..1145835 100644
--- a/binutils/testsuite/binutils-all/objcopy.exp
+++ b/binutils/testsuite/binutils-all/objcopy.exp
@@ -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
diff --git a/binutils/testsuite/binutils-all/remove-relocs-01.d b/binutils/testsuite/binutils-all/remove-relocs-01.d
index 702747b..aeceba1 100644
--- a/binutils/testsuite/binutils-all/remove-relocs-01.d
+++ b/binutils/testsuite/binutils-all/remove-relocs-01.d
@@ -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:
.*
diff --git a/binutils/testsuite/binutils-all/remove-relocs-04.d b/binutils/testsuite/binutils-all/remove-relocs-04.d
index 1b8eab3..4ae7a90 100644
--- a/binutils/testsuite/binutils-all/remove-relocs-04.d
+++ b/binutils/testsuite/binutils-all/remove-relocs-04.d
@@ -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:
.*
diff --git a/binutils/testsuite/binutils-all/remove-relocs-05.d b/binutils/testsuite/binutils-all/remove-relocs-05.d
index a429182..0f35917 100644
--- a/binutils/testsuite/binutils-all/remove-relocs-05.d
+++ b/binutils/testsuite/binutils-all/remove-relocs-05.d
@@ -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:
.*
diff --git a/binutils/testsuite/binutils-all/remove-relocs-06.d b/binutils/testsuite/binutils-all/remove-relocs-06.d
index 5214bc7..f530d30 100644
--- a/binutils/testsuite/binutils-all/remove-relocs-06.d
+++ b/binutils/testsuite/binutils-all/remove-relocs-06.d
@@ -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:
.*
diff --git a/gas/configure b/gas/configure
index e5023ff..aff5aec 100755
--- a/gas/configure
+++ b/gas/configure
@@ -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
;;
diff --git a/gas/configure.ac b/gas/configure.ac
index e8e8f31..c3bd117 100644
--- a/gas/configure.ac
+++ b/gas/configure.ac
@@ -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
;;
diff --git a/gas/testsuite/gas/mips/compact-eh-eb-7.d b/gas/testsuite/gas/mips/compact-eh-eb-7.d
index 6576e43..973e69f 100644
--- a/gas/testsuite/gas/mips/compact-eh-eb-7.d
+++ b/gas/testsuite/gas/mips/compact-eh-eb-7.d
@@ -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.*
diff --git a/gas/testsuite/gas/mips/compact-eh-el-7.d b/gas/testsuite/gas/mips/compact-eh-el-7.d
index 9a12da7..fb7dde9 100644
--- a/gas/testsuite/gas/mips/compact-eh-el-7.d
+++ b/gas/testsuite/gas/mips/compact-eh-el-7.d
@@ -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.*
diff --git a/ld/configure.tgt b/ld/configure.tgt
index 34c9d67..c62b958 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/attr-gnu-4-10.d b/ld/testsuite/ld-mips-elf/attr-gnu-4-10.d
index 2ddb3d3..fe39ece 100644
--- a/ld/testsuite/ld-mips-elf/attr-gnu-4-10.d
+++ b/ld/testsuite/ld-mips-elf/attr-gnu-4-10.d
@@ -3,7 +3,7 @@
#as: -mpdr
#ld: -r
#readelf: -hA
-#notarget: mips64*-*-openbsd*
+#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
ELF Header:
Magic: .*
diff --git a/ld/testsuite/ld-mips-elf/compact-eh6.d b/ld/testsuite/ld-mips-elf/compact-eh6.d
index e81285a..a4a6978 100644
--- a/ld/testsuite/ld-mips-elf/compact-eh6.d
+++ b/ld/testsuite/ld-mips-elf/compact-eh6.d
@@ -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\':
diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
index 8be2bfc..e123ef5 100644
--- a/ld/testsuite/ld-mips-elf/mips-elf.exp
+++ b/ld/testsuite/ld-mips-elf/mips-elf.exp
@@ -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)"
diff --git a/ld/testsuite/ld-undefined/undefined.exp b/ld/testsuite/ld-undefined/undefined.exp
index 05b1131..c0479a2 100644
--- a/ld/testsuite/ld-undefined/undefined.exp
+++ b/ld/testsuite/ld-undefined/undefined.exp
@@ -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
}