| From 415480d6471e67aef97c0241d451ef2423a1da9d Mon Sep 17 00:00:00 2001 |
| From: Max Filippov <jcmvbkbc@gmail.com> |
| Date: Tue, 25 Nov 2014 21:33:21 +0300 |
| Subject: [PATCH] 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. |
| |
| Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> |
| --- |
| Backported from: d92b6eece424f0ad35d96fdd85bf207295e8c4c3 |
| Changes to ChangeLogs are dropped. |
| |
| gas/config/tc-xtensa.c | 8 ++++---- |
| gas/testsuite/gas/xtensa/trampoline.d | 9 +++++++++ |
| gas/testsuite/gas/xtensa/trampoline.s | 7 +++++++ |
| 3 files changed, 20 insertions(+), 4 deletions(-) |
| |
| diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c |
| index d11b0c7..f23ccf8 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/gas/xtensa/trampoline.d b/gas/testsuite/gas/xtensa/trampoline.d |
| index b4f65dc..5ae32a6 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 259a3bb..4465786 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 |
| -- |
| 1.8.1.4 |
| |