aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@imgtec.com>2017-08-30 16:03:31 +0100
committerMaciej W. Rozycki <macro@imgtec.com>2017-08-30 16:07:45 +0100
commit70e65ca8e5d1fc984d58f6137c290e807fe772a5 (patch)
tree0943c3adf717058f551e0ef7fd3d1319da584b59
parent37b2d327512baf2f39020e44958fd1f11db46a91 (diff)
downloadfsf-binutils-gdb-70e65ca8e5d1fc984d58f6137c290e807fe772a5.zip
fsf-binutils-gdb-70e65ca8e5d1fc984d58f6137c290e807fe772a5.tar.gz
fsf-binutils-gdb-70e65ca8e5d1fc984d58f6137c290e807fe772a5.tar.bz2
MIPS/BFD: Correct microMIPS cross-mode BAL to JALX relaxation
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.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elfxx-mips.c6
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/testsuite/gas/mips/branch-addend-micromips-n32.d23
-rw-r--r--gas/testsuite/gas/mips/branch-addend-micromips-n64.d27
-rw-r--r--gas/testsuite/gas/mips/branch-addend-micromips.d22
-rw-r--r--gas/testsuite/gas/mips/branch-addend-micromips.s31
-rw-r--r--gas/testsuite/gas/mips/mips.exp3
-rw-r--r--ld/ChangeLog23
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n32.d6
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n64.d6
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips.d22
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n32.d6
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n64.d6
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-local-micromips.d20
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n32.d6
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n64.d6
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips.d22
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n32.d6
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n64.d6
-rw-r--r--ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips.d6
-rw-r--r--ld/testsuite/ld-mips-elf/mips-elf.exp21
22 files changed, 286 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4882260..f52e75d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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-30 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/22032
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index fddf68c..6a4d3e1 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -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)
{
diff --git a/gas/ChangeLog b/gas/ChangeLog
index a71ed28..b498d2e 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,13 @@
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
`mips_ignore_branch_isa'.
* testsuite/gas/mips/branch-local-5.d: New test.
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
index 0000000..085cc22
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-addend-micromips-n32.d
@@ -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
index 0000000..65d0cd2
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-addend-micromips-n64.d
@@ -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
index 0000000..345d9df
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-addend-micromips.d
@@ -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
index 0000000..91d7c8f
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-addend-micromips.s
@@ -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
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index e67473b..c71dca4 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -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"
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 9e697e6..8b01f54 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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-30 Alan Modra <amodra@gmail.com>
* testsuite/ld-powerpc/tls.s: Add calls with tls markers.
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
index 0000000..9c7aca5
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n32.d
@@ -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
index 0000000..e254c65
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips-n64.d
@@ -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
index 0000000..e066f5d
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-addend-micromips.d
@@ -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
index 0000000..16fcb0a
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n32.d
@@ -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
index 0000000..d13a9ea
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips-n64.d
@@ -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
index 0000000..e944d3b
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-local-micromips.d
@@ -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
index 0000000..9a293c5
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n32.d
@@ -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
index 0000000..2b78bb9
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips-n64.d
@@ -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
index 0000000..0b48b3a
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-micromips.d
@@ -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
index 0000000..3b25dc7
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n32.d
@@ -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
index 0000000..d39f114
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips-n64.d
@@ -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
index 0000000..7404d25
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/bal-jalx-pic-micromips.d
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
index 4008da0..96f57bf 100644
--- a/ld/testsuite/ld-mips-elf/mips-elf.exp
+++ b/ld/testsuite/ld-mips-elf/mips-elf.exp
@@ -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)]]