diff options
-rw-r--r-- | gas/ChangeLog | 16 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-weak-1.d | 15 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-weak-2.d | 15 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-weak-3.d | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-weak-4.d | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-weak-5.d | 15 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-weak.l | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-weak.s | 19 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/mips.exp | 5 |
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" |