summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-mips.c23
-rw-r--r--gas/testsuite/ChangeLog6
-rw-r--r--gas/testsuite/gas/mips/elf-rel28-n32.d96
-rw-r--r--gas/testsuite/gas/mips/elf-rel28-n64.d180
-rw-r--r--gas/testsuite/gas/mips/elf-rel28.s48
-rw-r--r--gas/testsuite/gas/mips/mips.exp5
7 files changed, 351 insertions, 12 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 732a72640d1..784d84dde56 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-13 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * config/tc-mips.c (macro_build): Remove gas_assert from 'o' case.
+ Use a restricted gas_assert for 'i' and 'j'.
+
2010-11-11 Mingming Sun <mingm.sun@gmail.com>
* config/tc-mips.c (mips_cpu_info_table): Add loongson3a in MIPS 64.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index ddeb51356ad..77397bb01bd 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -3765,20 +3765,16 @@ macro_build (expressionS *ep, const char *name, const char *fmt, ...)
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':
@@ -9970,6 +9966,9 @@ do_msbd:
/* Check whether there is only a single bracketed expression
left. If so, it must be the base register and the
constant must be zero. */
+ offset_reloc[0] = BFD_RELOC_LO16;
+ offset_reloc[1] = BFD_RELOC_UNUSED;
+ offset_reloc[2] = BFD_RELOC_UNUSED;
if (*s == '(' && strchr (s + 1, '(') == 0)
{
offset_expr.X_op = O_constant;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index b6e621903f3..b2f09dc9369 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2010-11-13 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * 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.
+
2010-11-10 Richard Sandiford <richard.sandiford@linaro.org>
* gas/arm/plt-1.s, gas/arm/plt-1.d: New test.
diff --git a/gas/testsuite/gas/mips/elf-rel28-n32.d b/gas/testsuite/gas/mips/elf-rel28-n32.d
new file mode 100644
index 00000000000..2ba277110b4
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel28-n32.d
@@ -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
+ ...
diff --git a/gas/testsuite/gas/mips/elf-rel28-n64.d b/gas/testsuite/gas/mips/elf-rel28-n64.d
new file mode 100644
index 00000000000..be38e7d9cd1
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel28-n64.d
@@ -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\*
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/elf-rel28.s b/gas/testsuite/gas/mips/elf-rel28.s
new file mode 100644
index 00000000000..ec4fb660c90
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel28.s
@@ -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
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index 3fb500389f4..6e98082c968 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -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"