Blame view

buildroot/buildroot-2016.08.1/package/binutils/2.24/905-Fix-trampolines-search-code-for-conditional-branches.patch 2.56 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  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