MIPS16/GAS: Fix assertion failures with relocations on 16-bit instructions
authorMaciej W. Rozycki <macro@imgtec.com>
Wed, 14 Dec 2016 21:20:01 +0000 (21:20 +0000)
committerMaciej W. Rozycki <macro@imgtec.com>
Wed, 14 Dec 2016 22:05:38 +0000 (22:05 +0000)
Complement commit c9775dde3277 ("MIPS16: Add R_MIPS16_PC16_S1 branch
relocation support)" and report an assembly error when a relocation is
required for an instruction, currently a branch only, that has been
forced to use its unextended encoding, either with the use of an
explicit `.t' mnemonic suffix, or by means of `.set noautoextend' being
active, fixing an assertion failure currently caused instead.

gas/
* config/tc-mips.c (md_convert_frag): Report an error instead of
asserting on `ext'.
* testsuite/gas/mips/mips16-branch-unextended-1.d: New test.
* testsuite/gas/mips/mips16-branch-unextended-2.d: New test.
* testsuite/gas/mips/mips16-branch-unextended-1.s: New test
source.
* testsuite/gas/mips/mips16-branch-unextended-2.s: New test.
* testsuite/gas/mips/mips16-branch-unextended.l: New stderr
output.
* testsuite/gas/mips/mips.exp: Run the new tests.

gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips16-branch-unextended-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-unextended-1.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-unextended-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-unextended-2.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-branch-unextended.l [new file with mode: 0644]

index 742da3ecfd189e5bb466b85cef35d9d88c97b5fc..8a41fc7f65a055861c9a7f4b4b9b615c3e0a9a69 100644 (file)
@@ -1,3 +1,16 @@
+2016-12-14  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * config/tc-mips.c (md_convert_frag): Report an error instead of
+       asserting on `ext'.
+       * testsuite/gas/mips/mips16-branch-unextended-1.d: New test.
+       * testsuite/gas/mips/mips16-branch-unextended-2.d: New test.
+       * testsuite/gas/mips/mips16-branch-unextended-1.s: New test
+       source.
+       * testsuite/gas/mips/mips16-branch-unextended-2.s: New test.
+       * testsuite/gas/mips/mips16-branch-unextended.l: New stderr
+       output.
+       * testsuite/gas/mips/mips.exp: Run the new tests.
+
 2016-12-14  Maciej W. Rozycki  <macro@imgtec.com>
 
        * testsuite/gas/mips/mips16-sprel-swap.d: New test.
index 4288d96271f7efdcf54379cbd5a0c7c84de020e5..1241b9c1e5d343d716eee006a5a399dc33ed45f2 100644 (file)
@@ -18369,10 +18369,10 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
                            _("unsupported relocation"));
              break;
            }
-         if (reloc != BFD_RELOC_NONE)
+         if (reloc == BFD_RELOC_NONE)
+           ;
+         else if (ext)
            {
-             gas_assert (ext);
-
              exp.X_op = O_symbol;
              exp.X_add_symbol = fragp->fr_symbol;
              exp.X_add_number = fragp->fr_offset;
@@ -18387,6 +18387,9 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
                 in 2 octets.  */
              fixp->fx_no_overflow = 1;
            }
+         else
+           as_bad_where (fragp->fr_file, fragp->fr_line,
+                         _("invalid unextended operand value"));
        }
       else
        mips16_immed (fragp->fr_file, fragp->fr_line, type,
index da8d5693db4f6f8f736c00472062614a350098ba..d3809e7b327d444ac3f1f2186422ac670f31c2f3 100644 (file)
@@ -1298,6 +1298,9 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "mips16-extend"
     run_dump_test "mips16-sprel-swap"
 
+    run_dump_test "mips16-branch-unextended-1"
+    run_dump_test "mips16-branch-unextended-2"
+
     run_dump_test "vxworks1"
     run_dump_test "vxworks1-xgot"
     run_dump_test "vxworks1-el"
diff --git a/gas/testsuite/gas/mips/mips16-branch-unextended-1.d b/gas/testsuite/gas/mips/mips16-branch-unextended-1.d
new file mode 100644 (file)
index 0000000..9bccd02
--- /dev/null
@@ -0,0 +1,3 @@
+#name: MIPS16 unextended branch instructions with relocation 1
+#as: -32
+#error-output: mips16-branch-unextended.l
diff --git a/gas/testsuite/gas/mips/mips16-branch-unextended-1.s b/gas/testsuite/gas/mips/mips16-branch-unextended-1.s
new file mode 100644 (file)
index 0000000..3e59588
--- /dev/null
@@ -0,0 +1,8 @@
+       .set    mips16
+       .set    noautoextend
+foo:
+       beqz    $2, baz
+       bnez    $3, baz
+       bteqz   baz
+       btnez   baz
+       b       baz
diff --git a/gas/testsuite/gas/mips/mips16-branch-unextended-2.d b/gas/testsuite/gas/mips/mips16-branch-unextended-2.d
new file mode 100644 (file)
index 0000000..b64ee5a
--- /dev/null
@@ -0,0 +1,3 @@
+#name: MIPS16 unextended branch instructions with relocation 2
+#as: -32
+#error-output: mips16-branch-unextended.l
diff --git a/gas/testsuite/gas/mips/mips16-branch-unextended-2.s b/gas/testsuite/gas/mips/mips16-branch-unextended-2.s
new file mode 100644 (file)
index 0000000..1bc4282
--- /dev/null
@@ -0,0 +1,8 @@
+       .set    mips16
+       .set    autoextend
+foo:
+       beqz.t  $2, baz
+       bnez.t  $3, baz
+       bteqz.t baz
+       btnez.t baz
+       b.t     baz
diff --git a/gas/testsuite/gas/mips/mips16-branch-unextended.l b/gas/testsuite/gas/mips/mips16-branch-unextended.l
new file mode 100644 (file)
index 0000000..611901c
--- /dev/null
@@ -0,0 +1,6 @@
+.*: Assembler messages:
+.*:4: Error: invalid unextended operand value
+.*:5: Error: invalid unextended operand value
+.*:6: Error: invalid unextended operand value
+.*:7: Error: invalid unextended operand value
+.*:8: Error: invalid unextended operand value