aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2015-07-05 07:56:45 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2015-07-05 07:56:45 +0000
commitc65aa0429d688103b446a7cb2985c351b52071f3 (patch)
tree8259493253aa32f29e39453efeeca64cecadb24b
parent9c58793af54226c898ae27c913a8f9d85bbf948c (diff)
downloadgcc-c65aa0429d688103b446a7cb2985c351b52071f3.zip
gcc-c65aa0429d688103b446a7cb2985c351b52071f3.tar.gz
gcc-c65aa0429d688103b446a7cb2985c351b52071f3.tar.bz2
target-insns.def (stack_protect_set, [...]): New targetm instruction patterns.
gcc/ * target-insns.def (stack_protect_set, stack_protect_test): New targetm instruction patterns. * cfgexpand.c (stack_protect_prologue): Use them instead of HAVE_*/gen_* interface. * function.c (stack_protect_epilogue): Likewise. From-SVN: r225428
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cfgexpand.c20
-rw-r--r--gcc/function.c12
-rw-r--r--gcc/target-insns.def2
4 files changed, 19 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c1a7abb..6f077c7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2015-07-05 Richard Sandiford <richard.sandiford@arm.com>
+ * target-insns.def (stack_protect_set, stack_protect_test): New
+ targetm instruction patterns.
+ * cfgexpand.c (stack_protect_prologue): Use them instead of
+ HAVE_*/gen_* interface.
+ * function.c (stack_protect_epilogue): Likewise.
+
+2015-07-05 Richard Sandiford <richard.sandiford@arm.com>
+
* expr.h (gen_move_insn_uncast): Delete.
* expr.c (gen_move_insn_uncast): Delete.
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 05eb2ad..4f9a31d 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -5767,11 +5767,6 @@ expand_main_function (void)
/* Expand code to initialize the stack_protect_guard. This is invoked at
the beginning of a function to be protected. */
-#ifndef HAVE_stack_protect_set
-# define HAVE_stack_protect_set 0
-# define gen_stack_protect_set(x,y) (gcc_unreachable (), NULL_RTX)
-#endif
-
static void
stack_protect_prologue (void)
{
@@ -5783,15 +5778,12 @@ stack_protect_prologue (void)
/* Allow the target to copy from Y to X without leaking Y into a
register. */
- if (HAVE_stack_protect_set)
- {
- rtx insn = gen_stack_protect_set (x, y);
- if (insn)
- {
- emit_insn (insn);
- return;
- }
- }
+ if (targetm.have_stack_protect_set ())
+ if (rtx_insn *insn = targetm.gen_stack_protect_set (x, y))
+ {
+ emit_insn (insn);
+ return;
+ }
/* Otherwise do a straight move. */
emit_move_insn (x, y);
diff --git a/gcc/function.c b/gcc/function.c
index 8134c4e..2c9deac 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4874,11 +4874,6 @@ init_function_start (tree subr)
/* Expand code to verify the stack_protect_guard. This is invoked at
the end of a function to be protected. */
-#ifndef HAVE_stack_protect_test
-# define HAVE_stack_protect_test 0
-# define gen_stack_protect_test(x, y, z) (gcc_unreachable (), NULL_RTX)
-#endif
-
void
stack_protect_epilogue (void)
{
@@ -4891,13 +4886,12 @@ stack_protect_epilogue (void)
/* Allow the target to compare Y with X without leaking either into
a register. */
- switch (HAVE_stack_protect_test != 0)
+ switch (targetm.have_stack_protect_test ())
{
case 1:
- tmp = gen_stack_protect_test (x, y, label);
- if (tmp)
+ if (rtx_insn *seq = targetm.gen_stack_protect_test (x, y, label))
{
- emit_insn (tmp);
+ emit_insn (seq);
break;
}
/* FALLTHRU */
diff --git a/gcc/target-insns.def b/gcc/target-insns.def
index 12994d3..6aae708 100644
--- a/gcc/target-insns.def
+++ b/gcc/target-insns.def
@@ -55,6 +55,8 @@ DEF_TARGET_INSN (save_stack_function, (rtx x0, rtx x1))
DEF_TARGET_INSN (save_stack_nonlocal, (rtx x0, rtx x1))
DEF_TARGET_INSN (sibcall_epilogue, (void))
DEF_TARGET_INSN (simple_return, (void))
+DEF_TARGET_INSN (stack_protect_set, (rtx x0, rtx x1))
+DEF_TARGET_INSN (stack_protect_test, (rtx x0, rtx x1, rtx x2))
DEF_TARGET_INSN (store_multiple, (rtx x0, rtx x1, rtx x2))
DEF_TARGET_INSN (tablejump, (rtx x0, rtx x1))
DEF_TARGET_INSN (trap, (void))