MIPS16/GAS: Fix absolute references with PC-relative synthetic instructions
authorMaciej W. Rozycki <macro@imgtec.com>
Tue, 2 May 2017 23:05:15 +0000 (00:05 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Tue, 2 May 2017 23:15:56 +0000 (00:15 +0100)
Complement commit 88a7ef168927 ("MIPS16/GAS: Restore unsupported
relocation diagnostics") and also propagate constant expressions, either
already reduced from absolute symbol references or created from literals
in the first place, used as a PC-relative operand with the MIPS16 LA,
LW, DLA and LD synthetic instructions to relaxation, matching the way
forward absolute symbol references have been handled as from the commit
referred and letting relaxation produce any necessary relocations, if
possible, for the absolute value requested to be reproduced at the run
time.

Call `symbol_append' for any expression symbol created for the purpose
of MIPS16 relaxation as with constant expressions now propagated from
earlier on such symbols may make it through and have R_MIPS16_PC16_S1
relocations emitted against, and therefore need to appear in the symbol
table produced.

gas/
* config/tc-mips.c (append_insn): Call `symbol_append' for any
expression symbol created for MIPS16 relaxation.
(match_mips16_insn): Don't encode a constant value as an
immediate with a PC-relative operand.

* testsuite/gas/mips/mips16-pcrel-absolute-1.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-1.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-2.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-addend-1.d: New
test.
* testsuite/gas/mips/mips16-branch-absolute-n32-1.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-n32-2.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-addend-n32-1.d: New
test.
* testsuite/gas/mips/mips16-branch-absolute-n64-1.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-n64-2.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-addend-n64-1.d: New
test.
* testsuite/gas/mips/mips16-pcrel-absolute-1.l: New stderr
output.
* testsuite/gas/mips/mips16-pcrel-absolute-1.s: New test source.
* testsuite/gas/mips/mips16-branch-absolute-1.s: New test
source.
* testsuite/gas/mips/mips16-branch-absolute-2.s: New test
source.
* testsuite/gas/mips/mips16-branch-absolute-addend-1.s: New test
source.
* testsuite/gas/mips/mips.exp: Run the new tests.

ld/
* testsuite/ld-mips-elf/mips16-branch-absolute-1.d: New test.
* testsuite/ld-mips-elf/mips16-branch-absolute-2.d: New test.
* testsuite/ld-mips-elf/mips16-branch-absolute-addend-1.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-n32-1.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-n32-2.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-addend-n32-1.d:
New test.
* testsuite/ld-mips-elf/mips16-branch-absolute-n64-1.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-n64-2.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-addend-n64-1.d:
New test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.

29 files changed:
gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips16-branch-absolute-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-1.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-2.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-addend-n32-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-addend-n64-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-n32-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-n32-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-n64-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-absolute-n64-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-1.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-1.s [new file with mode: 0644]
ld/ChangeLog
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/mips16-branch-absolute-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-absolute-2.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-n32-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-n64-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-absolute-n32-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-absolute-n32-2.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-absolute-n64-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-absolute-n64-2.d [new file with mode: 0644]

index d5849c0849e5ae895e0df78debde09fc711d34c3..24155f15441360ffc8aad47bced8ae6875d97bec 100644 (file)
@@ -1,3 +1,34 @@
+2017-05-02  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * config/tc-mips.c (append_insn): Call `symbol_append' for any
+       expression symbol created for MIPS16 relaxation.
+       (match_mips16_insn): Don't encode a constant value as an
+       immediate with a PC-relative operand.
+
+       * testsuite/gas/mips/mips16-pcrel-absolute-1.d: New test.
+       * testsuite/gas/mips/mips16-branch-absolute-1.d: New test.
+       * testsuite/gas/mips/mips16-branch-absolute-2.d: New test.
+       * testsuite/gas/mips/mips16-branch-absolute-addend-1.d: New
+       test.
+       * testsuite/gas/mips/mips16-branch-absolute-n32-1.d: New test.
+       * testsuite/gas/mips/mips16-branch-absolute-n32-2.d: New test.
+       * testsuite/gas/mips/mips16-branch-absolute-addend-n32-1.d: New
+       test.
+       * testsuite/gas/mips/mips16-branch-absolute-n64-1.d: New test.
+       * testsuite/gas/mips/mips16-branch-absolute-n64-2.d: New test.
+       * testsuite/gas/mips/mips16-branch-absolute-addend-n64-1.d: New
+       test.
+       * testsuite/gas/mips/mips16-pcrel-absolute-1.l: New stderr
+       output.
+       * testsuite/gas/mips/mips16-pcrel-absolute-1.s: New test source.
+       * testsuite/gas/mips/mips16-branch-absolute-1.s: New test
+       source.
+       * testsuite/gas/mips/mips16-branch-absolute-2.s: New test
+       source.
+       * testsuite/gas/mips/mips16-branch-absolute-addend-1.s: New test
+       source.
+       * testsuite/gas/mips/mips.exp: Run the new tests.
+
 2017-04-27  Maciej W. Rozycki  <macro@imgtec.com>
 
        * config/tc-mips.c (mips16_pcrel_val): New function, factored
index fbf67a139ede356365f63164e65c9b43b966e30c..8c387baef3fe3c2fafab509b38336cc26605db7b 100644 (file)
@@ -7419,6 +7419,7 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
       else
        {
          symbol = make_expr_symbol (address_expr);
+         symbol_append (symbol, symbol_lastP, &symbol_rootP, &symbol_lastP);
          offset = 0;
        }
       add_relaxed_insn (ip, 4, 0,
@@ -8087,6 +8088,7 @@ match_mips16_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode,
   const char *args;
   const struct mips_operand *operand;
   const struct mips_operand *ext_operand;
+  bfd_boolean pcrel = FALSE;
   int required_insn_length;
   struct mips_arg_info arg;
   int relax_char;
@@ -8148,6 +8150,7 @@ match_mips16_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode,
            }
          else if (relax_char
                   && offset_expr.X_op == O_constant
+                  && !pcrel
                   && calculate_reloc (*offset_reloc,
                                       offset_expr.X_add_number,
                                       &value))
@@ -8216,7 +8219,9 @@ match_mips16_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode,
       if (!operand)
        abort ();
 
-      if (operand->type != OP_PCREL)
+      if (operand->type == OP_PCREL)
+       pcrel = TRUE;
+      else
        {
          ext_operand = decode_mips16_operand (c, TRUE);
          if (operand != ext_operand)
index 30e2342a9775f39e5f360fe37bedd94ec6f9be88..a46f7c256991d8c0962dca3152784f65784cceeb 100644 (file)
@@ -1544,6 +1544,7 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "mips16-pcrel-addend-2"
     run_dump_test "mips16-pcrel-addend-3"
     run_dump_test "mips16-pcrel-absolute"
+    run_dump_test "mips16-pcrel-absolute-1"
     run_dump_test "mips16-branch-reloc-0"
     run_dump_test "mips16-branch-reloc-1"
     run_dump_test "mips16-branch-reloc-2"
@@ -1555,12 +1556,21 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "mips16-branch-addend-4"
     run_dump_test "mips16-branch-addend-5"
     run_dump_test "mips16-branch-absolute"
+    run_dump_test "mips16-branch-absolute-1"
+    run_dump_test "mips16-branch-absolute-2"
     run_dump_test "mips16-branch-absolute-addend"
+    run_dump_test "mips16-branch-absolute-addend-1"
     if $has_newabi {
        run_dump_test "mips16-branch-absolute-n32"
+       run_dump_test "mips16-branch-absolute-n32-1"
+       run_dump_test "mips16-branch-absolute-n32-2"
        run_dump_test "mips16-branch-absolute-addend-n32"
+       run_dump_test "mips16-branch-absolute-addend-n32-1"
        run_dump_test "mips16-branch-absolute-n64"
+       run_dump_test "mips16-branch-absolute-n64-1"
+       run_dump_test "mips16-branch-absolute-n64-2"
        run_dump_test "mips16-branch-absolute-addend-n64"
+       run_dump_test "mips16-branch-absolute-addend-n64-1"
     }
     run_dump_test "mips16-absolute-reloc-0"
     run_dump_test "mips16-absolute-reloc-1"
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-1.d b/gas/testsuite/gas/mips/mips16-branch-absolute-1.d
new file mode 100644 (file)
index 0000000..539bc90
--- /dev/null
@@ -0,0 +1,20 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression 1
+#as: -32
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+       \.\.\.
+[0-9a-f]+ <[^>]*> f7ff 101e    b       00001000 <foo>
+[      ]*[0-9a-f]+: R_MIPS16_PC16_S1   L0\001
+[0-9a-f]+ <[^>]*> f7ff 601e    bteqz   00001004 <foo\+0x4>
+[      ]*[0-9a-f]+: R_MIPS16_PC16_S1   L0\001
+[0-9a-f]+ <[^>]*> f7ff 611e    btnez   00001008 <foo\+0x8>
+[      ]*[0-9a-f]+: R_MIPS16_PC16_S1   L0\001
+[0-9a-f]+ <[^>]*> f7ff 221e    beqz    v0,0000100c <foo\+0xc>
+[      ]*[0-9a-f]+: R_MIPS16_PC16_S1   L0\001
+[0-9a-f]+ <[^>]*> f7ff 2a1e    bnez    v0,00001010 <foo\+0x10>
+[      ]*[0-9a-f]+: R_MIPS16_PC16_S1   L0\001
+[0-9a-f]+ <[^>]*> 6500         nop
+       \.\.\.
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-1.s b/gas/testsuite/gas/mips/mips16-branch-absolute-1.s
new file mode 100644 (file)
index 0000000..dc7ee4d
--- /dev/null
@@ -0,0 +1,22 @@
+       .text
+
+       .space  0x1000
+
+       .set    bar, 0x1235
+
+       .globl  foo
+       .ent    foo
+       .set    mips16
+foo:
+       b       bar
+       bteqz   bar
+       btnez   bar
+       beqz    $2, bar
+       bnez    $2, bar
+       nop
+       .set    nomips16
+       .end    foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+       .align  4, 0
+       .space  16
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-2.d b/gas/testsuite/gas/mips/mips16-branch-absolute-2.d
new file mode 100644 (file)
index 0000000..49a331f
--- /dev/null
@@ -0,0 +1,4 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression 2
+#as: -32
+#dump: mips16-branch-absolute-1.d
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-2.s b/gas/testsuite/gas/mips/mips16-branch-absolute-2.s
new file mode 100644 (file)
index 0000000..64aebb4
--- /dev/null
@@ -0,0 +1,20 @@
+       .text
+
+       .space  0x1000
+
+       .globl  foo
+       .ent    foo
+       .set    mips16
+foo:
+       b       0x1235
+       bteqz   0x1235
+       btnez   0x1235
+       beqz    $2, 0x1235
+       bnez    $2, 0x1235
+       nop
+       .set    nomips16
+       .end    foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+       .align  4, 0
+       .space  16
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.d b/gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.d
new file mode 100644 (file)
index 0000000..66841c3
--- /dev/null
@@ -0,0 +1,4 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression with addend 1
+#as: -32
+#dump: mips16-branch-absolute-1.d
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s b/gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s
new file mode 100644 (file)
index 0000000..e75d7e1
--- /dev/null
@@ -0,0 +1,22 @@
+       .text
+
+       .space  0x1000
+
+       .set    bar, 0x12345679
+
+       .globl  foo
+       .ent    foo
+       .set    mips16
+foo:
+       b       bar + 0x1234
+       bteqz   bar + 0x1234
+       btnez   bar + 0x1234
+       beqz    $2, bar + 0x1234
+       bnez    $2, bar + 0x1234
+       nop
+       .set    nomips16
+       .end    foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+       .align  4, 0
+       .space  16
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-addend-n32-1.d b/gas/testsuite/gas/mips/mips16-branch-absolute-addend-n32-1.d
new file mode 100644 (file)
index 0000000..bf565a3
--- /dev/null
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression with addend 1 (n32)
+#as: -n32 -march=from-abi
+#source: mips16-branch-absolute-addend-1.s
+#dump: mips16-branch-absolute-addend-n32.d
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-addend-n64-1.d b/gas/testsuite/gas/mips/mips16-branch-absolute-addend-n64-1.d
new file mode 100644 (file)
index 0000000..c953821
--- /dev/null
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression with addend 1 (n64)
+#as: -64 -march=from-abi
+#source: mips16-branch-absolute-addend-1.s
+#dump: mips16-branch-absolute-addend-n64.d
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-n32-1.d b/gas/testsuite/gas/mips/mips16-branch-absolute-n32-1.d
new file mode 100644 (file)
index 0000000..543696d
--- /dev/null
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression 1 (n32)
+#as: -n32 -march=from-abi
+#source: mips16-branch-absolute-1.s
+#dump: mips16-branch-absolute-n32.d
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-n32-2.d b/gas/testsuite/gas/mips/mips16-branch-absolute-n32-2.d
new file mode 100644 (file)
index 0000000..5d80db8
--- /dev/null
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression 2 (n32)
+#as: -n32 -march=from-abi
+#source: mips16-branch-absolute-2.s
+#dump: mips16-branch-absolute-n32.d
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-n64-1.d b/gas/testsuite/gas/mips/mips16-branch-absolute-n64-1.d
new file mode 100644 (file)
index 0000000..0ea0c2d
--- /dev/null
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression 1 (n64)
+#as: -64 -march=from-abi
+#source: mips16-branch-absolute-1.s
+#dump: mips16-branch-absolute-n64.d
diff --git a/gas/testsuite/gas/mips/mips16-branch-absolute-n64-2.d b/gas/testsuite/gas/mips/mips16-branch-absolute-n64-2.d
new file mode 100644 (file)
index 0000000..7d338f3
--- /dev/null
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 branch to absolute expression 2 (n64)
+#as: -64 -march=from-abi
+#source: mips16-branch-absolute-2.s
+#dump: mips16-branch-absolute-n64.d
diff --git a/gas/testsuite/gas/mips/mips16-pcrel-absolute-1.d b/gas/testsuite/gas/mips/mips16-pcrel-absolute-1.d
new file mode 100644 (file)
index 0000000..d9f6fb7
--- /dev/null
@@ -0,0 +1,3 @@
+#name: MIPS16 PC-relative reference to absolute expression 1
+#as: -32
+#error-output: mips16-pcrel-absolute-1.l
diff --git a/gas/testsuite/gas/mips/mips16-pcrel-absolute-1.l b/gas/testsuite/gas/mips/mips16-pcrel-absolute-1.l
new file mode 100644 (file)
index 0000000..60054fa
--- /dev/null
@@ -0,0 +1,3 @@
+.*: Assembler messages:
+.*:10: Error: unsupported relocation
+.*:11: Error: unsupported relocation
diff --git a/gas/testsuite/gas/mips/mips16-pcrel-absolute-1.s b/gas/testsuite/gas/mips/mips16-pcrel-absolute-1.s
new file mode 100644 (file)
index 0000000..833a967
--- /dev/null
@@ -0,0 +1,18 @@
+       .text
+
+       .space  0x1000
+
+       .set    bar, 0x1234
+
+       .ent    foo
+       .set    mips16
+foo:
+       la      $2, bar
+       lw      $2, bar
+       nop
+       .set    nomips16
+       .end    foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+       .align  4, 0
+       .space  16
index ff526083a27ab83ac6d4e0e2d46e39b093908ca2..92af8b900036c0aa01581a81e50b2bdfa7ab6925 100644 (file)
@@ -1,3 +1,23 @@
+2017-05-02  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * testsuite/ld-mips-elf/mips16-branch-absolute-1.d: New test.
+       * testsuite/ld-mips-elf/mips16-branch-absolute-2.d: New test.
+       * testsuite/ld-mips-elf/mips16-branch-absolute-addend-1.d: New
+       test.
+       * testsuite/ld-mips-elf/mips16-branch-absolute-n32-1.d: New
+       test.
+       * testsuite/ld-mips-elf/mips16-branch-absolute-n32-2.d: New
+       test.
+       * testsuite/ld-mips-elf/mips16-branch-absolute-addend-n32-1.d:
+       New test.
+       * testsuite/ld-mips-elf/mips16-branch-absolute-n64-1.d: New
+       test.
+       * testsuite/ld-mips-elf/mips16-branch-absolute-n64-2.d: New
+       test.
+       * testsuite/ld-mips-elf/mips16-branch-absolute-addend-n64-1.d:
+       New test.
+       * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
+
 2017-05-02  H.J. Lu  <hongjiu.lu@intel.com>
 
        * testsuite/ld-i386/tls.exp: Add -Wl,--no-as-needed to
index f824e7ca8ad5710c17a55e1a6c9ca9a0844c644d..068ea54c1c6125adc314ceff75f98bd0f74a28cf 100644 (file)
@@ -159,17 +159,33 @@ run_dump_test "mips16-branch-3" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "mips16-branch-addend-2" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "mips16-branch-addend-3" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "mips16-branch-absolute" [list [list ld $abi_ldflags(o32)]]
+run_dump_test "mips16-branch-absolute-1" [list [list ld $abi_ldflags(o32)]]
+run_dump_test "mips16-branch-absolute-2" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "mips16-branch-absolute-addend" \
                                        [list [list ld $abi_ldflags(o32)]]
+run_dump_test "mips16-branch-absolute-addend-1" \
+                                       [list [list ld $abi_ldflags(o32)]]
 if $has_newabi {
     run_dump_test "mips16-branch-absolute-n32" \
                                        [list [list ld $abi_ldflags(n32)]]
+    run_dump_test "mips16-branch-absolute-n32-1" \
+                                       [list [list ld $abi_ldflags(n32)]]
+    run_dump_test "mips16-branch-absolute-n32-2" \
+                                       [list [list ld $abi_ldflags(n32)]]
     run_dump_test "mips16-branch-absolute-addend-n32" \
                                        [list [list ld $abi_ldflags(n32)]]
+    run_dump_test "mips16-branch-absolute-addend-n32-1" \
+                                       [list [list ld $abi_ldflags(n32)]]
     run_dump_test "mips16-branch-absolute-n64" \
                                        [list [list ld $abi_ldflags(n64)]]
+    run_dump_test "mips16-branch-absolute-n64-1" \
+                                       [list [list ld $abi_ldflags(n64)]]
+    run_dump_test "mips16-branch-absolute-n64-2" \
+                                       [list [list ld $abi_ldflags(n64)]]
     run_dump_test "mips16-branch-absolute-addend-n64" \
                                        [list [list ld $abi_ldflags(n64)]]
+    run_dump_test "mips16-branch-absolute-addend-n64-1" \
+                                       [list [list ld $abi_ldflags(n64)]]
 }
 
 run_dump_test "micromips-branch-absolute" [list [list ld $abi_ldflags(o32)]]
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-1.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-1.d
new file mode 100644 (file)
index 0000000..9e0aa5f
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression 1
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-1.s
+#as: -EB -32
+#ld: -EB -Ttext 0 -e foo
+#dump: mips16-branch-absolute.d
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-2.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-2.d
new file mode 100644 (file)
index 0000000..5e7e6f9
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression 2
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-2.s
+#as: -EB -32
+#ld: -EB -Ttext 0 -e foo
+#dump: mips16-branch-absolute.d
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-1.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-1.d
new file mode 100644 (file)
index 0000000..40f6ccb
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression with addend 1
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s
+#as: -EB -32
+#ld: -EB -Ttext 0x12340000 -e foo
+#dump: mips16-branch-absolute-addend.d
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-n32-1.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-n32-1.d
new file mode 100644 (file)
index 0000000..8e833d8
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression with addend 1 (n32)
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x12340000 -e foo
+#dump: mips16-branch-absolute-addend.d
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-n64-1.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-addend-n64-1.d
new file mode 100644 (file)
index 0000000..094b2d0
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression with addend 1 (n64)
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0x12340000 -e foo
+#dump: mips16-branch-absolute-addend.d
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-n32-1.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-n32-1.d
new file mode 100644 (file)
index 0000000..587e79a
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression 1 (n32)
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-1.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0 -e foo
+#dump: mips16-branch-absolute.d
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-n32-2.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-n32-2.d
new file mode 100644 (file)
index 0000000..86c98c3
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression 2 (n32)
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-2.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0 -e foo
+#dump: mips16-branch-absolute.d
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-n64-1.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-n64-1.d
new file mode 100644 (file)
index 0000000..dc067f8
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression 1 (n64)
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-1.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0 -e foo
+#dump: mips16-branch-absolute.d
diff --git a/ld/testsuite/ld-mips-elf/mips16-branch-absolute-n64-2.d b/ld/testsuite/ld-mips-elf/mips16-branch-absolute-n64-2.d
new file mode 100644 (file)
index 0000000..1a6ba3d
--- /dev/null
@@ -0,0 +1,6 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS16 link branch to absolute expression 2 (n64)
+#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-2.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0 -e foo
+#dump: mips16-branch-absolute.d