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  <jcmvbkbc@gmail.com>

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.
This commit is contained in:
Max Filippov 2014-11-25 21:33:21 +03:00
parent 60bb06bc89
commit d92b6eece4
5 changed files with 29 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2014-11-25 Max Filippov <jcmvbkbc@gmail.com>
* config/tc-xtensa.c (search_trampolines): Move post-loop
condition check outside the search loop.
2014-11-24 H.J. Lu <hongjiu.lu@intel.com>
* configure: Regenerated.

View file

@ -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)
{

View file

@ -1,3 +1,7 @@
2014-11-25 Max Filippov <jcmvbkbc@gmail.com>
* gas/xtensa/trampoline.d: Add expected output for branches.
* gas/xtensa/trampoline.s: Add test case for branches.
2014-11-21 Terry Guo <terry.guo@arm.com>
* gas/arm/attr-arch-assumption.d: New file.

View file

@ -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
#...

View file

@ -19,3 +19,10 @@
.endr
3:
j 3b
bnez a2, 4f
.rep 50000
and a2, a2, a3
_ret
.endr
4:
j 4b