From: Max Filippov Date: Tue, 25 Nov 2014 18:33:21 +0000 (+0300) Subject: Fix trampolines search code for conditional branches X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d92b6eece424f0ad35d96fdd85bf207295e8c4c3;p=binutils-gdb.git Fix trampolines search code for conditional branches For conditional branches that need more than one trampoline to reach its target assembler couldn't always find suitable trampoline because post-loop condition check was placed inside the loop, resulting in premature loop termination. Move check outside the loop. This fixes the following build errors seen when assembling huge files produced by gcc: Error: jump target out of range; no usable trampoline found Error: operand 1 of 'j' has out of range value '307307' 2014-11-25 Max Filippov gas/ * config/tc-xtensa.c (search_trampolines): Move post-loop condition check outside the search loop. gas/testsuite/ * gas/xtensa/trampoline.d: Add expected output for branches. * gas/xtensa/trampoline.s: Add test case for branches. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 757ef4b7b5e..b0119c6f6ef 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2014-11-25 Max Filippov + + * config/tc-xtensa.c (search_trampolines): Move post-loop + condition check outside the search loop. + 2014-11-24 H.J. Lu * configure: Regenerated. diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index d11b0c7f27e..f23ccf81a28 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -9514,11 +9514,11 @@ search_trampolines (TInsn *tinsn, fragS *fragP, bfd_boolean unreachable_only) if (next_addr == 0 || addr - next_addr > J_RANGE) break; } - if (abs (addr - this_addr) < J_RANGE) - return tf; - - return NULL; } + if (abs (addr - this_addr) < J_RANGE) + return tf; + + return NULL; } for ( ; tf; tf = tf->next) { diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 00a2df036dd..3c2f81a6bbd 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-11-25 Max Filippov + * gas/xtensa/trampoline.d: Add expected output for branches. + * gas/xtensa/trampoline.s: Add test case for branches. + 2014-11-21 Terry Guo * gas/arm/attr-arch-assumption.d: New file. diff --git a/gas/testsuite/gas/xtensa/trampoline.d b/gas/testsuite/gas/xtensa/trampoline.d index b4f65dc8c73..5ae32a66b84 100644 --- a/gas/testsuite/gas/xtensa/trampoline.d +++ b/gas/testsuite/gas/xtensa/trampoline.d @@ -24,3 +24,12 @@ .*33462:.*j.0x49407 #... .*49407:.*j.0x49407 +.*4940a:.*beqz.n.a2,.0x4940f +.*4940c:.*j.0x693d1 +#... +.*693d1:.*j.0x7ddd4 +#... +.*7ddd4:.*j.0x927f5 +#... +.*927f5:.*j.0x927f5 +#... diff --git a/gas/testsuite/gas/xtensa/trampoline.s b/gas/testsuite/gas/xtensa/trampoline.s index 259a3bbedcf..4465786bb06 100644 --- a/gas/testsuite/gas/xtensa/trampoline.s +++ b/gas/testsuite/gas/xtensa/trampoline.s @@ -19,3 +19,10 @@ .endr 3: j 3b + bnez a2, 4f + .rep 50000 + and a2, a2, a3 + _ret + .endr +4: + j 4b