diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 14 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 12 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/micromips@relax-offset.d | 26 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/mips.exp | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/mips1@relax-offset.d | 30 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/r3000@relax-offset.d | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/r3900@relax-offset.d | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/relax-offset.d | 28 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/relax-offset.l | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/relax-offset.s | 23 |
10 files changed, 137 insertions, 12 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 9989f31..7dad341 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,17 @@ +2017-06-30 Maciej W. Rozycki <macro@imgtec.com> + + * config/tc-mips.c (md_convert_frag): Don't make a helper + expression symbol for `fix_new_exp' called with a non-zero + offset. + * testsuite/gas/mips/relax-offset.d: New test. + * testsuite/gas/mips/mips1@relax-offset.d: New test. + * testsuite/gas/mips/r3000@relax-offset.d: New test. + * testsuite/gas/mips/r3900@relax-offset.d: New test. + * testsuite/gas/mips/micromips@relax-offset.d: New test. + * testsuite/gas/mips/relax-offset.l: New stderr output. + * testsuite/gas/mips/relax-offset.s: New test source. + * testsuite/gas/mips/mips.exp: Run the new tests. + 2017-06-30 Georg-Johann Lay <avr@gjlay.de> PR gas/21683 diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 1d477a1..3682cd5 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -18289,12 +18289,6 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp) exp.X_add_symbol = fragp->fr_symbol; exp.X_add_number = fragp->fr_offset; - if (fragp->fr_offset) - { - exp.X_add_symbol = make_expr_symbol (&exp); - exp.X_add_number = 0; - } - fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE, BFD_RELOC_MIPS_GOT16); fixp->fx_file = fragp->fr_file; @@ -18548,12 +18542,6 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp) insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000; insn |= at << MICROMIPSOP_SH_RT; - if (exp.X_add_number) - { - exp.X_add_symbol = make_expr_symbol (&exp); - exp.X_add_number = 0; - } - fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE, BFD_RELOC_MICROMIPS_GOT16); fixp->fx_file = fragp->fr_file; diff --git a/gas/testsuite/gas/mips/micromips@relax-offset.d b/gas/testsuite/gas/mips/micromips@relax-offset.d new file mode 100644 index 0000000..95fbf11 --- /dev/null +++ b/gas/testsuite/gas/mips/micromips@relax-offset.d @@ -0,0 +1,26 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS PIC branch relaxation with offset +#as: -32 -relax-branch +#stderr: relax-offset.l +#source: relax-offset.s + +.*: +file format .*mips.* + +Disassembly of section \.text: +[0-9a-f]+ <[^>]*> 41bc 0000 lui gp,0x0 +[ ]*[0-9a-f]+: R_MICROMIPS_HI16 _gp_disp +[0-9a-f]+ <[^>]*> 339c 0000 addiu gp,gp,0 +[ ]*[0-9a-f]+: R_MICROMIPS_LO16 _gp_disp +[0-9a-f]+ <[^>]*> 033c e150 addu gp,gp,t9 +[0-9a-f]+ <[^>]*> 40a4 fffe bnezc a0,0000000c <foo\+0xc> +[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 .* +[0-9a-f]+ <[^>]*> fc3c 0002 lw at,2\(gp\) +[ ]*[0-9a-f]+: R_MICROMIPS_GOT16 \.text +[0-9a-f]+ <[^>]*> 3021 0025 addiu at,at,37 +[ ]*[0-9a-f]+: R_MICROMIPS_LO16 \.text +[0-9a-f]+ <[^>]*> 45a1 jrc at +[0-9a-f]+ <[^>]*> 45bf jrc ra + \.\.\. +[0-9a-f]+ <[^>]*> 0000 8b7c syscall +[0-9a-f]+ <[^>]*> 45bf jrc ra + \.\.\. diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index 81dfd34..0ea9f61 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -1069,6 +1069,8 @@ if { [istarget mips*-*-vxworks*] } { run_dump_test_arches "relax" [mips_arch_list_matching mips2 !mips32r6] run_dump_test_arches "relax-at" [mips_arch_list_matching mips2 !mips32r6] + run_dump_test_arches "relax-offset" [mips_arch_list_matching mips1 \ + !mips32r6] run_dump_test "relax-swap1-mips1" run_dump_test "relax-swap1-mips2" run_dump_test "relax-swap2" diff --git a/gas/testsuite/gas/mips/mips1@relax-offset.d b/gas/testsuite/gas/mips/mips1@relax-offset.d new file mode 100644 index 0000000..bd38410 --- /dev/null +++ b/gas/testsuite/gas/mips/mips1@relax-offset.d @@ -0,0 +1,30 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS PIC branch relaxation with offset +#as: -32 -relax-branch +#stderr: relax-offset.l +#source: relax-offset.s + +.*: +file format .*mips.* + +Disassembly of section \.text: +[0-9a-f]+ <[^>]*> 3c1c0000 lui gp,0x0 +[ ]*[0-9a-f]+: R_MIPS_HI16 _gp_disp +[0-9a-f]+ <[^>]*> 279c0000 addiu gp,gp,0 +[ ]*[0-9a-f]+: R_MIPS_LO16 _gp_disp +[0-9a-f]+ <[^>]*> 0399e021 addu gp,gp,t9 +[0-9a-f]+ <[^>]*> 14800005 bnez a0,00000024 <foo\+0x24> +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 8f810002 lw at,2\(gp\) +[ ]*[0-9a-f]+: R_MIPS_GOT16 \.text +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 24210034 addiu at,at,52 +[ ]*[0-9a-f]+: R_MIPS_LO16 \.text +[0-9a-f]+ <[^>]*> 00200008 jr at +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03e00008 jr ra +[0-9a-f]+ <[^>]*> 00000000 nop + \.\.\. +[0-9a-f]+ <[^>]*> 0000000c syscall +[0-9a-f]+ <[^>]*> 03e00008 jr ra +[0-9a-f]+ <[^>]*> 00000000 nop + \.\.\. diff --git a/gas/testsuite/gas/mips/r3000@relax-offset.d b/gas/testsuite/gas/mips/r3000@relax-offset.d new file mode 100644 index 0000000..d726d32 --- /dev/null +++ b/gas/testsuite/gas/mips/r3000@relax-offset.d @@ -0,0 +1,6 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS PIC branch relaxation with offset +#as: -32 -relax-branch +#stderr: relax-offset.l +#source: relax-offset.s +#dump: mips1@relax-offset.d diff --git a/gas/testsuite/gas/mips/r3900@relax-offset.d b/gas/testsuite/gas/mips/r3900@relax-offset.d new file mode 100644 index 0000000..d726d32 --- /dev/null +++ b/gas/testsuite/gas/mips/r3900@relax-offset.d @@ -0,0 +1,6 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS PIC branch relaxation with offset +#as: -32 -relax-branch +#stderr: relax-offset.l +#source: relax-offset.s +#dump: mips1@relax-offset.d diff --git a/gas/testsuite/gas/mips/relax-offset.d b/gas/testsuite/gas/mips/relax-offset.d new file mode 100644 index 0000000..e7f36e2 --- /dev/null +++ b/gas/testsuite/gas/mips/relax-offset.d @@ -0,0 +1,28 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS PIC branch relaxation with offset +#as: -32 -relax-branch +#stderr: relax-offset.l + +.*: +file format .*mips.* + +Disassembly of section \.text: +[0-9a-f]+ <[^>]*> 3c1c0000 lui gp,0x0 +[ ]*[0-9a-f]+: R_MIPS_HI16 _gp_disp +[0-9a-f]+ <[^>]*> 279c0000 addiu gp,gp,0 +[ ]*[0-9a-f]+: R_MIPS_LO16 _gp_disp +[0-9a-f]+ <[^>]*> 0399e021 addu gp,gp,t9 +[0-9a-f]+ <[^>]*> 14800004 bnez a0,00000020 <foo\+0x20> +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 8f810002 lw at,2\(gp\) +[ ]*[0-9a-f]+: R_MIPS_GOT16 \.text +[0-9a-f]+ <[^>]*> 24210034 addiu at,at,52 +[ ]*[0-9a-f]+: R_MIPS_LO16 \.text +[0-9a-f]+ <[^>]*> 00200008 jr at +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03e00008 jr ra +[0-9a-f]+ <[^>]*> 00000000 nop + \.\.\. +[0-9a-f]+ <[^>]*> 0000000c syscall +[0-9a-f]+ <[^>]*> 03e00008 jr ra +[0-9a-f]+ <[^>]*> 00000000 nop + \.\.\. diff --git a/gas/testsuite/gas/mips/relax-offset.l b/gas/testsuite/gas/mips/relax-offset.l new file mode 100644 index 0000000..570a783 --- /dev/null +++ b/gas/testsuite/gas/mips/relax-offset.l @@ -0,0 +1,2 @@ +.*: Assembler messages: +.*:10: Warning: relaxed out-of-range branch into a jump diff --git a/gas/testsuite/gas/mips/relax-offset.s b/gas/testsuite/gas/mips/relax-offset.s new file mode 100644 index 0000000..6255322 --- /dev/null +++ b/gas/testsuite/gas/mips/relax-offset.s @@ -0,0 +1,23 @@ + .abicalls + + .align 4, 0 + .globl foo + .ent foo +foo: + .set noreorder + .cpload $25 + .set reorder + beq $4, $0, bar + 4 + jr $31 + + .space 131072 + + .align 4, 0 +bar: + syscall + jr $31 + .end foo + +# Force some (non-delay-slot) zero bytes, to make 'objdump' print ... + .space 16 + .align 4, 0 |