]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
MIPS/BFD: Correct microMIPS cross-mode BAL to JALX relaxation
authorMaciej W. Rozycki <macro@imgtec.com>
Wed, 30 Aug 2017 15:03:31 +0000 (16:03 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Wed, 30 Aug 2017 15:14:33 +0000 (16:14 +0100)
Fix a bug in commit a6ebf6169a1b ("MIPS: Convert cross-mode BAL to
JALX") and in BFD linker relaxation correct the microMIPS interpretation
of the branch offset, which is supposed to be shifted by 1 bit, rather
than 2 as in the regular MIPS case.

bfd/
* elfxx-mips.c (mips_elf_perform_relocation): Correct microMIPS
branch offset interpretation.

gas/
* testsuite/gas/mips/branch-addend-micromips.d: New test.
* testsuite/gas/mips/branch-addend-micromips-n32.d: New test.
* testsuite/gas/mips/branch-addend-micromips-n64.d: New test.
* testsuite/gas/mips/branch-addend-micromips.s: New test source.
* testsuite/gas/mips/mips.exp: Run the new tests.

ld/
* testsuite/ld-mips-elf/bal-jalx-addend-micromips.d: New test.
* testsuite/ld-mips-elf/bal-jalx-addend-micromips-n32.d: New
test.
* testsuite/ld-mips-elf/bal-jalx-addend-micromips-n64.d: New
test.
* testsuite/ld-mips-elf/bal-jalx-local-micromips.d: New test.
* testsuite/ld-mips-elf/bal-jalx-local-micromips-n32.d: New
test.
* testsuite/ld-mips-elf/bal-jalx-local-micromips-n64.d: New
test.
* testsuite/ld-mips-elf/bal-jalx-pic-micromips.d: New test.
* testsuite/ld-mips-elf/bal-jalx-pic-micromips-n32.d: New test.
* testsuite/ld-mips-elf/bal-jalx-pic-micromips-n64.d: New test.
* testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips.d: New
test.
* testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n32.d: New
test.
* testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n64.d: New
test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.

(cherry picked from commit 70e65ca8e5d1fc984d58f6137c290e807fe772a5)

22 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
gas/ChangeLog
gas/testsuite/gas/mips/branch-addend-micromips-n32.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-addend-micromips-n64.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-addend-micromips.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-addend-micromips.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips.exp
ld/ChangeLog
ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n32.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n64.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n32.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n64.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-local-micromips.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n32.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n64.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n32.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n64.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips-elf.exp

index c90206c2f5074ec51b8c55df8f5abe3ac12d4726..7d997fde558391ba3d79ed78fd3f9251c1aba4ef 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-30  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * elfxx-mips.c (mips_elf_perform_relocation): Correct microMIPS
+       branch offset interpretation.
+
 2017-08-29  Nick Clifton  <nickc@redhat.com>
 
        Import from mainline:
index 2eb3dd3363cc03755b664f4b436e4e69be016b69..2d82832107f56f08c40aa12a920ac08fb5541bae 100644 (file)
@@ -6414,6 +6414,7 @@ mips_elf_perform_relocation (struct bfd_link_info *info,
       bfd_boolean ok = FALSE;
       bfd_vma opcode = x >> 16;
       bfd_vma jalx_opcode = 0;
+      bfd_vma sign_bit = 0;
       bfd_vma addr;
       bfd_vma dest;
 
@@ -6421,12 +6422,14 @@ mips_elf_perform_relocation (struct bfd_link_info *info,
        {
          ok = opcode == 0x4060;
          jalx_opcode = 0x3c;
+         sign_bit = 0x10000;
          value <<= 1;
        }
       else if (r_type == R_MIPS_PC16 || r_type == R_MIPS_GNU_REL16_S2)
        {
          ok = opcode == 0x411;
          jalx_opcode = 0x1d;
+         sign_bit = 0x20000;
          value <<= 2;
        }
 
@@ -6436,7 +6439,8 @@ mips_elf_perform_relocation (struct bfd_link_info *info,
                  + input_section->output_offset
                  + relocation->r_offset
                  + 4);
-         dest = addr + (((value & 0x3ffff) ^ 0x20000) - 0x20000);
+         dest = (addr
+                 + (((value & ((sign_bit << 1) - 1)) ^ sign_bit) - sign_bit));
 
          if ((addr >> 28) << 28 != (dest >> 28) << 28)
            {
index 028a82c70c01a5381954efac99eefc32b3b9ba95..84aad433e2684e0d987dbada7ee2bbb426003024 100644 (file)
@@ -1,3 +1,11 @@
+2017-08-30  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * testsuite/gas/mips/branch-addend-micromips.d: New test.
+       * testsuite/gas/mips/branch-addend-micromips-n32.d: New test.
+       * testsuite/gas/mips/branch-addend-micromips-n64.d: New test.
+       * testsuite/gas/mips/branch-addend-micromips.s: New test source.
+       * testsuite/gas/mips/mips.exp: Run the new tests.
+
 2017-08-30  Maciej W. Rozycki  <macro@imgtec.com>
 
        * config/tc-mips.c (md_convert_frag): Respect
diff --git a/gas/testsuite/gas/mips/branch-addend-micromips-n32.d b/gas/testsuite/gas/mips/branch-addend-micromips-n32.d
new file mode 100644 (file)
index 0000000..085cc22
--- /dev/null
@@ -0,0 +1,23 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: microMIPS BAL addend encoding (n32)
+#as: -n32 -march=from-abi
+#source: branch-addend-micromips.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+       \.\.\.
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009     jalr    zero,ra
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 0000    bal     00001018 <bar\+0x8>
+[      ]*[0-9a-f]+: R_MICROMIPS_PC16_S1        foo\+0xfffc
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 0000    bal     00001020 <bar\+0x10>
+[      ]*[0-9a-f]+: R_MICROMIPS_PC16_S1        bar\+0xfffc
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c    jr      ra
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+       \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-addend-micromips-n64.d b/gas/testsuite/gas/mips/branch-addend-micromips-n64.d
new file mode 100644 (file)
index 0000000..65d0cd2
--- /dev/null
@@ -0,0 +1,27 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: microMIPS BAL addend encoding (n64)
+#as: -64 -march=from-abi
+#source: branch-addend-micromips.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+       \.\.\.
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009     jalr    zero,ra
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 0000    bal     0000000000001018 <bar\+0x8>
+[      ]*[0-9a-f]+: R_MICROMIPS_PC16_S1        foo\+0xfffc
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*\+0xfffc
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*\+0xfffc
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 0000    bal     0000000000001020 <bar\+0x10>
+[      ]*[0-9a-f]+: R_MICROMIPS_PC16_S1        bar\+0xfffc
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*\+0xfffc
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*\+0xfffc
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c    jr      ra
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+       \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-addend-micromips.d b/gas/testsuite/gas/mips/branch-addend-micromips.d
new file mode 100644 (file)
index 0000000..345d9df
--- /dev/null
@@ -0,0 +1,22 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: microMIPS BAL addend encoding
+#as: -32
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+       \.\.\.
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009     jalr    zero,ra
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 7ffe    bal     00011014 <bar\+0x10004>
+[      ]*[0-9a-f]+: R_MICROMIPS_PC16_S1        foo
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 7ffe    bal     0001101c <bar\+0x1000c>
+[      ]*[0-9a-f]+: R_MICROMIPS_PC16_S1        bar
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c    jr      ra
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+       \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-addend-micromips.s b/gas/testsuite/gas/mips/branch-addend-micromips.s
new file mode 100644 (file)
index 0000000..91d7c8f
--- /dev/null
@@ -0,0 +1,31 @@
+       .text
+       .set    noreorder
+       .space  0x1000
+
+       .align  4
+       .set    nomicromips
+       .globl  foo
+       .ent    foo
+foo:
+       nor     $0, $0
+       jalr    $0, $ra
+        nor    $0, $0
+       .end    foo
+
+       .align  4
+       .set    micromips
+       .globl  bar
+       .ent    bar
+bar:
+       nor     $0, $0
+       bal     foo + 0x10000
+        nor    $0, $0
+       bal     bar + 0x10000
+        nor    $0, $0
+       jalr    $0, $ra
+        nor    $0, $0
+       .end    bar
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+       .align  4, 0
+       .space  16
index e67473bfb60dcb20d1eb390128166c7f014c6fc4..c71dca4351d75b7abd746d3a252dd955fbd0836c 100644 (file)
@@ -678,9 +678,12 @@ if { [istarget mips*-*-vxworks*] } {
        run_dump_test "branch-local-n64-7"
     }
     run_dump_test "branch-addend"
+    run_dump_test "branch-addend-micromips"
     if $has_newabi {
        run_dump_test "branch-addend-n32"
+       run_dump_test "branch-addend-micromips-n32"
        run_dump_test "branch-addend-n64"
+       run_dump_test "branch-addend-micromips-n64"
     }
     run_dump_test "branch-absolute"
     run_dump_test "branch-absolute-addend"
index c806a5312b0e43a84222eb364bcb5e51523108bc..23bdba42bf882c8d54258b48e823df8d5b3de8b3 100644 (file)
@@ -1,3 +1,26 @@
+2017-08-30  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * testsuite/ld-mips-elf/bal-jalx-addend-micromips.d: New test.
+       * testsuite/ld-mips-elf/bal-jalx-addend-micromips-n32.d: New
+       test.
+       * testsuite/ld-mips-elf/bal-jalx-addend-micromips-n64.d: New
+       test.
+       * testsuite/ld-mips-elf/bal-jalx-local-micromips.d: New test.
+       * testsuite/ld-mips-elf/bal-jalx-local-micromips-n32.d: New
+       test.
+       * testsuite/ld-mips-elf/bal-jalx-local-micromips-n64.d: New
+       test.
+       * testsuite/ld-mips-elf/bal-jalx-pic-micromips.d: New test.
+       * testsuite/ld-mips-elf/bal-jalx-pic-micromips-n32.d: New test.
+       * testsuite/ld-mips-elf/bal-jalx-pic-micromips-n64.d: New test.
+       * testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips.d: New
+       test.
+       * testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n32.d: New
+       test.
+       * testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n64.d: New
+       test.
+       * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
+
 2017-08-17  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        PR 21961
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n32.d b/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n32.d
new file mode 100644 (file)
index 0000000..9c7aca5
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL/JALX addend calculation (n32)
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: bal-jalx-addend-micromips.d
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n64.d b/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n64.d
new file mode 100644 (file)
index 0000000..e254c65
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL/JALX addend calculation (n64)
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: bal-jalx-addend-micromips.d
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips.d b/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips.d
new file mode 100644 (file)
index 0000000..e066f5d
--- /dev/null
@@ -0,0 +1,22 @@
+#name: microMIPS BAL/JALX addend calculation
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -32
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+       \.\.\.
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009     jalr    zero,ra
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> f300 4400    jalx    0*1c011000 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 7ff8    bal     0*1c011010 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c    jr      ra
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+       \.\.\.
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n32.d b/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n32.d
new file mode 100644 (file)
index 0000000..16fcb0a
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL to JALX conversion for local symbol (n32)
+#source: ../../../gas/testsuite/gas/mips/branch-local-7.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: bal-jalx-local-micromips.d
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n64.d b/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n64.d
new file mode 100644 (file)
index 0000000..d13a9ea
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL to JALX conversion for local symbol (n64)
+#source: ../../../gas/testsuite/gas/mips/branch-local-7.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: bal-jalx-local-micromips.d
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips.d b/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips.d
new file mode 100644 (file)
index 0000000..e944d3b
--- /dev/null
@@ -0,0 +1,20 @@
+#name: microMIPS BAL to JALX conversion for local symbol
+#source: ../../../gas/testsuite/gas/mips/branch-local-7.s
+#as: -EB -32
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+       \.\.\.
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009     jalr    zero,ra
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> f300 0400    jalx    0*1c001000 <foo>
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c    jr      ra
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+       \.\.\.
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n32.d b/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n32.d
new file mode 100644 (file)
index 0000000..9a293c5
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL/JALX in PIC mode (ignore branch ISA, n32)
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000 -shared --ignore-branch-isa
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: bal-jalx-pic-ignore-micromips.d
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n64.d b/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n64.d
new file mode 100644 (file)
index 0000000..2b78bb9
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL/JALX in PIC mode (ignore branch ISA, n64)
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000 -shared --ignore-branch-isa
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: bal-jalx-pic-ignore-micromips.d
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips.d b/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips.d
new file mode 100644 (file)
index 0000000..0b48b3a
--- /dev/null
@@ -0,0 +1,22 @@
+#name: microMIPS BAL/JALX in PIC mode (ignore branch ISA)
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -32
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000 -shared --ignore-branch-isa
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+       \.\.\.
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009     jalr    zero,ra
+[0-9a-f]+ <[^>]*> 00000027     nor     zero,zero,zero
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 7ff4    bal     0*1c011000 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 4060 7ff8    bal     0*1c011010 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c    jr      ra
+[0-9a-f]+ <[^>]*> 0000 02d0    not     zero,zero
+       \.\.\.
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n32.d b/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n32.d
new file mode 100644 (file)
index 0000000..3b25dc7
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL/JALX in PIC mode (n32)
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000 -shared
+#error: \A[^\n]*: In function `bar':\n
+#error:   \(\.text\+0x1014\): Unsupported branch between ISA modes\Z
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n64.d b/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n64.d
new file mode 100644 (file)
index 0000000..d39f114
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL/JALX in PIC mode (n64)
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000 -shared
+#error: \A[^\n]*: In function `bar':\n
+#error:   \(\.text\+0x1014\): Unsupported branch between ISA modes\Z
diff --git a/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips.d b/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips.d
new file mode 100644 (file)
index 0000000..7404d25
--- /dev/null
@@ -0,0 +1,6 @@
+#name: microMIPS BAL/JALX in PIC mode
+#source: ../../../gas/testsuite/gas/mips/branch-addend-micromips.s
+#as: -EB -32
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000 -shared
+#error: \A[^\n]*: In function `bar':\n
+#error:   \(\.text\+0x1014\): Unsupported branch between ISA modes\Z
index 4008da08a5be07ebe5c9a13ab8c856f3c0f1cdad..96f57bf955f41a86aceeac47d580fae00ded028c 100644 (file)
@@ -251,22 +251,43 @@ if { $linux_gnu } {
 run_dump_test "jalx-addend" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "jalx-local" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "bal-jalx-addend" [list [list ld $abi_ldflags(o32)]]
+run_dump_test "bal-jalx-addend-micromips" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "bal-jalx-local" [list [list ld $abi_ldflags(o32)]]
+run_dump_test "bal-jalx-local-micromips" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "bal-jalx-pic" [list [list ld $abi_ldflags(o32)]]
+run_dump_test "bal-jalx-pic-micromips" [list [list ld $abi_ldflags(o32)]]
 run_dump_test "bal-jalx-pic-ignore" [list [list ld $abi_ldflags(o32)]]
+run_dump_test "bal-jalx-pic-ignore-micromips" \
+                                       [list [list ld $abi_ldflags(o32)]]
 if $has_newabi {
     run_dump_test "jalx-addend-n32" [list [list ld $abi_ldflags(n32)]]
     run_dump_test "jalx-local-n32" [list [list ld $abi_ldflags(n32)]]
     run_dump_test "bal-jalx-addend-n32" [list [list ld $abi_ldflags(n32)]]
+    run_dump_test "bal-jalx-addend-micromips-n32" \
+                                       [list [list ld $abi_ldflags(n32)]]
     run_dump_test "bal-jalx-local-n32" [list [list ld $abi_ldflags(n32)]]
+    run_dump_test "bal-jalx-local-micromips-n32" \
+                                       [list [list ld $abi_ldflags(n32)]]
     run_dump_test "bal-jalx-pic-n32" [list [list ld $abi_ldflags(n32)]]
+    run_dump_test "bal-jalx-pic-micromips-n32" \
+                                       [list [list ld $abi_ldflags(n32)]]
     run_dump_test "bal-jalx-pic-ignore-n32" [list [list ld $abi_ldflags(n32)]]
+    run_dump_test "bal-jalx-pic-ignore-micromips-n32" \
+                                       [list [list ld $abi_ldflags(n32)]]
     run_dump_test "jalx-addend-n64" [list [list ld $abi_ldflags(n64)]]
     run_dump_test "jalx-local-n64" [list [list ld $abi_ldflags(n64)]]
     run_dump_test "bal-jalx-addend-n64" [list [list ld $abi_ldflags(n64)]]
+    run_dump_test "bal-jalx-addend-micromips-n64" \
+                                       [list [list ld $abi_ldflags(n64)]]
     run_dump_test "bal-jalx-local-n64" [list [list ld $abi_ldflags(n64)]]
+    run_dump_test "bal-jalx-local-micromips-n64" \
+                                       [list [list ld $abi_ldflags(n64)]]
     run_dump_test "bal-jalx-pic-n64" [list [list ld $abi_ldflags(n64)]]
+    run_dump_test "bal-jalx-pic-micromips-n64" \
+                                       [list [list ld $abi_ldflags(n64)]]
     run_dump_test "bal-jalx-pic-ignore-n64" [list [list ld $abi_ldflags(n64)]]
+    run_dump_test "bal-jalx-pic-ignore-micromips-n64" \
+                                       [list [list ld $abi_ldflags(n64)]]
 }
 
 run_dump_test "unaligned-jalx-0" [list [list ld $abi_ldflags(o32)]]