aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog14
-rw-r--r--gas/config/tc-mips.c12
-rw-r--r--gas/testsuite/gas/mips/micromips@relax-offset.d26
-rw-r--r--gas/testsuite/gas/mips/mips.exp2
-rw-r--r--gas/testsuite/gas/mips/mips1@relax-offset.d30
-rw-r--r--gas/testsuite/gas/mips/r3000@relax-offset.d6
-rw-r--r--gas/testsuite/gas/mips/r3900@relax-offset.d6
-rw-r--r--gas/testsuite/gas/mips/relax-offset.d28
-rw-r--r--gas/testsuite/gas/mips/relax-offset.l2
-rw-r--r--gas/testsuite/gas/mips/relax-offset.s23
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