This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[committed] Fix fallout from MIPS LD & SD macro changes
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: binutils at sourceware dot org
- Cc: gingold at adacore dot com
- Date: Sat, 13 Nov 2010 11:59:37 +0000
- Subject: [committed] Fix fallout from MIPS LD & SD macro changes
The recent changes to the MIPS LD and SD macros trigger a GAS assertion
for instructions like:
ld $4,%gottprel(bar)($4)
(noticed as a failure to build libgomp on mips64-linux-gnu).
The assertion was there to check the types of reloc that are generated
by "real" macro expansion, but we now use 'o' to pass through normal
LD and SD instructions on 64-bit targets, so several more types are
possible.
One fix would have been to add all the reloc types in mips_percent_op to
the assert. However, I think that would run the risk of the two lists
getting out of sync, and would probably also defeat the purpose of the
original assert. Instead, I've dropped the assert from the 'o' case and
kept a restricted form for 'i' and 'j'.
Tested on mips64-linux-gnu and applied. Tristan, since this fixes
a GCC build failure, is it OK for the branch too?
Richard
gas/
* config/tc-mips.c (macro_build): Remove gas_assert from 'o' case.
Use a restricted gas_assert for 'i' and 'j'.
gas/testsuite/
* gas/mips/elf-rel28.s, gas/mips/elf-rel28-n32.d,
gas/mips/elf-rel28-n64.d: New test.
* gas/mips/mips.exp: Run it.
Index: gas/config/tc-mips.c
===================================================================
--- gas/config/tc-mips.c 2010-11-13 09:43:54.000000000 +0000
+++ gas/config/tc-mips.c 2010-11-13 09:55:57.000000000 +0000
@@ -3765,20 +3765,16 @@ macro_build (expressionS *ep, const char
case 'i':
case 'j':
- case 'o':
macro_read_relocs (&args, r);
gas_assert (*r == BFD_RELOC_GPREL16
- || *r == BFD_RELOC_MIPS_LITERAL
- || *r == BFD_RELOC_MIPS_HIGHER
- || *r == BFD_RELOC_HI16_S
- || *r == BFD_RELOC_LO16
- || *r == BFD_RELOC_MIPS_GOT16
- || *r == BFD_RELOC_MIPS_CALL16
- || *r == BFD_RELOC_MIPS_GOT_DISP
- || *r == BFD_RELOC_MIPS_GOT_PAGE
- || *r == BFD_RELOC_MIPS_GOT_OFST
- || *r == BFD_RELOC_MIPS_GOT_LO16
- || *r == BFD_RELOC_MIPS_CALL_LO16);
+ || *r == BFD_RELOC_MIPS_HIGHER
+ || *r == BFD_RELOC_HI16_S
+ || *r == BFD_RELOC_LO16
+ || *r == BFD_RELOC_MIPS_GOT_OFST);
+ continue;
+
+ case 'o':
+ macro_read_relocs (&args, r);
continue;
case 'u':
Index: gas/testsuite/gas/mips/elf-rel28.s
===================================================================
--- /dev/null 2010-11-13 08:36:20.129976896 +0000
+++ gas/testsuite/gas/mips/elf-rel28.s 2010-11-13 10:10:05.000000000 +0000
@@ -0,0 +1,48 @@
+ .ent foo
+foo:
+ # Many of these do not make conceptual sense, but they should
+ # at least assemble.
+ ld $4,%call_hi(bar)($4)
+ ld $4,%call_lo(bar)($4)
+ ld $4,%call16(bar)($4)
+ ld $4,%got_disp(bar)($4)
+ ld $4,%got_page(bar)($4)
+ ld $4,%got_ofst(bar)($4)
+ ld $4,%got_hi(bar)($4)
+ ld $4,%got_lo(bar)($4)
+ ld $4,%got(bar)($4)
+ ld $4,%gp_rel(bar)($4)
+ ld $4,%half(bar)($4)
+ ld $4,%highest(bar)($4)
+ ld $4,%higher(bar)($4)
+ ld $4,%neg(bar)($4)
+ ld $4,%tlsgd(bar)($4)
+ ld $4,%tlsldm(bar)($4)
+ ld $4,%dtprel_hi(bar)($4)
+ ld $4,%dtprel_lo(bar)($4)
+ ld $4,%tprel_hi(bar)($4)
+ ld $4,%tprel_lo(bar)($4)
+ ld $4,%gottprel(bar)($4)
+
+ sd $4,%call_hi(bar)($4)
+ sd $4,%call_lo(bar)($4)
+ sd $4,%call16(bar)($4)
+ sd $4,%got_disp(bar)($4)
+ sd $4,%got_page(bar)($4)
+ sd $4,%got_ofst(bar)($4)
+ sd $4,%got_hi(bar)($4)
+ sd $4,%got_lo(bar)($4)
+ sd $4,%got(bar)($4)
+ sd $4,%gp_rel(bar)($4)
+ sd $4,%half(bar)($4)
+ sd $4,%highest(bar)($4)
+ sd $4,%higher(bar)($4)
+ sd $4,%neg(bar)($4)
+ sd $4,%tlsgd(bar)($4)
+ sd $4,%tlsldm(bar)($4)
+ sd $4,%dtprel_hi(bar)($4)
+ sd $4,%dtprel_lo(bar)($4)
+ sd $4,%tprel_hi(bar)($4)
+ sd $4,%tprel_lo(bar)($4)
+ sd $4,%gottprel(bar)($4)
+ .end foo
Index: gas/testsuite/gas/mips/elf-rel28-n32.d
===================================================================
--- /dev/null 2010-11-13 08:36:20.129976896 +0000
+++ gas/testsuite/gas/mips/elf-rel28-n32.d 2010-11-13 10:16:23.000000000 +0000
@@ -0,0 +1,96 @@
+#source: elf-rel28.s
+#as: -n32
+#objdump: -dr
+#name: MIPS ELF reloc 28 (n32)
+
+.*: file format .*
+
+
+Disassembly of section \.text:
+
+.* <foo>:
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_CALL_HI16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_CALL_LO16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_CALL16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_DISP bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_PAGE bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_OFST bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_HI16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_LO16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GPREL16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_HIGHEST bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_HIGHER bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_SUB bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_GD bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_LDM bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_DTPREL_HI16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_DTPREL_LO16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_TPREL_HI16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_TPREL_LO16 bar
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_GOTTPREL bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_CALL_HI16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_CALL_LO16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_CALL16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_DISP bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_PAGE bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_OFST bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_HI16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_LO16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GPREL16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_HIGHEST bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_HIGHER bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_SUB bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_GD bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_LDM bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_DTPREL_HI16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_DTPREL_LO16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_TPREL_HI16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_TPREL_LO16 bar
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_GOTTPREL bar
+ ...
Index: gas/testsuite/gas/mips/elf-rel28-n64.d
===================================================================
--- /dev/null 2010-11-13 08:36:20.129976896 +0000
+++ gas/testsuite/gas/mips/elf-rel28-n64.d 2010-11-13 10:17:52.000000000 +0000
@@ -0,0 +1,180 @@
+#source: elf-rel28.s
+#as: -64
+#objdump: -dr
+#name: MIPS ELF reloc 28 (n64)
+
+.*: file format .*
+
+
+Disassembly of section \.text:
+
+.* <foo>:
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_CALL_HI16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_CALL_LO16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_CALL16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_DISP bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_PAGE bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_OFST bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_HI16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT_LO16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GOT16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_GPREL16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_HIGHEST bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_HIGHER bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_SUB bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_GD bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_LDM bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_DTPREL_HI16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_DTPREL_LO16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_TPREL_HI16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_TPREL_LO16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: dc840000 ld a0,0\(a0\)
+ .*: R_MIPS_TLS_GOTTPREL bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_CALL_HI16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_CALL_LO16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_CALL16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_DISP bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_PAGE bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_OFST bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_HI16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT_LO16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GOT16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_GPREL16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_HIGHEST bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_HIGHER bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_SUB bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_GD bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_LDM bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_DTPREL_HI16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_DTPREL_LO16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_TPREL_HI16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_TPREL_LO16 bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+.*: fc840000 sd a0,0\(a0\)
+ .*: R_MIPS_TLS_GOTTPREL bar
+ .*: R_MIPS_NONE \*ABS\*
+ .*: R_MIPS_NONE \*ABS\*
+ \.\.\.
Index: gas/testsuite/gas/mips/mips.exp
===================================================================
--- gas/testsuite/gas/mips/mips.exp 2010-11-13 10:04:48.000000000 +0000
+++ gas/testsuite/gas/mips/mips.exp 2010-11-13 11:33:45.000000000 +0000
@@ -810,6 +810,11 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test_arches "elf-rel27" [mips_arch_list_all]
+ if $has_newabi {
+ run_dump_test "elf-rel28-n32"
+ run_dump_test "elf-rel28-n64"
+ }
+
if { !$no_mips16 } {
run_dump_test "${tmips}mips${el}16-e"
run_dump_test "${tmips}mips${el}16-f"