diff options
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 12 | ||||
-rw-r--r-- | gas/ChangeLog | 16 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 13 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/jalx-addend-n32.d | 29 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/jalx-addend-n64.d | 37 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/jalx-addend.d | 28 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/jalx-addend.s | 35 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/jalx-imm-n32.d | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/jalx-imm-n64.d | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/jalx-imm.d | 24 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/jalx-imm.s | 35 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/mips.exp | 8 | ||||
-rw-r--r-- | ld/ChangeLog | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/jalx-addend-n32.d | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/jalx-addend-n64.d | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/jalx-addend.d | 26 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/mips-elf.exp | 6 |
18 files changed, 300 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 64aac63..1a9eeb6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2016-05-20 Maciej W. Rozycki <macro@imgtec.com> + + * elfxx-mips.c (mips_elf_read_rel_addend): Adjust the addend for + microMIPS JALX. + 2016-05-19 H.J. Lu <hongjiu.lu@intel.com> PR ld/20117 diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index cb775bb..b561b43 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -7780,16 +7780,24 @@ mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel, bfd_byte *location; unsigned int r_type; bfd_vma addend; + bfd_vma bytes; r_type = ELF_R_TYPE (abfd, rel->r_info); location = contents + rel->r_offset; /* Get the addend, which is stored in the input file. */ _bfd_mips_elf_reloc_unshuffle (abfd, r_type, FALSE, location); - addend = mips_elf_obtain_contents (howto, rel, abfd, contents); + bytes = mips_elf_obtain_contents (howto, rel, abfd, contents); _bfd_mips_elf_reloc_shuffle (abfd, r_type, FALSE, location); - return addend & howto->src_mask; + addend = bytes & howto->src_mask; + + /* Shift is 2, unusually, for microMIPS JALX. Adjust the addend + accordingly. */ + if (r_type == R_MICROMIPS_26_S1 && (bytes >> 26) == 0x3c) + addend <<= 1; + + return addend; } /* REL is a relocation in ABFD that needs a partnering LO16 relocation diff --git a/gas/ChangeLog b/gas/ChangeLog index 98947c1..5d5672e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,21 @@ 2016-05-20 Maciej W. Rozycki <macro@imgtec.com> + * config/tc-mips.c (append_insn): Correct the encoding of a + constant argument for microMIPS JALX. + (tc_gen_reloc): Correct the encoding of an in-place addend for + microMIPS JALX. + * testsuite/gas/mips/jalx-addend.d: New test. + * testsuite/gas/mips/jalx-addend-n32.d: New test. + * testsuite/gas/mips/jalx-addend-n64.d: New test. + * testsuite/gas/mips/jalx-imm.d: New test. + * testsuite/gas/mips/jalx-imm-n32.d: New test. + * testsuite/gas/mips/jalx-imm-n64.d: New test. + * testsuite/gas/mips/jalx-addend.s: New test source. + * testsuite/gas/mips/jalx-imm.s: New test source. + * testsuite/gas/mips/mips.exp: Run the new tests. + +2016-05-20 Maciej W. Rozycki <macro@imgtec.com> + * config/tc-mips.c: Correct tab-after-space formatting mistakes throughout. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index ccdda0c..233c641 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -7044,7 +7044,9 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr, { int shift; - shift = mips_opts.micromips ? 1 : 2; + /* Shift is 2, unusually, for microMIPS JALX. */ + shift = (mips_opts.micromips + && strcmp (ip->insn_mo->name, "jalx") != 0) ? 1 : 2; if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0) as_bad (_("jump to misaligned address (0x%lx)"), (unsigned long) address_expr->X_add_number); @@ -17225,6 +17227,15 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) Relocations want only the symbol offset. */ reloc->addend = fixp->fx_addnumber + reloc->address; } + else if (HAVE_IN_PLACE_ADDENDS + && fixp->fx_r_type == BFD_RELOC_MICROMIPS_JMP + && (read_compressed_insn (fixp->fx_frag->fr_literal + + fixp->fx_where, 4) >> 26) == 0x3c) + { + /* Shift is 2, unusually, for microMIPS JALX. Adjust the in-place + addend accordingly. */ + reloc->addend = fixp->fx_addnumber >> 1; + } else reloc->addend = fixp->fx_addnumber; diff --git a/gas/testsuite/gas/mips/jalx-addend-n32.d b/gas/testsuite/gas/mips/jalx-addend-n32.d new file mode 100644 index 0000000..1abb246 --- /dev/null +++ b/gas/testsuite/gas/mips/jalx-addend-n32.d @@ -0,0 +1,29 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JAL/JALX addend encoding (n32) +#as: -n32 -march=from-abi +#source: jalx-addend.s + +.*: +file format .*mips.* + +Disassembly of section \.text: + \.\.\. +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f400 0000 jal 00000000 <foo-0x1000> +[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 foo-0x3fffffe +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f000 0000 jalx 00000000 <foo-0x1000> +[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 bar-0x7fffffc +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 0000 0000 nop +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 74000000 jalx 00000000 <foo-0x1000> +[ ]*[0-9a-f]+: R_MIPS_26 foo-0x7fffffc +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 0c000000 jal 00000000 <foo-0x1000> +[ ]*[0-9a-f]+: R_MIPS_26 bar-0x7fffffc +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero + \.\.\. diff --git a/gas/testsuite/gas/mips/jalx-addend-n64.d b/gas/testsuite/gas/mips/jalx-addend-n64.d new file mode 100644 index 0000000..469261f --- /dev/null +++ b/gas/testsuite/gas/mips/jalx-addend-n64.d @@ -0,0 +1,37 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JAL/JALX addend encoding (n64) +#as: -64 -march=from-abi +#source: jalx-addend.s + +.*: +file format .*mips.* + +Disassembly of section \.text: + \.\.\. +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f400 0000 jal 0000000000000000 <foo-0x1000> +[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 foo-0x3fffffe +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x3fffffe +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x3fffffe +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f000 0000 jalx 0000000000000000 <foo-0x1000> +[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 bar-0x7fffffc +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 0000 0000 nop +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 74000000 jalx 0000000000000000 <foo-0x1000> +[ ]*[0-9a-f]+: R_MIPS_26 foo-0x7fffffc +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 0c000000 jal 0000000000000000 <foo-0x1000> +[ ]*[0-9a-f]+: R_MIPS_26 bar-0x7fffffc +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero + \.\.\. diff --git a/gas/testsuite/gas/mips/jalx-addend.d b/gas/testsuite/gas/mips/jalx-addend.d new file mode 100644 index 0000000..442bc69 --- /dev/null +++ b/gas/testsuite/gas/mips/jalx-addend.d @@ -0,0 +1,28 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JAL/JALX addend encoding +#as: -32 + +.*: +file format .*mips.* + +Disassembly of section \.text: + \.\.\. +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f600 0001 jal 04000002 <bar\+0x3ffefe2> +[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 foo +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f200 0001 jalx 08000004 <bar\+0x7ffefe4> +[ ]*[0-9a-f]+: R_MICROMIPS_26_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 +[0-9a-f]+ <[^>]*> 0000 0000 nop +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 76000001 jalx 08000004 <bar\+0x7ffefe4> +[ ]*[0-9a-f]+: R_MIPS_26 foo +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 0e000001 jal 08000004 <bar\+0x7ffefe4> +[ ]*[0-9a-f]+: R_MIPS_26 bar +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero + \.\.\. diff --git a/gas/testsuite/gas/mips/jalx-addend.s b/gas/testsuite/gas/mips/jalx-addend.s new file mode 100644 index 0000000..b9b0db3 --- /dev/null +++ b/gas/testsuite/gas/mips/jalx-addend.s @@ -0,0 +1,35 @@ + .text + .set noreorder + .space 0x1000 + + .align 4 + .set micromips + .globl foo + .ent foo +foo: + nor $0, $0 + jal foo - 0x3fffffe + nor $0, $0 + jalx bar - 0x7fffffc + nor $0, $0 + jalr $0, $ra + nor $0, $0 + .end foo + + .align 4 + .set nomicromips + .globl bar + .ent bar +bar: + nor $0, $0 + jalx foo - 0x7fffffc + nor $0, $0 + jal bar - 0x7fffffc + 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/jalx-imm-n32.d b/gas/testsuite/gas/mips/jalx-imm-n32.d new file mode 100644 index 0000000..188bb49 --- /dev/null +++ b/gas/testsuite/gas/mips/jalx-imm-n32.d @@ -0,0 +1,5 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JAL/JALX immediate operand encoding (n32) +#as: -n32 -march=from-abi +#source: jalx-imm.s +#dump: jalx-imm.d diff --git a/gas/testsuite/gas/mips/jalx-imm-n64.d b/gas/testsuite/gas/mips/jalx-imm-n64.d new file mode 100644 index 0000000..7b0c23e --- /dev/null +++ b/gas/testsuite/gas/mips/jalx-imm-n64.d @@ -0,0 +1,5 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JAL/JALX immediate operand encoding (n64) +#as: -64 -march=from-abi +#source: jalx-imm.s +#dump: jalx-imm.d diff --git a/gas/testsuite/gas/mips/jalx-imm.d b/gas/testsuite/gas/mips/jalx-imm.d new file mode 100644 index 0000000..aa487ff --- /dev/null +++ b/gas/testsuite/gas/mips/jalx-imm.d @@ -0,0 +1,24 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JAL/JALX immediate operand encoding +#as: -32 + +.*: +file format .*mips.* + +Disassembly of section \.text: + \.\.\. +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f600 0001 jal 0+4000002 <bar\+0x3ffefe2> +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f200 0001 jalx 0+8000004 <bar\+0x7ffefe4> +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 0000 0000 nop +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 76000001 jalx 0+8000004 <bar\+0x7ffefe4> +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 0e000001 jal 0+8000004 <bar\+0x7ffefe4> +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero + \.\.\. diff --git a/gas/testsuite/gas/mips/jalx-imm.s b/gas/testsuite/gas/mips/jalx-imm.s new file mode 100644 index 0000000..eef8717 --- /dev/null +++ b/gas/testsuite/gas/mips/jalx-imm.s @@ -0,0 +1,35 @@ + .text + .set noreorder + .space 0x1000 + + .align 4 + .set micromips + .globl foo + .ent foo +foo: + nor $0, $0 + jal 0x4000002 + nor $0, $0 + jalx 0x8000004 + nor $0, $0 + jalr $0, $ra + nor $0, $0 + .end foo + + .align 4 + .set nomicromips + .globl bar + .ent bar +bar: + nor $0, $0 + jalx 0x8000004 + nor $0, $0 + jal 0x8000004 + 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 88d15c8..1b1ac02 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -794,6 +794,14 @@ if { [istarget mips*-*-vxworks*] } { run_dump_test "mips16-jalx" run_dump_test "mips-jalx" run_dump_test "mips-jalx-2" + run_dump_test "jalx-imm" + run_dump_test "jalx-addend" + if $has_newabi { + run_dump_test "jalx-imm-n32" + run_dump_test "jalx-addend-n32" + run_dump_test "jalx-imm-n64" + run_dump_test "jalx-addend-n64" + } # Check MIPS16 HI16/LO16 relocations run_dump_test "mips16-hilo" if $has_newabi { diff --git a/ld/ChangeLog b/ld/ChangeLog index 638f38b..334d49a 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2016-05-20 Maciej W. Rozycki <macro@imgtec.com> + + * testsuite/ld-mips-elf/jalx-addend.d: New test. + * testsuite/ld-mips-elf/jalx-addend-n32.d: New test. + * testsuite/ld-mips-elf/jalx-addend-n64.d: New test. + * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests. + 2016-05-19 H.J. Lu <hongjiu.lu@intel.com> PR ld/20117 diff --git a/ld/testsuite/ld-mips-elf/jalx-addend-n32.d b/ld/testsuite/ld-mips-elf/jalx-addend-n32.d new file mode 100644 index 0000000..a364422 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/jalx-addend-n32.d @@ -0,0 +1,6 @@ +#name: MIPS JAL/JALX addend calculation (n32) +#source: ../../../gas/testsuite/gas/mips/jalx-addend.s +#as: -EB -n32 -march=from-abi +#ld: -EB -Ttext 0x1c000000 -e 0x1c000000 +#objdump: -dr --prefix-addresses --show-raw-insn +#dump: jalx-addend.d diff --git a/ld/testsuite/ld-mips-elf/jalx-addend-n64.d b/ld/testsuite/ld-mips-elf/jalx-addend-n64.d new file mode 100644 index 0000000..b6884c5 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/jalx-addend-n64.d @@ -0,0 +1,6 @@ +#name: MIPS JAL/JALX addend calculation (n64) +#source: ../../../gas/testsuite/gas/mips/jalx-addend.s +#as: -EB -64 -march=from-abi +#ld: -EB -Ttext 0x1c000000 -e 0x1c000000 +#objdump: -dr --prefix-addresses --show-raw-insn +#dump: jalx-addend.d diff --git a/ld/testsuite/ld-mips-elf/jalx-addend.d b/ld/testsuite/ld-mips-elf/jalx-addend.d new file mode 100644 index 0000000..39cf6f9 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/jalx-addend.d @@ -0,0 +1,26 @@ +#name: MIPS JAL/JALX addend calculation +#source: ../../../gas/testsuite/gas/mips/jalx-addend.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]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f400 0801 jal 0*18001002 <.*> +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> f100 0409 jalx 0*14001024 <.*> +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 0000 0000 nop +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 75000401 jalx 0*14001004 <.*> +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 0d000409 jal 0*14001024 <.*> +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero +[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra +[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero + \.\.\. diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index 4467719..741f2e2 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -168,6 +168,12 @@ if { $linux_gnu } { "jalx-2"]] } +run_dump_test "jalx-addend" [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-addend-n64" [list [list ld $abi_ldflags(n64)]] +} + # Test multi-got link. We only do this on GNU/Linux because it requires # the "traditional" emulations. if { $linux_gnu } { |