aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog16
-rw-r--r--gas/config/tc-mips.c3
-rw-r--r--gas/testsuite/gas/mips/branch-weak-1.d15
-rw-r--r--gas/testsuite/gas/mips/branch-weak-2.d15
-rw-r--r--gas/testsuite/gas/mips/branch-weak-3.d16
-rw-r--r--gas/testsuite/gas/mips/branch-weak-4.d16
-rw-r--r--gas/testsuite/gas/mips/branch-weak-5.d15
-rw-r--r--gas/testsuite/gas/mips/branch-weak.l2
-rw-r--r--gas/testsuite/gas/mips/branch-weak.s19
-rw-r--r--gas/testsuite/gas/mips/mips.exp5
10 files changed, 122 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index b5548b3..46605f9 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,4 +1,20 @@
2016-04-13 Maciej W. Rozycki <macro@imgtec.com>
+ Andrew Bennett <andrew.bennett@imgtec.com>
+
+ * config/tc-mips.c (relaxed_branch_length): Use the long
+ sequence where the target is a weak symbol.
+ (relaxed_micromips_32bit_branch_length): Likewise.
+ (relaxed_micromips_16bit_branch_length): Likewise.
+ * testsuite/gas/mips/branch-weak-1.d: New test.
+ * testsuite/gas/mips/branch-weak-2.d: New test.
+ * testsuite/gas/mips/branch-weak-3.d: New test.
+ * testsuite/gas/mips/branch-weak-4.d: New test.
+ * testsuite/gas/mips/branch-weak-5.d: New test.
+ * testsuite/gas/mips/branch-weak.l: New stderr output.
+ * testsuite/gas/mips/branch-weak.s: New test source.
+ * testsuite/gas/mips/mips.exp: Run the new tests.
+
+2016-04-13 Maciej W. Rozycki <macro@imgtec.com>
* config/tc-mips.c (relaxed_branch_length): Use the long
sequence where the distance cannot be determined.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index dba147a..118b91d 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -16798,6 +16798,7 @@ relaxed_branch_length (fragS *fragp, asection *sec, int update)
if (fragp
&& S_IS_DEFINED (fragp->fr_symbol)
+ && !S_IS_WEAK (fragp->fr_symbol)
&& sec == S_GET_SEGMENT (fragp->fr_symbol))
{
addressT addr;
@@ -16861,6 +16862,7 @@ relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
if (fragp
&& S_IS_DEFINED (fragp->fr_symbol)
+ && !S_IS_WEAK (fragp->fr_symbol)
&& sec == S_GET_SEGMENT (fragp->fr_symbol))
{
addressT addr;
@@ -16952,6 +16954,7 @@ relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
if (fragp
&& S_IS_DEFINED (fragp->fr_symbol)
+ && !S_IS_WEAK (fragp->fr_symbol)
&& sec == S_GET_SEGMENT (fragp->fr_symbol))
{
addressT addr;
diff --git a/gas/testsuite/gas/mips/branch-weak-1.d b/gas/testsuite/gas/mips/branch-weak-1.d
new file mode 100644
index 0000000..859a2ca
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-weak-1.d
@@ -0,0 +1,15 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS branch to a weak symbol
+#as: -32 --defsym align=12
+#source: branch-weak.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 1000ffff b 00000000 <foo>
+[ ]*[0-9a-f]+: R_MIPS_PC16 bar
+[0-9a-f]+ <[^>]*> 00000000 nop
+ \.\.\.
+[0-9a-f]+ <[^>]*> 03e00008 jr ra
+[0-9a-f]+ <[^>]*> 00000000 nop
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-weak-2.d b/gas/testsuite/gas/mips/branch-weak-2.d
new file mode 100644
index 0000000..d97bace
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-weak-2.d
@@ -0,0 +1,15 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: microMIPS branch to a weak symbol
+#as: -32 -mmicromips --defsym align=12
+#source: branch-weak.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 9400 fffe b 00000000 <foo>
+[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 bar
+[0-9a-f]+ <[^>]*> 0c00 nop
+ \.\.\.
+[0-9a-f]+ <[^>]*> 459f jr ra
+[0-9a-f]+ <[^>]*> 0c00 nop
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-weak-3.d b/gas/testsuite/gas/mips/branch-weak-3.d
new file mode 100644
index 0000000..93e06f5
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-weak-3.d
@@ -0,0 +1,16 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS relaxed branch to a weak symbol
+#as: -32 --relax-branch --defsym align=12
+#source: branch-weak.s
+#stderr: branch-weak.l
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 08000000 j 00000000 <foo>
+[ ]*[0-9a-f]+: R_MIPS_26 bar
+[0-9a-f]+ <[^>]*> 00000000 nop
+ \.\.\.
+[0-9a-f]+ <[^>]*> 03e00008 jr ra
+[0-9a-f]+ <[^>]*> 00000000 nop
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-weak-4.d b/gas/testsuite/gas/mips/branch-weak-4.d
new file mode 100644
index 0000000..c8a2a4b
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-weak-4.d
@@ -0,0 +1,16 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: microMIPS relaxed branch to a weak symbol
+#as: -32 -mmicromips --relax-branch --defsym align=12
+#source: branch-weak.s
+#stderr: branch-weak.l
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> d400 0000 j 00000000 <foo>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 bar
+[0-9a-f]+ <[^>]*> 0c00 nop
+ \.\.\.
+[0-9a-f]+ <[^>]*> 459f jr ra
+[0-9a-f]+ <[^>]*> 0c00 nop
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-weak-5.d b/gas/testsuite/gas/mips/branch-weak-5.d
new file mode 100644
index 0000000..caeee97
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-weak-5.d
@@ -0,0 +1,15 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: microMIPS short branch to a weak symbol
+#as: -32 -mmicromips --defsym align=4
+#source: branch-weak.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 9400 fffe b 00000000 <foo>
+[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 bar
+[0-9a-f]+ <[^>]*> 0c00 nop
+ \.\.\.
+[0-9a-f]+ <[^>]*> 459f jr ra
+[0-9a-f]+ <[^>]*> 0c00 nop
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-weak.l b/gas/testsuite/gas/mips/branch-weak.l
new file mode 100644
index 0000000..b0c248a
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-weak.l
@@ -0,0 +1,2 @@
+.*: Assembler messages:
+.*:6: Warning: relaxed out-of-range branch into a jump
diff --git a/gas/testsuite/gas/mips/branch-weak.s b/gas/testsuite/gas/mips/branch-weak.s
new file mode 100644
index 0000000..eedef7a
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-weak.s
@@ -0,0 +1,19 @@
+ .text
+ .align 4, 0
+ .globl foo
+ .ent foo
+foo:
+ b bar
+ .end foo
+
+ .align align, 0
+ .globl bar
+ .weak bar
+ .ent bar
+bar:
+ jr $ra
+ .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 ad3cdfe..078fde2 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -583,6 +583,11 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test "branch-extern-2"
run_dump_test "branch-extern-3"
run_dump_test "branch-extern-4"
+ run_dump_test "branch-weak-1"
+ run_dump_test "branch-weak-2"
+ run_dump_test "branch-weak-3"
+ run_dump_test "branch-weak-4"
+ run_dump_test "branch-weak-5"
run_dump_test "compact-eh-eb-1"
run_dump_test "compact-eh-eb-2"