[AARCH64] Use standard patterns for stack protection.

From-SVN: r209712
This commit is contained in:
Venkataramanan Kumar 2014-04-23 17:01:39 +00:00 committed by Marcus Shawcroft
parent 57b77d46b6
commit 36e170203e
2 changed files with 69 additions and 0 deletions

View 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.

View File

@ -103,6 +103,8 @@
UNSPEC_USHL_2S
UNSPEC_USHR64
UNSPEC_VSTRUCTDUMMY
UNSPEC_SP_SET
UNSPEC_SP_TEST
])
(define_c_enum "unspecv" [
@ -3800,6 +3802,67 @@
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")