]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[AARCH64] Use standard patterns for stack protection.
authorVenkataramanan Kumar <venkataramanan.kumar@linaro.org>
Wed, 23 Apr 2014 17:01:39 +0000 (17:01 +0000)
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>
Wed, 23 Apr 2014 17:01:39 +0000 (17:01 +0000)
From-SVN: r209712

gcc/ChangeLog
gcc/config/aarch64/aarch64.md

index 724fa3b85891920c48be6c6a4f0331e39926d759..638c0da2d295289b1c6ee17b323afd2d5a788721 100644 (file)
@@ -1,3 +1,9 @@
+2014-04-23 Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
+
+       * config/aarch64/aarch64.md (stack_protect_set, stack_protect_test)
+       (stack_protect_set_<mode>, stack_protect_test_<mode>): Add
+       machine descriptions for Stack Smashing Protector.
+
 2014-04-23  Richard Earnshaw  <rearnsha@arm.com>
 
        * aarch64.md (<optab>_rol<mode>3): New pattern.
index 1c017e7d6b6236b922e4a89f9a6d601ab6c6104e..7965db4c9c79c2e5b400b3639df6e2ef15b288e6 100644 (file)
     UNSPEC_USHL_2S
     UNSPEC_USHR64
     UNSPEC_VSTRUCTDUMMY
+    UNSPEC_SP_SET
+    UNSPEC_SP_TEST
 ])
 
 (define_c_enum "unspecv" [
   DONE;
 })
 
+;; Named patterns for stack smashing protection.
+(define_expand "stack_protect_set"
+  [(match_operand 0 "memory_operand")
+   (match_operand 1 "memory_operand")]
+  ""
+{
+  enum machine_mode mode = GET_MODE (operands[0]);
+
+  emit_insn ((mode == DImode
+             ? gen_stack_protect_set_di
+             : gen_stack_protect_set_si) (operands[0], operands[1]));
+  DONE;
+})
+
+(define_insn "stack_protect_set_<mode>"
+  [(set (match_operand:PTR 0 "memory_operand" "=m")
+       (unspec:PTR [(match_operand:PTR 1 "memory_operand" "m")]
+        UNSPEC_SP_SET))
+   (set (match_scratch:PTR 2 "=&r") (const_int 0))]
+  ""
+  "ldr\\t%x2, %1\;str\\t%x2, %0\;mov\t%x2,0"
+  [(set_attr "length" "12")
+   (set_attr "type" "multiple")])
+
+(define_expand "stack_protect_test"
+  [(match_operand 0 "memory_operand")
+   (match_operand 1 "memory_operand")
+   (match_operand 2)]
+  ""
+{
+
+  rtx result = gen_reg_rtx (Pmode);
+
+  enum machine_mode mode = GET_MODE (operands[0]);
+
+  emit_insn ((mode == DImode
+             ? gen_stack_protect_test_di
+             : gen_stack_protect_test_si) (result,
+                                           operands[0],
+                                           operands[1]));
+
+  if (mode == DImode)
+    emit_jump_insn (gen_cbranchdi4 (gen_rtx_EQ (VOIDmode, result, const0_rtx),
+                                   result, const0_rtx, operands[2]));
+  else
+    emit_jump_insn (gen_cbranchsi4 (gen_rtx_EQ (VOIDmode, result, const0_rtx),
+                                   result, const0_rtx, operands[2]));
+  DONE;
+})
+
+(define_insn "stack_protect_test_<mode>"
+  [(set (match_operand:PTR 0 "register_operand")
+       (unspec:PTR [(match_operand:PTR 1 "memory_operand" "m")
+                    (match_operand:PTR 2 "memory_operand" "m")]
+        UNSPEC_SP_TEST))
+   (clobber (match_scratch:PTR 3 "=&r"))]
+  ""
+  "ldr\t%x3, %x1\;ldr\t%x0, %x2\;eor\t%x0, %x3, %x0"
+  [(set_attr "length" "12")
+   (set_attr "type" "multiple")])
+
 ;; AdvSIMD Stuff
 (include "aarch64-simd.md")