diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch | 946 |
1 files changed, 946 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch b/meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch new file mode 100644 index 0000000000..ad736913cd --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch | |||
@@ -0,0 +1,946 @@ | |||
1 | From 3f1c39fb543884d36e759a6dc196a8e914eb4f73 Mon Sep 17 00:00:00 2001 | ||
2 | From: "H.J. Lu" <hjl.tools@gmail.com> | ||
3 | Date: Sat, 6 Jan 2018 22:29:56 -0800 | ||
4 | Subject: [PATCH 06/12] x86: Add -mindirect-branch-register | ||
5 | |||
6 | Add -mindirect-branch-register to force indirect branch via register. | ||
7 | This is implemented by disabling patterns of indirect branch via memory, | ||
8 | similar to TARGET_X32. | ||
9 | |||
10 | -mindirect-branch= and -mfunction-return= tests are updated with | ||
11 | -mno-indirect-branch-register to avoid false test failures when | ||
12 | -mindirect-branch-register is added to RUNTESTFLAGS for "make check". | ||
13 | |||
14 | gcc/ | ||
15 | |||
16 | Backport from mainline | ||
17 | 2018-01-14 H.J. Lu <hongjiu.lu@intel.com> | ||
18 | |||
19 | * config/i386/constraints.md (Bs): Disallow memory operand for | ||
20 | -mindirect-branch-register. | ||
21 | (Bw): Likewise. | ||
22 | * config/i386/predicates.md (indirect_branch_operand): Likewise. | ||
23 | (GOT_memory_operand): Likewise. | ||
24 | (call_insn_operand): Likewise. | ||
25 | (sibcall_insn_operand): Likewise. | ||
26 | (GOT32_symbol_operand): Likewise. | ||
27 | * config/i386/i386.md (indirect_jump): Call convert_memory_address | ||
28 | for -mindirect-branch-register. | ||
29 | (tablejump): Likewise. | ||
30 | (*sibcall_memory): Likewise. | ||
31 | (*sibcall_value_memory): Likewise. | ||
32 | Disallow peepholes of indirect call and jump via memory for | ||
33 | -mindirect-branch-register. | ||
34 | (*call_pop): Replace m with Bw. | ||
35 | (*call_value_pop): Likewise. | ||
36 | (*sibcall_pop_memory): Replace m with Bs. | ||
37 | * config/i386/i386.opt (mindirect-branch-register): New option. | ||
38 | * doc/invoke.texi: Document -mindirect-branch-register option. | ||
39 | |||
40 | gcc/testsuite/ | ||
41 | |||
42 | Backport from mainline | ||
43 | 2018-01-14 H.J. Lu <hongjiu.lu@intel.com> | ||
44 | |||
45 | * gcc.target/i386/indirect-thunk-1.c (dg-options): Add | ||
46 | -mno-indirect-branch-register. | ||
47 | * gcc.target/i386/indirect-thunk-2.c: Likewise. | ||
48 | * gcc.target/i386/indirect-thunk-3.c: Likewise. | ||
49 | * gcc.target/i386/indirect-thunk-4.c: Likewise. | ||
50 | * gcc.target/i386/indirect-thunk-5.c: Likewise. | ||
51 | * gcc.target/i386/indirect-thunk-6.c: Likewise. | ||
52 | * gcc.target/i386/indirect-thunk-7.c: Likewise. | ||
53 | * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. | ||
54 | * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. | ||
55 | * gcc.target/i386/indirect-thunk-attr-3.c: Likewise. | ||
56 | * gcc.target/i386/indirect-thunk-attr-4.c: Likewise. | ||
57 | * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. | ||
58 | * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. | ||
59 | * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. | ||
60 | * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise. | ||
61 | * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise. | ||
62 | * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise. | ||
63 | * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise. | ||
64 | * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. | ||
65 | * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. | ||
66 | * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. | ||
67 | * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. | ||
68 | * gcc.target/i386/indirect-thunk-extern-5.c: Likewise. | ||
69 | * gcc.target/i386/indirect-thunk-extern-6.c: Likewise. | ||
70 | * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. | ||
71 | * gcc.target/i386/indirect-thunk-inline-1.c: Likewise. | ||
72 | * gcc.target/i386/indirect-thunk-inline-2.c: Likewise. | ||
73 | * gcc.target/i386/indirect-thunk-inline-3.c: Likewise. | ||
74 | * gcc.target/i386/indirect-thunk-inline-4.c: Likewise. | ||
75 | * gcc.target/i386/indirect-thunk-inline-5.c: Likewise. | ||
76 | * gcc.target/i386/indirect-thunk-inline-6.c: Likewise. | ||
77 | * gcc.target/i386/indirect-thunk-inline-7.c: Likewise. | ||
78 | * gcc.target/i386/ret-thunk-10.c: Likewise. | ||
79 | * gcc.target/i386/ret-thunk-11.c: Likewise. | ||
80 | * gcc.target/i386/ret-thunk-12.c: Likewise. | ||
81 | * gcc.target/i386/ret-thunk-13.c: Likewise. | ||
82 | * gcc.target/i386/ret-thunk-14.c: Likewise. | ||
83 | * gcc.target/i386/ret-thunk-15.c: Likewise. | ||
84 | * gcc.target/i386/ret-thunk-9.c: Likewise. | ||
85 | * gcc.target/i386/indirect-thunk-register-1.c: New test. | ||
86 | * gcc.target/i386/indirect-thunk-register-2.c: Likewise. | ||
87 | * gcc.target/i386/indirect-thunk-register-3.c: Likewise. | ||
88 | |||
89 | i386: Rename to ix86_indirect_branch_register | ||
90 | |||
91 | Rename the variable for -mindirect-branch-register to | ||
92 | ix86_indirect_branch_register to match the command-line option name. | ||
93 | |||
94 | Backport from mainline | ||
95 | 2018-01-15 H.J. Lu <hongjiu.lu@intel.com> | ||
96 | |||
97 | * config/i386/constraints.md (Bs): Replace | ||
98 | ix86_indirect_branch_thunk_register with | ||
99 | ix86_indirect_branch_register. | ||
100 | (Bw): Likewise. | ||
101 | * config/i386/i386.md (indirect_jump): Likewise. | ||
102 | (tablejump): Likewise. | ||
103 | (*sibcall_memory): Likewise. | ||
104 | (*sibcall_value_memory): Likewise. | ||
105 | Peepholes of indirect call and jump via memory: Likewise. | ||
106 | * config/i386/i386.opt: Likewise. | ||
107 | * config/i386/predicates.md (indirect_branch_operand): Likewise. | ||
108 | (GOT_memory_operand): Likewise. | ||
109 | (call_insn_operand): Likewise. | ||
110 | (sibcall_insn_operand): Likewise. | ||
111 | (GOT32_symbol_operand): Likewise. | ||
112 | |||
113 | x86: Rewrite ix86_indirect_branch_register logic | ||
114 | |||
115 | Rewrite ix86_indirect_branch_register logic with | ||
116 | |||
117 | (and (not (match_test "ix86_indirect_branch_register")) | ||
118 | (original condition before r256662)) | ||
119 | |||
120 | Backport from mainline | ||
121 | 2018-01-15 H.J. Lu <hongjiu.lu@intel.com> | ||
122 | |||
123 | * config/i386/predicates.md (constant_call_address_operand): | ||
124 | Rewrite ix86_indirect_branch_register logic. | ||
125 | (sibcall_insn_operand): Likewise. | ||
126 | |||
127 | Don't check ix86_indirect_branch_register for GOT operand | ||
128 | |||
129 | Since GOT_memory_operand and GOT32_symbol_operand are simple pattern | ||
130 | matches, don't check ix86_indirect_branch_register here. If needed, | ||
131 | -mindirect-branch= will convert indirect branch via GOT slot to a call | ||
132 | and return thunk. | ||
133 | |||
134 | Backport from mainline | ||
135 | 2018-01-15 H.J. Lu <hongjiu.lu@intel.com> | ||
136 | |||
137 | * config/i386/constraints.md (Bs): Update | ||
138 | ix86_indirect_branch_register check. Don't check | ||
139 | ix86_indirect_branch_register with GOT_memory_operand. | ||
140 | (Bw): Likewise. | ||
141 | * config/i386/predicates.md (GOT_memory_operand): Don't check | ||
142 | ix86_indirect_branch_register here. | ||
143 | (GOT32_symbol_operand): Likewise. | ||
144 | |||
145 | i386: Rewrite indirect_branch_operand logic | ||
146 | |||
147 | Backport from mainline | ||
148 | 2018-01-15 H.J. Lu <hongjiu.lu@intel.com> | ||
149 | |||
150 | * config/i386/predicates.md (indirect_branch_operand): Rewrite | ||
151 | ix86_indirect_branch_register logic. | ||
152 | |||
153 | Upstream-Status: Pending | ||
154 | |||
155 | Signed-off-by: Juro Bystricky <juro.bystricky@intel.com> | ||
156 | |||
157 | --- | ||
158 | gcc/config/i386/constraints.md | 6 ++-- | ||
159 | gcc/config/i386/i386.md | 34 ++++++++++++++-------- | ||
160 | gcc/config/i386/i386.opt | 4 +++ | ||
161 | gcc/config/i386/predicates.md | 21 +++++++------ | ||
162 | gcc/doc/invoke.texi | 6 +++- | ||
163 | gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 +- | ||
164 | gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 +- | ||
165 | gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 +- | ||
166 | gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 +- | ||
167 | gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | 2 +- | ||
168 | gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | 2 +- | ||
169 | gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 +- | ||
170 | .../gcc.target/i386/indirect-thunk-attr-1.c | 2 +- | ||
171 | .../gcc.target/i386/indirect-thunk-attr-2.c | 2 +- | ||
172 | .../gcc.target/i386/indirect-thunk-attr-3.c | 2 +- | ||
173 | .../gcc.target/i386/indirect-thunk-attr-4.c | 2 +- | ||
174 | .../gcc.target/i386/indirect-thunk-attr-5.c | 2 +- | ||
175 | .../gcc.target/i386/indirect-thunk-attr-6.c | 2 +- | ||
176 | .../gcc.target/i386/indirect-thunk-attr-7.c | 2 +- | ||
177 | .../gcc.target/i386/indirect-thunk-bnd-1.c | 2 +- | ||
178 | .../gcc.target/i386/indirect-thunk-bnd-2.c | 2 +- | ||
179 | .../gcc.target/i386/indirect-thunk-bnd-3.c | 2 +- | ||
180 | .../gcc.target/i386/indirect-thunk-bnd-4.c | 2 +- | ||
181 | .../gcc.target/i386/indirect-thunk-extern-1.c | 2 +- | ||
182 | .../gcc.target/i386/indirect-thunk-extern-2.c | 2 +- | ||
183 | .../gcc.target/i386/indirect-thunk-extern-3.c | 2 +- | ||
184 | .../gcc.target/i386/indirect-thunk-extern-4.c | 2 +- | ||
185 | .../gcc.target/i386/indirect-thunk-extern-5.c | 2 +- | ||
186 | .../gcc.target/i386/indirect-thunk-extern-6.c | 2 +- | ||
187 | .../gcc.target/i386/indirect-thunk-extern-7.c | 2 +- | ||
188 | .../gcc.target/i386/indirect-thunk-inline-1.c | 2 +- | ||
189 | .../gcc.target/i386/indirect-thunk-inline-2.c | 2 +- | ||
190 | .../gcc.target/i386/indirect-thunk-inline-3.c | 2 +- | ||
191 | .../gcc.target/i386/indirect-thunk-inline-4.c | 2 +- | ||
192 | .../gcc.target/i386/indirect-thunk-inline-5.c | 2 +- | ||
193 | .../gcc.target/i386/indirect-thunk-inline-6.c | 2 +- | ||
194 | .../gcc.target/i386/indirect-thunk-inline-7.c | 2 +- | ||
195 | .../gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++++++++++ | ||
196 | .../gcc.target/i386/indirect-thunk-register-2.c | 20 +++++++++++++ | ||
197 | .../gcc.target/i386/indirect-thunk-register-3.c | 19 ++++++++++++ | ||
198 | gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 +- | ||
199 | gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 +- | ||
200 | gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 +- | ||
201 | gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 +- | ||
202 | gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 +- | ||
203 | gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 +- | ||
204 | gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +- | ||
205 | 47 files changed, 147 insertions(+), 63 deletions(-) | ||
206 | create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c | ||
207 | create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c | ||
208 | create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c | ||
209 | |||
210 | diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md | ||
211 | index 1a4c701..9204c8e 100644 | ||
212 | --- a/gcc/config/i386/constraints.md | ||
213 | +++ b/gcc/config/i386/constraints.md | ||
214 | @@ -172,14 +172,16 @@ | ||
215 | |||
216 | (define_constraint "Bs" | ||
217 | "@internal Sibcall memory operand." | ||
218 | - (ior (and (not (match_test "TARGET_X32")) | ||
219 | + (ior (and (not (match_test "ix86_indirect_branch_register")) | ||
220 | + (not (match_test "TARGET_X32")) | ||
221 | (match_operand 0 "sibcall_memory_operand")) | ||
222 | (and (match_test "TARGET_X32 && Pmode == DImode") | ||
223 | (match_operand 0 "GOT_memory_operand")))) | ||
224 | |||
225 | (define_constraint "Bw" | ||
226 | "@internal Call memory operand." | ||
227 | - (ior (and (not (match_test "TARGET_X32")) | ||
228 | + (ior (and (not (match_test "ix86_indirect_branch_register")) | ||
229 | + (not (match_test "TARGET_X32")) | ||
230 | (match_operand 0 "memory_operand")) | ||
231 | (and (match_test "TARGET_X32 && Pmode == DImode") | ||
232 | (match_operand 0 "GOT_memory_operand")))) | ||
233 | diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md | ||
234 | index 2da671e..05a88ff 100644 | ||
235 | --- a/gcc/config/i386/i386.md | ||
236 | +++ b/gcc/config/i386/i386.md | ||
237 | @@ -11805,7 +11805,7 @@ | ||
238 | [(set (pc) (match_operand 0 "indirect_branch_operand"))] | ||
239 | "" | ||
240 | { | ||
241 | - if (TARGET_X32) | ||
242 | + if (TARGET_X32 || ix86_indirect_branch_register) | ||
243 | operands[0] = convert_memory_address (word_mode, operands[0]); | ||
244 | cfun->machine->has_local_indirect_jump = true; | ||
245 | }) | ||
246 | @@ -11859,7 +11859,7 @@ | ||
247 | OPTAB_DIRECT); | ||
248 | } | ||
249 | |||
250 | - if (TARGET_X32) | ||
251 | + if (TARGET_X32 || ix86_indirect_branch_register) | ||
252 | operands[0] = convert_memory_address (word_mode, operands[0]); | ||
253 | cfun->machine->has_local_indirect_jump = true; | ||
254 | }) | ||
255 | @@ -12048,7 +12048,7 @@ | ||
256 | [(call (mem:QI (match_operand:W 0 "memory_operand" "m")) | ||
257 | (match_operand 1)) | ||
258 | (unspec [(const_int 0)] UNSPEC_PEEPSIB)] | ||
259 | - "!TARGET_X32" | ||
260 | + "!TARGET_X32 && !ix86_indirect_branch_register" | ||
261 | "* return ix86_output_call_insn (insn, operands[0]);" | ||
262 | [(set_attr "type" "call")]) | ||
263 | |||
264 | @@ -12057,7 +12057,9 @@ | ||
265 | (match_operand:W 1 "memory_operand")) | ||
266 | (call (mem:QI (match_dup 0)) | ||
267 | (match_operand 3))] | ||
268 | - "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1)) | ||
269 | + "!TARGET_X32 | ||
270 | + && !ix86_indirect_branch_register | ||
271 | + && SIBLING_CALL_P (peep2_next_insn (1)) | ||
272 | && !reg_mentioned_p (operands[0], | ||
273 | CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))" | ||
274 | [(parallel [(call (mem:QI (match_dup 1)) | ||
275 | @@ -12070,7 +12072,9 @@ | ||
276 | (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) | ||
277 | (call (mem:QI (match_dup 0)) | ||
278 | (match_operand 3))] | ||
279 | - "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2)) | ||
280 | + "!TARGET_X32 | ||
281 | + && !ix86_indirect_branch_register | ||
282 | + && SIBLING_CALL_P (peep2_next_insn (2)) | ||
283 | && !reg_mentioned_p (operands[0], | ||
284 | CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))" | ||
285 | [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) | ||
286 | @@ -12092,7 +12096,7 @@ | ||
287 | }) | ||
288 | |||
289 | (define_insn "*call_pop" | ||
290 | - [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lmBz")) | ||
291 | + [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lBwBz")) | ||
292 | (match_operand 1)) | ||
293 | (set (reg:SI SP_REG) | ||
294 | (plus:SI (reg:SI SP_REG) | ||
295 | @@ -12112,7 +12116,7 @@ | ||
296 | [(set_attr "type" "call")]) | ||
297 | |||
298 | (define_insn "*sibcall_pop_memory" | ||
299 | - [(call (mem:QI (match_operand:SI 0 "memory_operand" "m")) | ||
300 | + [(call (mem:QI (match_operand:SI 0 "memory_operand" "Bs")) | ||
301 | (match_operand 1)) | ||
302 | (set (reg:SI SP_REG) | ||
303 | (plus:SI (reg:SI SP_REG) | ||
304 | @@ -12166,7 +12170,9 @@ | ||
305 | [(set (match_operand:W 0 "register_operand") | ||
306 | (match_operand:W 1 "memory_operand")) | ||
307 | (set (pc) (match_dup 0))] | ||
308 | - "!TARGET_X32 && peep2_reg_dead_p (2, operands[0])" | ||
309 | + "!TARGET_X32 | ||
310 | + && !ix86_indirect_branch_register | ||
311 | + && peep2_reg_dead_p (2, operands[0])" | ||
312 | [(set (pc) (match_dup 1))]) | ||
313 | |||
314 | ;; Call subroutine, returning value in operand 0 | ||
315 | @@ -12244,7 +12250,7 @@ | ||
316 | (call (mem:QI (match_operand:W 1 "memory_operand" "m")) | ||
317 | (match_operand 2))) | ||
318 | (unspec [(const_int 0)] UNSPEC_PEEPSIB)] | ||
319 | - "!TARGET_X32" | ||
320 | + "!TARGET_X32 && !ix86_indirect_branch_register" | ||
321 | "* return ix86_output_call_insn (insn, operands[1]);" | ||
322 | [(set_attr "type" "callv")]) | ||
323 | |||
324 | @@ -12254,7 +12260,9 @@ | ||
325 | (set (match_operand 2) | ||
326 | (call (mem:QI (match_dup 0)) | ||
327 | (match_operand 3)))] | ||
328 | - "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1)) | ||
329 | + "!TARGET_X32 | ||
330 | + && !ix86_indirect_branch_register | ||
331 | + && SIBLING_CALL_P (peep2_next_insn (1)) | ||
332 | && !reg_mentioned_p (operands[0], | ||
333 | CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))" | ||
334 | [(parallel [(set (match_dup 2) | ||
335 | @@ -12269,7 +12277,9 @@ | ||
336 | (set (match_operand 2) | ||
337 | (call (mem:QI (match_dup 0)) | ||
338 | (match_operand 3)))] | ||
339 | - "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2)) | ||
340 | + "!TARGET_X32 | ||
341 | + && !ix86_indirect_branch_register | ||
342 | + && SIBLING_CALL_P (peep2_next_insn (2)) | ||
343 | && !reg_mentioned_p (operands[0], | ||
344 | CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))" | ||
345 | [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) | ||
346 | @@ -12294,7 +12304,7 @@ | ||
347 | |||
348 | (define_insn "*call_value_pop" | ||
349 | [(set (match_operand 0) | ||
350 | - (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lmBz")) | ||
351 | + (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lBwBz")) | ||
352 | (match_operand 2))) | ||
353 | (set (reg:SI SP_REG) | ||
354 | (plus:SI (reg:SI SP_REG) | ||
355 | diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt | ||
356 | index ad5916f..a97f84f 100644 | ||
357 | --- a/gcc/config/i386/i386.opt | ||
358 | +++ b/gcc/config/i386/i386.opt | ||
359 | @@ -921,3 +921,7 @@ Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_inline) | ||
360 | |||
361 | EnumValue | ||
362 | Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_extern) | ||
363 | + | ||
364 | +mindirect-branch-register | ||
365 | +Target Report Var(ix86_indirect_branch_register) Init(0) | ||
366 | +Force indirect call and jump via register. | ||
367 | diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md | ||
368 | index 93dda7b..d1f0a7d 100644 | ||
369 | --- a/gcc/config/i386/predicates.md | ||
370 | +++ b/gcc/config/i386/predicates.md | ||
371 | @@ -593,7 +593,8 @@ | ||
372 | ;; Test for a valid operand for indirect branch. | ||
373 | (define_predicate "indirect_branch_operand" | ||
374 | (ior (match_operand 0 "register_operand") | ||
375 | - (and (not (match_test "TARGET_X32")) | ||
376 | + (and (not (match_test "ix86_indirect_branch_register")) | ||
377 | + (not (match_test "TARGET_X32")) | ||
378 | (match_operand 0 "memory_operand")))) | ||
379 | |||
380 | ;; Return true if OP is a memory operands that can be used in sibcalls. | ||
381 | @@ -636,20 +637,22 @@ | ||
382 | (ior (match_test "constant_call_address_operand | ||
383 | (op, mode == VOIDmode ? mode : Pmode)") | ||
384 | (match_operand 0 "call_register_no_elim_operand") | ||
385 | - (ior (and (not (match_test "TARGET_X32")) | ||
386 | - (match_operand 0 "memory_operand")) | ||
387 | - (and (match_test "TARGET_X32 && Pmode == DImode") | ||
388 | - (match_operand 0 "GOT_memory_operand"))))) | ||
389 | + (and (not (match_test "ix86_indirect_branch_register")) | ||
390 | + (ior (and (not (match_test "TARGET_X32")) | ||
391 | + (match_operand 0 "memory_operand")) | ||
392 | + (and (match_test "TARGET_X32 && Pmode == DImode") | ||
393 | + (match_operand 0 "GOT_memory_operand")))))) | ||
394 | |||
395 | ;; Similarly, but for tail calls, in which we cannot allow memory references. | ||
396 | (define_special_predicate "sibcall_insn_operand" | ||
397 | (ior (match_test "constant_call_address_operand | ||
398 | (op, mode == VOIDmode ? mode : Pmode)") | ||
399 | (match_operand 0 "register_no_elim_operand") | ||
400 | - (ior (and (not (match_test "TARGET_X32")) | ||
401 | - (match_operand 0 "sibcall_memory_operand")) | ||
402 | - (and (match_test "TARGET_X32 && Pmode == DImode") | ||
403 | - (match_operand 0 "GOT_memory_operand"))))) | ||
404 | + (and (not (match_test "ix86_indirect_branch_register")) | ||
405 | + (ior (and (not (match_test "TARGET_X32")) | ||
406 | + (match_operand 0 "sibcall_memory_operand")) | ||
407 | + (and (match_test "TARGET_X32 && Pmode == DImode") | ||
408 | + (match_operand 0 "GOT_memory_operand")))))) | ||
409 | |||
410 | ;; Return true if OP is a 32-bit GOT symbol operand. | ||
411 | (define_predicate "GOT32_symbol_operand" | ||
412 | diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi | ||
413 | index fa63dc5..ad9f295 100644 | ||
414 | --- a/gcc/doc/invoke.texi | ||
415 | +++ b/gcc/doc/invoke.texi | ||
416 | @@ -1170,7 +1170,7 @@ See RS/6000 and PowerPC Options. | ||
417 | -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol | ||
418 | -malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol | ||
419 | -mmitigate-rop -mindirect-branch=@var{choice} @gol | ||
420 | --mfunction-return=@var{choice}} | ||
421 | +-mfunction-return=@var{choice} -mindirect-branch-register} | ||
422 | |||
423 | @emph{x86 Windows Options} | ||
424 | @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol | ||
425 | @@ -24241,6 +24241,10 @@ object file. You can control this behavior for a specific function by | ||
426 | using the function attribute @code{function_return}. | ||
427 | @xref{Function Attributes}. | ||
428 | |||
429 | +@item -mindirect-branch-register | ||
430 | +@opindex -mindirect-branch-register | ||
431 | +Force indirect call and jump via register. | ||
432 | + | ||
433 | @end table | ||
434 | |||
435 | These @samp{-m} switches are supported in addition to the above | ||
436 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | ||
437 | index e365ef5..60d0988 100644 | ||
438 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | ||
439 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | ||
440 | @@ -1,5 +1,5 @@ | ||
441 | /* { dg-do compile } */ | ||
442 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
443 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
444 | |||
445 | typedef void (*dispatch_t)(long offset); | ||
446 | |||
447 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | ||
448 | index 05a51ad..aac7516 100644 | ||
449 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | ||
450 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | ||
451 | @@ -1,5 +1,5 @@ | ||
452 | /* { dg-do compile } */ | ||
453 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
454 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
455 | |||
456 | typedef void (*dispatch_t)(long offset); | ||
457 | |||
458 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | ||
459 | index 3c0d4c3..9e24a38 100644 | ||
460 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | ||
461 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | ||
462 | @@ -1,5 +1,5 @@ | ||
463 | /* { dg-do compile } */ | ||
464 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
465 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
466 | |||
467 | typedef void (*dispatch_t)(long offset); | ||
468 | |||
469 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | ||
470 | index 14d4ef6..127b5d9 100644 | ||
471 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | ||
472 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | ||
473 | @@ -1,5 +1,5 @@ | ||
474 | /* { dg-do compile } */ | ||
475 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
476 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
477 | |||
478 | typedef void (*dispatch_t)(long offset); | ||
479 | |||
480 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | ||
481 | index b4836c3..fcaa18d 100644 | ||
482 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | ||
483 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | ||
484 | @@ -1,5 +1,5 @@ | ||
485 | /* { dg-do compile { target *-*-linux* } } */ | ||
486 | -/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */ | ||
487 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */ | ||
488 | |||
489 | extern void bar (void); | ||
490 | |||
491 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | ||
492 | index 1f06bd1..e464928 100644 | ||
493 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | ||
494 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | ||
495 | @@ -1,5 +1,5 @@ | ||
496 | /* { dg-do compile { target *-*-linux* } } */ | ||
497 | -/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */ | ||
498 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */ | ||
499 | |||
500 | extern void bar (void); | ||
501 | |||
502 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | ||
503 | index bc6b47a..17c2d0f 100644 | ||
504 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | ||
505 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | ||
506 | @@ -1,5 +1,5 @@ | ||
507 | /* { dg-do compile } */ | ||
508 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
509 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
510 | |||
511 | void func0 (void); | ||
512 | void func1 (void); | ||
513 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | ||
514 | index 2257be3..9194ccf 100644 | ||
515 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | ||
516 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | ||
517 | @@ -1,5 +1,5 @@ | ||
518 | /* { dg-do compile } */ | ||
519 | -/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ | ||
520 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ | ||
521 | |||
522 | typedef void (*dispatch_t)(long offset); | ||
523 | |||
524 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | ||
525 | index e9cfdc5..e51f261 100644 | ||
526 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | ||
527 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | ||
528 | @@ -1,5 +1,5 @@ | ||
529 | /* { dg-do compile } */ | ||
530 | -/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ | ||
531 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ | ||
532 | |||
533 | typedef void (*dispatch_t)(long offset); | ||
534 | |||
535 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | ||
536 | index f938db0..4aeec18 100644 | ||
537 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | ||
538 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | ||
539 | @@ -1,5 +1,5 @@ | ||
540 | /* { dg-do compile } */ | ||
541 | -/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ | ||
542 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ | ||
543 | |||
544 | typedef void (*dispatch_t)(long offset); | ||
545 | |||
546 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | ||
547 | index 4e58599..ac0e599 100644 | ||
548 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | ||
549 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | ||
550 | @@ -1,5 +1,5 @@ | ||
551 | /* { dg-do compile } */ | ||
552 | -/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ | ||
553 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ | ||
554 | |||
555 | typedef void (*dispatch_t)(long offset); | ||
556 | |||
557 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | ||
558 | index b8d5024..573cf1e 100644 | ||
559 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | ||
560 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | ||
561 | @@ -1,5 +1,5 @@ | ||
562 | /* { dg-do compile } */ | ||
563 | -/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ | ||
564 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ | ||
565 | |||
566 | typedef void (*dispatch_t)(long offset); | ||
567 | |||
568 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | ||
569 | index 455adab..b2b37fc 100644 | ||
570 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | ||
571 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | ||
572 | @@ -1,5 +1,5 @@ | ||
573 | /* { dg-do compile } */ | ||
574 | -/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ | ||
575 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ | ||
576 | |||
577 | typedef void (*dispatch_t)(long offset); | ||
578 | |||
579 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | ||
580 | index 4595b84..4a43e19 100644 | ||
581 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | ||
582 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | ||
583 | @@ -1,5 +1,5 @@ | ||
584 | /* { dg-do compile } */ | ||
585 | -/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ | ||
586 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ | ||
587 | |||
588 | void func0 (void); | ||
589 | void func1 (void); | ||
590 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | ||
591 | index 5e3e118..ac84ab6 100644 | ||
592 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | ||
593 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | ||
594 | @@ -1,5 +1,5 @@ | ||
595 | /* { dg-do compile { target { ! x32 } } } */ | ||
596 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ | ||
597 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ | ||
598 | |||
599 | void (*dispatch) (char *); | ||
600 | char buf[10]; | ||
601 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | ||
602 | index 2801aa4..ce655e8 100644 | ||
603 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | ||
604 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | ||
605 | @@ -1,5 +1,5 @@ | ||
606 | /* { dg-do compile { target { ! x32 } } } */ | ||
607 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ | ||
608 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ | ||
609 | |||
610 | void (*dispatch) (char *); | ||
611 | char buf[10]; | ||
612 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c | ||
613 | index 70b4fb3..d34485a 100644 | ||
614 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c | ||
615 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c | ||
616 | @@ -1,5 +1,5 @@ | ||
617 | /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */ | ||
618 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */ | ||
619 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */ | ||
620 | |||
621 | void bar (char *); | ||
622 | char buf[10]; | ||
623 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c | ||
624 | index 3baf03e..0e19830 100644 | ||
625 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c | ||
626 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c | ||
627 | @@ -1,5 +1,5 @@ | ||
628 | /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */ | ||
629 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */ | ||
630 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */ | ||
631 | |||
632 | void bar (char *); | ||
633 | char buf[10]; | ||
634 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | ||
635 | index edeb264..579441f 100644 | ||
636 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | ||
637 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | ||
638 | @@ -1,5 +1,5 @@ | ||
639 | /* { dg-do compile } */ | ||
640 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
641 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
642 | |||
643 | typedef void (*dispatch_t)(long offset); | ||
644 | |||
645 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | ||
646 | index 1d00413..c92e6f2 100644 | ||
647 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | ||
648 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | ||
649 | @@ -1,5 +1,5 @@ | ||
650 | /* { dg-do compile } */ | ||
651 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
652 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
653 | |||
654 | typedef void (*dispatch_t)(long offset); | ||
655 | |||
656 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | ||
657 | index 06ebf1c..d9964c2 100644 | ||
658 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | ||
659 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | ||
660 | @@ -1,5 +1,5 @@ | ||
661 | /* { dg-do compile } */ | ||
662 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
663 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
664 | |||
665 | typedef void (*dispatch_t)(long offset); | ||
666 | |||
667 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | ||
668 | index 1c8f944..d4dca4d 100644 | ||
669 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | ||
670 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | ||
671 | @@ -1,5 +1,5 @@ | ||
672 | /* { dg-do compile } */ | ||
673 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
674 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
675 | |||
676 | typedef void (*dispatch_t)(long offset); | ||
677 | |||
678 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c | ||
679 | index 21740ac..5c07e02 100644 | ||
680 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c | ||
681 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c | ||
682 | @@ -1,5 +1,5 @@ | ||
683 | /* { dg-do compile { target *-*-linux* } } */ | ||
684 | -/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */ | ||
685 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */ | ||
686 | |||
687 | extern void bar (void); | ||
688 | |||
689 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c | ||
690 | index a77c1f4..3eb4406 100644 | ||
691 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c | ||
692 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c | ||
693 | @@ -1,5 +1,5 @@ | ||
694 | /* { dg-do compile { target *-*-linux* } } */ | ||
695 | -/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */ | ||
696 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */ | ||
697 | |||
698 | extern void bar (void); | ||
699 | |||
700 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | ||
701 | index 86e9fd1..aece938 100644 | ||
702 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | ||
703 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | ||
704 | @@ -1,5 +1,5 @@ | ||
705 | /* { dg-do compile } */ | ||
706 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
707 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
708 | |||
709 | void func0 (void); | ||
710 | void func1 (void); | ||
711 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | ||
712 | index 3ecde87..3aba5e8 100644 | ||
713 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | ||
714 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | ||
715 | @@ -1,5 +1,5 @@ | ||
716 | /* { dg-do compile } */ | ||
717 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
718 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
719 | |||
720 | typedef void (*dispatch_t)(long offset); | ||
721 | |||
722 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | ||
723 | index df32a19..0f0181d 100644 | ||
724 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | ||
725 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | ||
726 | @@ -1,5 +1,5 @@ | ||
727 | /* { dg-do compile } */ | ||
728 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
729 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
730 | |||
731 | typedef void (*dispatch_t)(long offset); | ||
732 | |||
733 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | ||
734 | index 9540996..2eef6f3 100644 | ||
735 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | ||
736 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | ||
737 | @@ -1,5 +1,5 @@ | ||
738 | /* { dg-do compile } */ | ||
739 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
740 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
741 | |||
742 | typedef void (*dispatch_t)(long offset); | ||
743 | |||
744 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | ||
745 | index f3db6e2..e825a10 100644 | ||
746 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | ||
747 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | ||
748 | @@ -1,5 +1,5 @@ | ||
749 | /* { dg-do compile } */ | ||
750 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
751 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
752 | |||
753 | typedef void (*dispatch_t)(long offset); | ||
754 | |||
755 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c | ||
756 | index 0f687c3..c6d77e1 100644 | ||
757 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c | ||
758 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c | ||
759 | @@ -1,5 +1,5 @@ | ||
760 | /* { dg-do compile { target *-*-linux* } } */ | ||
761 | -/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */ | ||
762 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */ | ||
763 | |||
764 | extern void bar (void); | ||
765 | |||
766 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c | ||
767 | index b27c6fc..6454827 100644 | ||
768 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c | ||
769 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c | ||
770 | @@ -1,5 +1,5 @@ | ||
771 | /* { dg-do compile { target *-*-linux* } } */ | ||
772 | -/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */ | ||
773 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */ | ||
774 | |||
775 | extern void bar (void); | ||
776 | |||
777 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | ||
778 | index 764a375..c67066c 100644 | ||
779 | --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | ||
780 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | ||
781 | @@ -1,5 +1,5 @@ | ||
782 | /* { dg-do compile } */ | ||
783 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
784 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
785 | |||
786 | void func0 (void); | ||
787 | void func1 (void); | ||
788 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c | ||
789 | new file mode 100644 | ||
790 | index 0000000..7d396a3 | ||
791 | --- /dev/null | ||
792 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c | ||
793 | @@ -0,0 +1,22 @@ | ||
794 | +/* { dg-do compile } */ | ||
795 | +/* { dg-options "-O2 -mindirect-branch=thunk -mindirect-branch-register -fno-pic" } */ | ||
796 | + | ||
797 | +typedef void (*dispatch_t)(long offset); | ||
798 | + | ||
799 | +dispatch_t dispatch; | ||
800 | + | ||
801 | +void | ||
802 | +male_indirect_jump (long offset) | ||
803 | +{ | ||
804 | + dispatch(offset); | ||
805 | +} | ||
806 | + | ||
807 | +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */ | ||
808 | +/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ | ||
809 | +/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ | ||
810 | +/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */ | ||
811 | +/* { dg-final { scan-assembler {\tpause} } } */ | ||
812 | +/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */ | ||
813 | +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */ | ||
814 | +/* { dg-final { scan-assembler-not "__x86_indirect_thunk\n" } } */ | ||
815 | +/* { dg-final { scan-assembler-not "__x86_indirect_thunk_bnd\n" } } */ | ||
816 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c | ||
817 | new file mode 100644 | ||
818 | index 0000000..e7e616b | ||
819 | --- /dev/null | ||
820 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c | ||
821 | @@ -0,0 +1,20 @@ | ||
822 | +/* { dg-do compile } */ | ||
823 | +/* { dg-options "-O2 -mindirect-branch=thunk-inline -mindirect-branch-register -fno-pic" } */ | ||
824 | + | ||
825 | +typedef void (*dispatch_t)(long offset); | ||
826 | + | ||
827 | +dispatch_t dispatch; | ||
828 | + | ||
829 | +void | ||
830 | +male_indirect_jump (long offset) | ||
831 | +{ | ||
832 | + dispatch(offset); | ||
833 | +} | ||
834 | + | ||
835 | +/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ | ||
836 | +/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ | ||
837 | +/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */ | ||
838 | +/* { dg-final { scan-assembler {\tpause} } } */ | ||
839 | +/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */ | ||
840 | +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */ | ||
841 | +/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ | ||
842 | diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c | ||
843 | new file mode 100644 | ||
844 | index 0000000..5320e92 | ||
845 | --- /dev/null | ||
846 | +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c | ||
847 | @@ -0,0 +1,19 @@ | ||
848 | +/* { dg-do compile } */ | ||
849 | +/* { dg-options "-O2 -mindirect-branch=thunk-extern -mindirect-branch-register -fno-pic" } */ | ||
850 | + | ||
851 | +typedef void (*dispatch_t)(long offset); | ||
852 | + | ||
853 | +dispatch_t dispatch; | ||
854 | + | ||
855 | +void | ||
856 | +male_indirect_jump (long offset) | ||
857 | +{ | ||
858 | + dispatch(offset); | ||
859 | +} | ||
860 | + | ||
861 | +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */ | ||
862 | +/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */ | ||
863 | +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */ | ||
864 | +/* { dg-final { scan-assembler-not {\t(pause|pause|nop)} } } */ | ||
865 | +/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ | ||
866 | +/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ | ||
867 | diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c | ||
868 | index 3a6727b..e6fea84 100644 | ||
869 | --- a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c | ||
870 | +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c | ||
871 | @@ -1,5 +1,5 @@ | ||
872 | /* { dg-do compile } */ | ||
873 | -/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */ | ||
874 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */ | ||
875 | |||
876 | extern void (*bar) (void); | ||
877 | |||
878 | diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c | ||
879 | index b8f6818..e239ec4 100644 | ||
880 | --- a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c | ||
881 | +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c | ||
882 | @@ -1,5 +1,5 @@ | ||
883 | /* { dg-do compile } */ | ||
884 | -/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */ | ||
885 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */ | ||
886 | |||
887 | extern void (*bar) (void); | ||
888 | |||
889 | diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c | ||
890 | index 01b0a02..fa31813 100644 | ||
891 | --- a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c | ||
892 | +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c | ||
893 | @@ -1,5 +1,5 @@ | ||
894 | /* { dg-do compile } */ | ||
895 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
896 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ | ||
897 | |||
898 | extern void (*bar) (void); | ||
899 | |||
900 | diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c | ||
901 | index 4b497b5..fd5b41f 100644 | ||
902 | --- a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c | ||
903 | +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c | ||
904 | @@ -1,5 +1,5 @@ | ||
905 | /* { dg-do compile } */ | ||
906 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
907 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ | ||
908 | |||
909 | extern void (*bar) (void); | ||
910 | extern int foo (void) __attribute__ ((function_return("thunk"))); | ||
911 | diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c | ||
912 | index 4ae4c44..d606373 100644 | ||
913 | --- a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c | ||
914 | +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c | ||
915 | @@ -1,5 +1,5 @@ | ||
916 | /* { dg-do compile } */ | ||
917 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
918 | +/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ | ||
919 | |||
920 | extern void (*bar) (void); | ||
921 | |||
922 | diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c | ||
923 | index 5b5bc76..75e45e2 100644 | ||
924 | --- a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c | ||
925 | +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c | ||
926 | @@ -1,5 +1,5 @@ | ||
927 | /* { dg-do compile } */ | ||
928 | -/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */ | ||
929 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */ | ||
930 | |||
931 | extern void (*bar) (void); | ||
932 | |||
933 | diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c | ||
934 | index fa24a1f..d1db41c 100644 | ||
935 | --- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c | ||
936 | +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c | ||
937 | @@ -1,5 +1,5 @@ | ||
938 | /* { dg-do compile } */ | ||
939 | -/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */ | ||
940 | +/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */ | ||
941 | |||
942 | extern void (*bar) (void); | ||
943 | |||
944 | -- | ||
945 | 2.7.4 | ||
946 | |||