afd26b3b97
This reverts commit d56a2facfb
and changes the main/gcc6 pkgrel to 9999, so it will always be higher
than Alpine's version.
941 lines
42 KiB
Diff
941 lines
42 KiB
Diff
From 61bb7f0e152ce5be700a44007d036ea0de4b254d Mon Sep 17 00:00:00 2001
|
|
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
Date: Sat, 6 Jan 2018 22:29:56 -0800
|
|
Subject: [PATCH 06/13] x86: Add -mindirect-branch-register
|
|
|
|
Add -mindirect-branch-register to force indirect branch via register.
|
|
This is implemented by disabling patterns of indirect branch via memory,
|
|
similar to TARGET_X32.
|
|
|
|
-mindirect-branch= and -mfunction-return= tests are updated with
|
|
-mno-indirect-branch-register to avoid false test failures when
|
|
-mindirect-branch-register is added to RUNTESTFLAGS for "make check".
|
|
|
|
gcc/
|
|
|
|
Backport from mainline
|
|
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
* config/i386/constraints.md (Bs): Disallow memory operand for
|
|
-mindirect-branch-register.
|
|
(Bw): Likewise.
|
|
* config/i386/predicates.md (indirect_branch_operand): Likewise.
|
|
(GOT_memory_operand): Likewise.
|
|
(call_insn_operand): Likewise.
|
|
(sibcall_insn_operand): Likewise.
|
|
(GOT32_symbol_operand): Likewise.
|
|
* config/i386/i386.md (indirect_jump): Call convert_memory_address
|
|
for -mindirect-branch-register.
|
|
(tablejump): Likewise.
|
|
(*sibcall_memory): Likewise.
|
|
(*sibcall_value_memory): Likewise.
|
|
Disallow peepholes of indirect call and jump via memory for
|
|
-mindirect-branch-register.
|
|
(*call_pop): Replace m with Bw.
|
|
(*call_value_pop): Likewise.
|
|
(*sibcall_pop_memory): Replace m with Bs.
|
|
* config/i386/i386.opt (mindirect-branch-register): New option.
|
|
* doc/invoke.texi: Document -mindirect-branch-register option.
|
|
|
|
gcc/testsuite/
|
|
|
|
Backport from mainline
|
|
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
* gcc.target/i386/indirect-thunk-1.c (dg-options): Add
|
|
-mno-indirect-branch-register.
|
|
* gcc.target/i386/indirect-thunk-2.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-3.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-4.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-5.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-6.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-7.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-attr-1.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-attr-2.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-attr-3.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-attr-4.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-attr-5.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-attr-6.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-attr-7.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-bnd-1.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-bnd-2.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-bnd-3.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-bnd-4.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-extern-1.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-extern-2.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-extern-3.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-extern-4.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-extern-5.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-extern-6.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-extern-7.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-inline-1.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-inline-2.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-inline-3.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-inline-4.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-inline-5.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-inline-6.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-inline-7.c: Likewise.
|
|
* gcc.target/i386/ret-thunk-10.c: Likewise.
|
|
* gcc.target/i386/ret-thunk-11.c: Likewise.
|
|
* gcc.target/i386/ret-thunk-12.c: Likewise.
|
|
* gcc.target/i386/ret-thunk-13.c: Likewise.
|
|
* gcc.target/i386/ret-thunk-14.c: Likewise.
|
|
* gcc.target/i386/ret-thunk-15.c: Likewise.
|
|
* gcc.target/i386/ret-thunk-9.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-register-1.c: New test.
|
|
* gcc.target/i386/indirect-thunk-register-2.c: Likewise.
|
|
* gcc.target/i386/indirect-thunk-register-3.c: Likewise.
|
|
|
|
i386: Rename to ix86_indirect_branch_register
|
|
|
|
Rename the variable for -mindirect-branch-register to
|
|
ix86_indirect_branch_register to match the command-line option name.
|
|
|
|
Backport from mainline
|
|
2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
* config/i386/constraints.md (Bs): Replace
|
|
ix86_indirect_branch_thunk_register with
|
|
ix86_indirect_branch_register.
|
|
(Bw): Likewise.
|
|
* config/i386/i386.md (indirect_jump): Likewise.
|
|
(tablejump): Likewise.
|
|
(*sibcall_memory): Likewise.
|
|
(*sibcall_value_memory): Likewise.
|
|
Peepholes of indirect call and jump via memory: Likewise.
|
|
* config/i386/i386.opt: Likewise.
|
|
* config/i386/predicates.md (indirect_branch_operand): Likewise.
|
|
(GOT_memory_operand): Likewise.
|
|
(call_insn_operand): Likewise.
|
|
(sibcall_insn_operand): Likewise.
|
|
(GOT32_symbol_operand): Likewise.
|
|
|
|
x86: Rewrite ix86_indirect_branch_register logic
|
|
|
|
Rewrite ix86_indirect_branch_register logic with
|
|
|
|
(and (not (match_test "ix86_indirect_branch_register"))
|
|
(original condition before r256662))
|
|
|
|
Backport from mainline
|
|
2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
* config/i386/predicates.md (constant_call_address_operand):
|
|
Rewrite ix86_indirect_branch_register logic.
|
|
(sibcall_insn_operand): Likewise.
|
|
|
|
Don't check ix86_indirect_branch_register for GOT operand
|
|
|
|
Since GOT_memory_operand and GOT32_symbol_operand are simple pattern
|
|
matches, don't check ix86_indirect_branch_register here. If needed,
|
|
-mindirect-branch= will convert indirect branch via GOT slot to a call
|
|
and return thunk.
|
|
|
|
Backport from mainline
|
|
2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
* config/i386/constraints.md (Bs): Update
|
|
ix86_indirect_branch_register check. Don't check
|
|
ix86_indirect_branch_register with GOT_memory_operand.
|
|
(Bw): Likewise.
|
|
* config/i386/predicates.md (GOT_memory_operand): Don't check
|
|
ix86_indirect_branch_register here.
|
|
(GOT32_symbol_operand): Likewise.
|
|
|
|
i386: Rewrite indirect_branch_operand logic
|
|
|
|
Backport from mainline
|
|
2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
* config/i386/predicates.md (indirect_branch_operand): Rewrite
|
|
ix86_indirect_branch_register logic.
|
|
---
|
|
gcc/config/i386/constraints.md | 6 ++--
|
|
gcc/config/i386/i386.md | 34 ++++++++++++++--------
|
|
gcc/config/i386/i386.opt | 4 +++
|
|
gcc/config/i386/predicates.md | 21 +++++++------
|
|
gcc/doc/invoke.texi | 6 +++-
|
|
gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-attr-1.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-attr-2.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-attr-3.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-attr-4.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-attr-5.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-attr-6.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-attr-7.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-bnd-1.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-bnd-2.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-bnd-3.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-bnd-4.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-extern-1.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-extern-2.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-extern-3.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-extern-4.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-extern-5.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-extern-6.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-extern-7.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-inline-1.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-inline-2.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-inline-3.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-inline-4.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-inline-5.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-inline-6.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-inline-7.c | 2 +-
|
|
.../gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++++++++++
|
|
.../gcc.target/i386/indirect-thunk-register-2.c | 20 +++++++++++++
|
|
.../gcc.target/i386/indirect-thunk-register-3.c | 19 ++++++++++++
|
|
gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 +-
|
|
gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +-
|
|
47 files changed, 147 insertions(+), 63 deletions(-)
|
|
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
|
|
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
|
|
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
|
|
|
|
diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
|
|
index 1a4c701ad13..9204c8e8487 100644
|
|
--- a/gcc/config/i386/constraints.md
|
|
+++ b/gcc/config/i386/constraints.md
|
|
@@ -172,14 +172,16 @@
|
|
|
|
(define_constraint "Bs"
|
|
"@internal Sibcall memory operand."
|
|
- (ior (and (not (match_test "TARGET_X32"))
|
|
+ (ior (and (not (match_test "ix86_indirect_branch_register"))
|
|
+ (not (match_test "TARGET_X32"))
|
|
(match_operand 0 "sibcall_memory_operand"))
|
|
(and (match_test "TARGET_X32 && Pmode == DImode")
|
|
(match_operand 0 "GOT_memory_operand"))))
|
|
|
|
(define_constraint "Bw"
|
|
"@internal Call memory operand."
|
|
- (ior (and (not (match_test "TARGET_X32"))
|
|
+ (ior (and (not (match_test "ix86_indirect_branch_register"))
|
|
+ (not (match_test "TARGET_X32"))
|
|
(match_operand 0 "memory_operand"))
|
|
(and (match_test "TARGET_X32 && Pmode == DImode")
|
|
(match_operand 0 "GOT_memory_operand"))))
|
|
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
|
index 2da671e9f2d..05a88fff356 100644
|
|
--- a/gcc/config/i386/i386.md
|
|
+++ b/gcc/config/i386/i386.md
|
|
@@ -11805,7 +11805,7 @@
|
|
[(set (pc) (match_operand 0 "indirect_branch_operand"))]
|
|
""
|
|
{
|
|
- if (TARGET_X32)
|
|
+ if (TARGET_X32 || ix86_indirect_branch_register)
|
|
operands[0] = convert_memory_address (word_mode, operands[0]);
|
|
cfun->machine->has_local_indirect_jump = true;
|
|
})
|
|
@@ -11859,7 +11859,7 @@
|
|
OPTAB_DIRECT);
|
|
}
|
|
|
|
- if (TARGET_X32)
|
|
+ if (TARGET_X32 || ix86_indirect_branch_register)
|
|
operands[0] = convert_memory_address (word_mode, operands[0]);
|
|
cfun->machine->has_local_indirect_jump = true;
|
|
})
|
|
@@ -12048,7 +12048,7 @@
|
|
[(call (mem:QI (match_operand:W 0 "memory_operand" "m"))
|
|
(match_operand 1))
|
|
(unspec [(const_int 0)] UNSPEC_PEEPSIB)]
|
|
- "!TARGET_X32"
|
|
+ "!TARGET_X32 && !ix86_indirect_branch_register"
|
|
"* return ix86_output_call_insn (insn, operands[0]);"
|
|
[(set_attr "type" "call")])
|
|
|
|
@@ -12057,7 +12057,9 @@
|
|
(match_operand:W 1 "memory_operand"))
|
|
(call (mem:QI (match_dup 0))
|
|
(match_operand 3))]
|
|
- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1))
|
|
+ "!TARGET_X32
|
|
+ && !ix86_indirect_branch_register
|
|
+ && SIBLING_CALL_P (peep2_next_insn (1))
|
|
&& !reg_mentioned_p (operands[0],
|
|
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
|
|
[(parallel [(call (mem:QI (match_dup 1))
|
|
@@ -12070,7 +12072,9 @@
|
|
(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
|
(call (mem:QI (match_dup 0))
|
|
(match_operand 3))]
|
|
- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2))
|
|
+ "!TARGET_X32
|
|
+ && !ix86_indirect_branch_register
|
|
+ && SIBLING_CALL_P (peep2_next_insn (2))
|
|
&& !reg_mentioned_p (operands[0],
|
|
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
|
|
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
|
@@ -12092,7 +12096,7 @@
|
|
})
|
|
|
|
(define_insn "*call_pop"
|
|
- [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lmBz"))
|
|
+ [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lBwBz"))
|
|
(match_operand 1))
|
|
(set (reg:SI SP_REG)
|
|
(plus:SI (reg:SI SP_REG)
|
|
@@ -12112,7 +12116,7 @@
|
|
[(set_attr "type" "call")])
|
|
|
|
(define_insn "*sibcall_pop_memory"
|
|
- [(call (mem:QI (match_operand:SI 0 "memory_operand" "m"))
|
|
+ [(call (mem:QI (match_operand:SI 0 "memory_operand" "Bs"))
|
|
(match_operand 1))
|
|
(set (reg:SI SP_REG)
|
|
(plus:SI (reg:SI SP_REG)
|
|
@@ -12166,7 +12170,9 @@
|
|
[(set (match_operand:W 0 "register_operand")
|
|
(match_operand:W 1 "memory_operand"))
|
|
(set (pc) (match_dup 0))]
|
|
- "!TARGET_X32 && peep2_reg_dead_p (2, operands[0])"
|
|
+ "!TARGET_X32
|
|
+ && !ix86_indirect_branch_register
|
|
+ && peep2_reg_dead_p (2, operands[0])"
|
|
[(set (pc) (match_dup 1))])
|
|
|
|
;; Call subroutine, returning value in operand 0
|
|
@@ -12244,7 +12250,7 @@
|
|
(call (mem:QI (match_operand:W 1 "memory_operand" "m"))
|
|
(match_operand 2)))
|
|
(unspec [(const_int 0)] UNSPEC_PEEPSIB)]
|
|
- "!TARGET_X32"
|
|
+ "!TARGET_X32 && !ix86_indirect_branch_register"
|
|
"* return ix86_output_call_insn (insn, operands[1]);"
|
|
[(set_attr "type" "callv")])
|
|
|
|
@@ -12254,7 +12260,9 @@
|
|
(set (match_operand 2)
|
|
(call (mem:QI (match_dup 0))
|
|
(match_operand 3)))]
|
|
- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1))
|
|
+ "!TARGET_X32
|
|
+ && !ix86_indirect_branch_register
|
|
+ && SIBLING_CALL_P (peep2_next_insn (1))
|
|
&& !reg_mentioned_p (operands[0],
|
|
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
|
|
[(parallel [(set (match_dup 2)
|
|
@@ -12269,7 +12277,9 @@
|
|
(set (match_operand 2)
|
|
(call (mem:QI (match_dup 0))
|
|
(match_operand 3)))]
|
|
- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2))
|
|
+ "!TARGET_X32
|
|
+ && !ix86_indirect_branch_register
|
|
+ && SIBLING_CALL_P (peep2_next_insn (2))
|
|
&& !reg_mentioned_p (operands[0],
|
|
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
|
|
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
|
@@ -12294,7 +12304,7 @@
|
|
|
|
(define_insn "*call_value_pop"
|
|
[(set (match_operand 0)
|
|
- (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lmBz"))
|
|
+ (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lBwBz"))
|
|
(match_operand 2)))
|
|
(set (reg:SI SP_REG)
|
|
(plus:SI (reg:SI SP_REG)
|
|
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
|
|
index ad5916fb643..a97f84f68f2 100644
|
|
--- a/gcc/config/i386/i386.opt
|
|
+++ b/gcc/config/i386/i386.opt
|
|
@@ -921,3 +921,7 @@ Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_inline)
|
|
|
|
EnumValue
|
|
Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_extern)
|
|
+
|
|
+mindirect-branch-register
|
|
+Target Report Var(ix86_indirect_branch_register) Init(0)
|
|
+Force indirect call and jump via register.
|
|
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
|
|
index 93dda7bb0e7..d1f0a7dbf61 100644
|
|
--- a/gcc/config/i386/predicates.md
|
|
+++ b/gcc/config/i386/predicates.md
|
|
@@ -593,7 +593,8 @@
|
|
;; Test for a valid operand for indirect branch.
|
|
(define_predicate "indirect_branch_operand"
|
|
(ior (match_operand 0 "register_operand")
|
|
- (and (not (match_test "TARGET_X32"))
|
|
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
+ (not (match_test "TARGET_X32"))
|
|
(match_operand 0 "memory_operand"))))
|
|
|
|
;; Return true if OP is a memory operands that can be used in sibcalls.
|
|
@@ -636,20 +637,22 @@
|
|
(ior (match_test "constant_call_address_operand
|
|
(op, mode == VOIDmode ? mode : Pmode)")
|
|
(match_operand 0 "call_register_no_elim_operand")
|
|
- (ior (and (not (match_test "TARGET_X32"))
|
|
- (match_operand 0 "memory_operand"))
|
|
- (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
- (match_operand 0 "GOT_memory_operand")))))
|
|
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
+ (ior (and (not (match_test "TARGET_X32"))
|
|
+ (match_operand 0 "memory_operand"))
|
|
+ (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
+ (match_operand 0 "GOT_memory_operand"))))))
|
|
|
|
;; Similarly, but for tail calls, in which we cannot allow memory references.
|
|
(define_special_predicate "sibcall_insn_operand"
|
|
(ior (match_test "constant_call_address_operand
|
|
(op, mode == VOIDmode ? mode : Pmode)")
|
|
(match_operand 0 "register_no_elim_operand")
|
|
- (ior (and (not (match_test "TARGET_X32"))
|
|
- (match_operand 0 "sibcall_memory_operand"))
|
|
- (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
- (match_operand 0 "GOT_memory_operand")))))
|
|
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
+ (ior (and (not (match_test "TARGET_X32"))
|
|
+ (match_operand 0 "sibcall_memory_operand"))
|
|
+ (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
+ (match_operand 0 "GOT_memory_operand"))))))
|
|
|
|
;; Return true if OP is a 32-bit GOT symbol operand.
|
|
(define_predicate "GOT32_symbol_operand"
|
|
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
|
index 337a761015a..94374661f2d 100644
|
|
--- a/gcc/doc/invoke.texi
|
|
+++ b/gcc/doc/invoke.texi
|
|
@@ -1170,7 +1170,7 @@ See RS/6000 and PowerPC Options.
|
|
-mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
|
|
-malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
|
|
-mmitigate-rop -mindirect-branch=@var{choice} @gol
|
|
--mfunction-return=@var{choice}}
|
|
+-mfunction-return=@var{choice} -mindirect-branch-register}
|
|
|
|
@emph{x86 Windows Options}
|
|
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
|
|
@@ -24253,6 +24253,10 @@ object file. You can control this behavior for a specific function by
|
|
using the function attribute @code{function_return}.
|
|
@xref{Function Attributes}.
|
|
|
|
+@item -mindirect-branch-register
|
|
+@opindex -mindirect-branch-register
|
|
+Force indirect call and jump via register.
|
|
+
|
|
@end table
|
|
|
|
These @samp{-m} switches are supported in addition to the above
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
|
index e365ef5698a..60d09881a99 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
|
index 05a51ad9157..aac75163794 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
|
index 3c0d4c39f0b..9e24a385387 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
|
index 14d4ef6dd98..127b5d94523 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
index b4836c38d6c..fcaa18d10b7 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target *-*-linux* } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
|
|
extern void bar (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
index 1f06bd1af74..e4649283d10 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target *-*-linux* } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
|
|
extern void bar (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
|
index bc6b47a636e..17c2d0faf88 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
|
|
void func0 (void);
|
|
void func1 (void);
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
|
index 2257be3affa..9194ccf3cbc 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
|
index e9cfdc5879e..e51f261a612 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
|
index f938db050f7..4aeec1833cd 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
|
index 4e58599692a..ac0e5999f63 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
|
index b8d50249d8b..573cf1ef09e 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
|
index 455adabfe0e..b2b37fc6e2e 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
|
index 4595b841ec0..4a43e199931 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
|
|
|
void func0 (void);
|
|
void func1 (void);
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
|
index 5e3e118e9bd..ac84ab623fa 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target { ! x32 } } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
|
|
|
void (*dispatch) (char *);
|
|
char buf[10];
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
|
index 2801aa4192e..ce655e8be1c 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target { ! x32 } } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
|
|
|
void (*dispatch) (char *);
|
|
char buf[10];
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
index 70b4fb36eea..d34485a0010 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
|
|
void bar (char *);
|
|
char buf[10];
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
index 3baf03ee77c..0e19830de4d 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
|
|
void bar (char *);
|
|
char buf[10];
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
|
index edeb264218c..579441f250e 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
|
index 1d00413a76a..c92e6f2b02d 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
|
index 06ebf1c9063..d9964c25bbd 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
|
index 1c8f9446636..d4dca4dc5fe 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
index 21740ac5b7f..5c07e02df6a 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target *-*-linux* } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
|
|
extern void bar (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
index a77c1f470b8..3eb440693a0 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target *-*-linux* } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
|
|
extern void bar (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
|
index 86e9fd1f1e4..aece9383697 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
|
|
void func0 (void);
|
|
void func1 (void);
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
|
index 3ecde878867..3aba5e8c81f 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
|
index df32a19a2b5..0f0181d6672 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
|
index 9540996de01..2eef6f35a75 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
|
index f3db6e2441f..e825a10f14c 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
|
|
typedef void (*dispatch_t)(long offset);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
index 0f687c3b027..c6d77e10352 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target *-*-linux* } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
|
|
extern void bar (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
index b27c6fc96a2..6454827b780 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile { target *-*-linux* } } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
|
|
extern void bar (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
|
index 764a375fc37..c67066cf197 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
|
|
void func0 (void);
|
|
void func1 (void);
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
|
|
new file mode 100644
|
|
index 00000000000..7d396a31953
|
|
--- /dev/null
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
|
|
@@ -0,0 +1,22 @@
|
|
+/* { dg-do compile } */
|
|
+/* { dg-options "-O2 -mindirect-branch=thunk -mindirect-branch-register -fno-pic" } */
|
|
+
|
|
+typedef void (*dispatch_t)(long offset);
|
|
+
|
|
+dispatch_t dispatch;
|
|
+
|
|
+void
|
|
+male_indirect_jump (long offset)
|
|
+{
|
|
+ dispatch(offset);
|
|
+}
|
|
+
|
|
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */
|
|
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
|
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
|
+/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */
|
|
+/* { dg-final { scan-assembler {\tpause} } } */
|
|
+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
|
|
+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
|
|
+/* { dg-final { scan-assembler-not "__x86_indirect_thunk\n" } } */
|
|
+/* { dg-final { scan-assembler-not "__x86_indirect_thunk_bnd\n" } } */
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
|
|
new file mode 100644
|
|
index 00000000000..e7e616bb271
|
|
--- /dev/null
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
|
|
@@ -0,0 +1,20 @@
|
|
+/* { dg-do compile } */
|
|
+/* { dg-options "-O2 -mindirect-branch=thunk-inline -mindirect-branch-register -fno-pic" } */
|
|
+
|
|
+typedef void (*dispatch_t)(long offset);
|
|
+
|
|
+dispatch_t dispatch;
|
|
+
|
|
+void
|
|
+male_indirect_jump (long offset)
|
|
+{
|
|
+ dispatch(offset);
|
|
+}
|
|
+
|
|
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
|
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
|
+/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */
|
|
+/* { dg-final { scan-assembler {\tpause} } } */
|
|
+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
|
|
+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
|
|
+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
|
|
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
|
|
new file mode 100644
|
|
index 00000000000..5320e923be2
|
|
--- /dev/null
|
|
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
|
|
@@ -0,0 +1,19 @@
|
|
+/* { dg-do compile } */
|
|
+/* { dg-options "-O2 -mindirect-branch=thunk-extern -mindirect-branch-register -fno-pic" } */
|
|
+
|
|
+typedef void (*dispatch_t)(long offset);
|
|
+
|
|
+dispatch_t dispatch;
|
|
+
|
|
+void
|
|
+male_indirect_jump (long offset)
|
|
+{
|
|
+ dispatch(offset);
|
|
+}
|
|
+
|
|
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */
|
|
+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
|
|
+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
|
|
+/* { dg-final { scan-assembler-not {\t(pause|pause|nop)} } } */
|
|
+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
|
|
+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
|
|
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
|
index 3a6727b5c54..e6fea84a4d9 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */
|
|
|
|
extern void (*bar) (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
|
index b8f68188313..e239ec4542f 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { 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" } */
|
|
|
|
extern void (*bar) (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
|
index 01b0a02f80b..fa3181303c9 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { 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" } */
|
|
|
|
extern void (*bar) (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
|
index 4b497b5f8af..fd5b41fdd3f 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
|
|
|
extern void (*bar) (void);
|
|
extern int foo (void) __attribute__ ((function_return("thunk")));
|
|
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
|
index 4ae4c44a3fd..d606373ead1 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
|
|
|
extern void (*bar) (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
|
index 5b5bc765a7e..75e45e226b8 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */
|
|
+/* { 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" } */
|
|
|
|
extern void (*bar) (void);
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
index fa24a1f7365..d1db41cc128 100644
|
|
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
@@ -1,5 +1,5 @@
|
|
/* { dg-do compile } */
|
|
-/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */
|
|
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */
|
|
|
|
extern void (*bar) (void);
|
|
|
|
--
|
|
2.16.3
|
|
|