diff --git a/ChangeLog b/ChangeLog index f1167b2c28d..87edb554f37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-10-29 Stefan Schulze Frielinghaus + + * configure.ac [spu-*-*]: Do not set skipdirs. + * configure: Re-generate. + 2008-10-29 Bernd Schmidt * MAINTAINERS (Various Maintainers): Add myself to reload. diff --git a/configure b/configure index 13c5a48a38b..591a6f3195d 100755 --- a/configure +++ b/configure @@ -2656,7 +2656,6 @@ case "${target}" in sparc-*-solaris* | sparc64-*-solaris* | sparcv9-*-solaris*) ;; spu-*-*) - skipdirs="target-libssp" ;; v810-*-*) noconfigdirs="$noconfigdirs bfd binutils gas gcc gdb ld target-libstdc++-v3 opcodes target-libgloss ${libgcj}" diff --git a/configure.ac b/configure.ac index aa4b6133dae..77b32516f03 100644 --- a/configure.ac +++ b/configure.ac @@ -892,7 +892,6 @@ case "${target}" in sparc-*-solaris* | sparc64-*-solaris* | sparcv9-*-solaris*) ;; spu-*-*) - skipdirs="target-libssp" ;; v810-*-*) noconfigdirs="$noconfigdirs bfd binutils gas gcc gdb ld target-libstdc++-v3 opcodes target-libgloss ${libgcj}" diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc5ab3be569..bf3467d0323 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2008-10-29 Stefan Schulze Frielinghaus + + * 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 PR 11492 diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index e3781d5c8a1..cd7f6edacb2 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 4789c10387e..f93a0e6d645 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 d1fa6f03508..e7b48f56941 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")] +)