diff options
author | Stefan Schulze Frielinghaus <xxschulz@de.ibm.com> | 2008-10-29 19:33:45 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2008-10-29 19:33:45 +0000 |
commit | 7310a2da1cb6abdaf82617b973855fa6131ae9dd (patch) | |
tree | 2c34acbf862418e277444a8ede49f1eee657fa78 /gcc | |
parent | cdd6a337c0e1c4a07a0a45686dcaa159e51f451c (diff) | |
download | gcc-7310a2da1cb6abdaf82617b973855fa6131ae9dd.zip gcc-7310a2da1cb6abdaf82617b973855fa6131ae9dd.tar.gz gcc-7310a2da1cb6abdaf82617b973855fa6131ae9dd.tar.bz2 |
configure.ac [spu-*-*]: Do not set skipdirs.
ChangeLog:
2008-10-29 Stefan Schulze Frielinghaus <xxschulz@de.ibm.com>
* configure.ac [spu-*-*]: Do not set skipdirs.
* configure: Re-generate.
gcc/ChangeLog:
2008-10-29 Stefan Schulze Frielinghaus <xxschulz@de.ibm.com>
* config/spu/spu.h (FRAME_GROWS_DOWNWARD): Define.
(INITIAL_FRAME_POINTER_OFFSET): Remove.
* config/spu/spu.c (spu_initial_elimination_offset): Calculate new
offset if eliminating soft frame pointer.
* config/spu/spu.md (stack_protect_set, stack_protect_test)
(stack_protect_test_si): Add initial machine description
for Stack Smashing Protector
From-SVN: r141437
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/spu/spu.c | 21 | ||||
-rw-r--r-- | gcc/config/spu/spu.h | 4 | ||||
-rw-r--r-- | gcc/config/spu/spu.md | 49 |
4 files changed, 72 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc5ab3b..bf3467d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2008-10-29 Stefan Schulze Frielinghaus <xxschulz@de.ibm.com> + + * config/spu/spu.h (FRAME_GROWS_DOWNWARD): Define. + (INITIAL_FRAME_POINTER_OFFSET): Remove. + * config/spu/spu.c (spu_initial_elimination_offset): Calculate new + offset if eliminating soft frame pointer. + * config/spu/spu.md (stack_protect_set, stack_protect_test) + (stack_protect_test_si): Add initial machine description + for Stack Smashing Protector + 2008-10-29 Manuel Lopez-Ibanez <manu@gcc.gnu.org> PR 11492 diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index e3781d5..cd7f6ed 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -1759,8 +1759,8 @@ direct_return (void) The stack frame looks like this: +-------------+ | incoming | - AP | args | - +-------------+ + | args | + AP -> +-------------+ | $lr save | +-------------+ prev SP | back chain | @@ -1770,10 +1770,10 @@ direct_return (void) +-------------+ | ... | | saved regs | spu_saved_regs_size() bytes - +-------------+ + FP -> +-------------+ | ... | - FP | vars | get_frame_size() bytes - +-------------+ + | vars | get_frame_size() bytes + HFP -> +-------------+ | ... | | outgoing | | args | crtl->outgoing_args_size bytes @@ -1781,8 +1781,8 @@ direct_return (void) | $lr of next | | frame | +-------------+ - SP | back chain | - +-------------+ + | back chain | + SP -> +-------------+ */ void @@ -3671,15 +3671,16 @@ spu_initial_elimination_offset (int from, int to) || get_frame_size () || saved_regs_size) sp_offset = STACK_POINTER_OFFSET; if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM) - return (sp_offset + crtl->outgoing_args_size); + return get_frame_size () + crtl->outgoing_args_size + sp_offset; else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM) - return 0; + return get_frame_size (); else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM) return sp_offset + crtl->outgoing_args_size + get_frame_size () + saved_regs_size + STACK_POINTER_OFFSET; else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM) return get_frame_size () + saved_regs_size + sp_offset; - return 0; + else + gcc_unreachable (); } rtx diff --git a/gcc/config/spu/spu.h b/gcc/config/spu/spu.h index 4789c10..f93a0e6 100644 --- a/gcc/config/spu/spu.h +++ b/gcc/config/spu/spu.h @@ -251,6 +251,8 @@ targetm.resolve_overloaded_builtin = spu_resolve_overloaded_builtin; \ #define STACK_GROWS_DOWNWARD +#define FRAME_GROWS_DOWNWARD 1 + #define STARTING_FRAME_OFFSET (0) #define STACK_POINTER_OFFSET 32 @@ -312,8 +314,6 @@ targetm.resolve_overloaded_builtin = spu_resolve_overloaded_builtin; \ #define FRAME_POINTER_REQUIRED 0 -#define INITIAL_FRAME_POINTER_OFFSET(DEPTH) ((DEPTH) = 0) - #define ELIMINABLE_REGS \ {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ {ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ diff --git a/gcc/config/spu/spu.md b/gcc/config/spu/spu.md index d1fa6f0..e7b48f5 100644 --- a/gcc/config/spu/spu.md +++ b/gcc/config/spu/spu.md @@ -155,6 +155,8 @@ (UNSPEC_DFTSV 51) (UNSPEC_FLOAT_EXTEND 52) (UNSPEC_FLOAT_TRUNCATE 53) + (UNSPEC_SP_SET 54) + (UNSPEC_SP_TEST 55) ]) (include "predicates.md") @@ -5188,4 +5190,51 @@ DONE; DONE; }") +(define_insn "stack_protect_set" + [(set (match_operand:SI 0 "spu_mem_operand" "=m") + (unspec:SI [(match_operand:SI 1 "spu_mem_operand" "m")] UNSPEC_SP_SET)) + (set (match_scratch:SI 2 "=&r") (const_int 0))] + "" + "lq%p1\t%2,%1\;stq%p0\t%2,%0\;xor\t%2,%2,%2" + [(set_attr "length" "12") + (set_attr "type" "multi1")] +) + +(define_expand "stack_protect_test" + [(match_operand 0 "spu_mem_operand" "") + (match_operand 1 "spu_mem_operand" "") + (match_operand 2 "" "")] + "" +{ + rtx compare_result; + rtx bcomp, loc_ref; + + compare_result = gen_reg_rtx (SImode); + + emit_insn (gen_stack_protect_test_si (compare_result, + operands[0], + operands[1])); + + bcomp = gen_rtx_NE (SImode, compare_result, const0_rtx); + + loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[2]); + + emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, + gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, + loc_ref, pc_rtx))); + + DONE; +}) + +(define_insn "stack_protect_test_si" + [(set (match_operand:SI 0 "spu_reg_operand" "=&r") + (unspec:SI [(match_operand:SI 1 "spu_mem_operand" "m") + (match_operand:SI 2 "spu_mem_operand" "m")] + UNSPEC_SP_TEST)) + (set (match_scratch:SI 3 "=&r") (const_int 0))] + "" + "lq%p1\t%0,%1\;lq%p2\t%3,%2\;ceq\t%0,%0,%3\;xor\t%3,%3,%3" + [(set_attr "length" "16") + (set_attr "type" "multi1")] +) |