Bootstrapped & regression-tested on x86_64-linux-gnu and aarch64-linux-gnu.
Also tested via config-list.mk.  Committed as preapproved.

Thanks,
Richard


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.

Index: gcc/target-insns.def
===================================================================
--- gcc/target-insns.def        2015-07-05 08:55:39.336569730 +0100
+++ gcc/target-insns.def        2015-07-05 08:55:39.332569792 +0100
@@ -55,6 +55,8 @@ DEF_TARGET_INSN (save_stack_function, (r
 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))
Index: gcc/cfgexpand.c
===================================================================
--- gcc/cfgexpand.c     2015-07-05 08:55:39.336569730 +0100
+++ gcc/cfgexpand.c     2015-07-05 08:55:39.328569856 +0100
@@ -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);
Index: gcc/function.c
===================================================================
--- gcc/function.c      2015-07-05 08:55:39.336569730 +0100
+++ gcc/function.c      2015-07-05 08:55:39.332569792 +0100
@@ -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 */

Reply via email to