557 lines
25 KiB
Diff
557 lines
25 KiB
Diff
commit fd62d9a6b22d1e420872e4638ef5a7e738ab4930
|
|
Author: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
Date: Tue Jan 16 11:17:49 2018 +0000
|
|
|
|
HJ patch #3
|
|
|
|
diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
|
|
index 89722bb..56f5385 100644
|
|
--- a/gcc/config/i386/constraints.md
|
|
+++ b/gcc/config/i386/constraints.md
|
|
@@ -105,6 +105,11 @@
|
|
"TARGET_MMX && TARGET_INTER_UNIT_MOVES ? MMX_REGS : NO_REGS"
|
|
"@internal Any MMX register, when inter-unit moves are enabled.")
|
|
|
|
+(define_constraint "w"
|
|
+ "@internal Call memory operand."
|
|
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
+ (match_operand 0 "memory_operand")))
|
|
+
|
|
;; Integer constant constraints.
|
|
(define_constraint "I"
|
|
"Integer constant in the range 0 @dots{} 31, for 32-bit shifts."
|
|
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
|
index 33f4059..4b02a27 100644
|
|
--- a/gcc/config/i386/i386.md
|
|
+++ b/gcc/config/i386/i386.md
|
|
@@ -15294,6 +15294,8 @@
|
|
[(set (pc) (match_operand 0 "nonimmediate_operand" ""))]
|
|
""
|
|
{
|
|
+ if (ix86_indirect_branch_register)
|
|
+ operands[0] = convert_memory_address (word_mode, operands[0]);
|
|
cfun->machine->has_local_indirect_jump = true;
|
|
})
|
|
|
|
@@ -15344,6 +15346,8 @@
|
|
operands[0] = expand_simple_binop (Pmode, code, op0, op1, NULL_RTX, 0,
|
|
OPTAB_DIRECT);
|
|
}
|
|
+ if (ix86_indirect_branch_register)
|
|
+ operands[0] = convert_memory_address (word_mode, operands[0]);
|
|
cfun->machine->has_local_indirect_jump = true;
|
|
})
|
|
|
|
@@ -15436,7 +15440,7 @@
|
|
[(set_attr "type" "call")])
|
|
|
|
(define_insn "*call_pop_1"
|
|
- [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lsm"))
|
|
+ [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lsw"))
|
|
(match_operand:SI 1 "" ""))
|
|
(set (reg:SI SP_REG) (plus:SI (reg:SI SP_REG)
|
|
(match_operand:SI 2 "immediate_operand" "i")))]
|
|
@@ -15481,7 +15485,7 @@
|
|
[(set_attr "type" "call")])
|
|
|
|
(define_insn "*call_1"
|
|
- [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lsm"))
|
|
+ [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lsw"))
|
|
(match_operand 1 "" ""))]
|
|
"!TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
"* return ix86_output_call_insn (insn, operands[0]);"
|
|
@@ -15495,7 +15499,7 @@
|
|
[(set_attr "type" "call")])
|
|
|
|
(define_insn "*call_1_rex64"
|
|
- [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "lsm"))
|
|
+ [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "lsw"))
|
|
(match_operand 1 "" ""))]
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)
|
|
&& ix86_cmodel != CM_LARGE && ix86_cmodel != CM_LARGE_PIC"
|
|
@@ -15503,7 +15507,7 @@
|
|
[(set_attr "type" "call")])
|
|
|
|
(define_insn "*call_1_rex64_ms_sysv"
|
|
- [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "lsm"))
|
|
+ [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "lsw"))
|
|
(match_operand 1 "" ""))
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
(clobber (reg:TI XMM6_REG))
|
|
@@ -15523,7 +15527,7 @@
|
|
[(set_attr "type" "call")])
|
|
|
|
(define_insn "*call_1_rex64_large"
|
|
- [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "lm"))
|
|
+ [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "lw"))
|
|
(match_operand 1 "" ""))]
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
"* return ix86_output_call_insn (insn, operands[0]);"
|
|
@@ -22218,7 +22222,7 @@
|
|
|
|
(define_insn "*call_value_pop_1"
|
|
[(set (match_operand 0 "" "")
|
|
- (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lsm"))
|
|
+ (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lsw"))
|
|
(match_operand:SI 2 "" "")))
|
|
(set (reg:SI SP_REG) (plus:SI (reg:SI SP_REG)
|
|
(match_operand:SI 3 "immediate_operand" "i")))]
|
|
@@ -22275,7 +22279,7 @@
|
|
|
|
(define_insn "*call_value_1"
|
|
[(set (match_operand 0 "" "")
|
|
- (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lsm"))
|
|
+ (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lsw"))
|
|
(match_operand:SI 2 "" "")))]
|
|
"!TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
"*return ix86_output_call_insn (insn, operands[1]);"
|
|
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
|
|
index f0a0217..6e6b487 100644
|
|
--- a/gcc/config/i386/i386.opt
|
|
+++ b/gcc/config/i386/i386.opt
|
|
@@ -387,3 +387,7 @@ Convert indirect call and jump to call and return thunks.
|
|
mfunction-return=
|
|
Target Report RejectNegative Joined Var(ix86_function_return_string) Init("keep")
|
|
Convert function return to call and return thunk.
|
|
+
|
|
+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 4a5acda..b489688 100644
|
|
--- a/gcc/config/i386/predicates.md
|
|
+++ b/gcc/config/i386/predicates.md
|
|
@@ -578,7 +578,8 @@
|
|
(define_predicate "call_insn_operand"
|
|
(ior (match_operand 0 "constant_call_address_operand")
|
|
(ior (match_operand 0 "call_register_no_elim_operand")
|
|
- (match_operand 0 "memory_operand"))))
|
|
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
+ (match_operand 0 "memory_operand")))))
|
|
|
|
;; Similarly, but for tail calls, in which we cannot allow memory references.
|
|
(define_predicate "sibcall_insn_operand"
|
|
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
|
index 5bf5978..5857506 100644
|
|
--- a/gcc/doc/invoke.texi
|
|
+++ b/gcc/doc/invoke.texi
|
|
@@ -592,7 +592,8 @@ Objective-C and Objective-C++ Dialects}.
|
|
-mcmodel=@var{code-model} @gol
|
|
-m32 -m64 -mlarge-data-threshold=@var{num} @gol
|
|
-msse2avx
|
|
--mindirect-branch=@var{choice} -mfunction-return==@var{choice}}
|
|
+-mindirect-branch=@var{choice} -mfunction-return==@var{choice}
|
|
+-mindirect-branch-register}
|
|
|
|
@emph{i386 and x86-64 Windows Options}
|
|
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll
|
|
@@ -11727,6 +11728,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 034b4cc..321db77 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 e0c57cb..d584516 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 caa4402..2d3cb52 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 8ff2840..c66b5e6 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-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
|
index 1084d6c..7542fc9 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 7c45142..cd7e8d7 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 9eebc84..4dbd7a5 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 1013e75..78392b9 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 2422489..0be25d1 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 c62dfab..4a1114b 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 c42ed39..521fa81 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 02ae316..244120d 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-extern-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
|
index f424181..72de88e 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 ac54868..d4137b3 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 4a21e28..31245de 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 53cf271..699089c 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-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
|
index 0fb4565..5ad0003 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 cb31009..a46d2ab 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 29c836f..f118d38 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 be13f55..888cfd8 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 c2e08e2..0cf0455 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-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
|
index 77cce21..8cd70fa 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 0000000..7d396a3
|
|
--- /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 0000000..e7e616b
|
|
--- /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 0000000..5320e92
|
|
--- /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 501a173..704efee 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 c1dc86f..79f0488 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 5f99dc2..0d4241c 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 9d159df..53017c1 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 807d99a..f17c7f5 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 ccc82a1..c249943 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 617d5c6..84846b4 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);
|
|
|