aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rwxr-xr-xconfigure1
-rw-r--r--configure.ac1
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/spu/spu.c21
-rw-r--r--gcc/config/spu/spu.h4
-rw-r--r--gcc/config/spu/spu.md49
7 files changed, 77 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index f1167b2..87edb55 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-10-29 Stefan Schulze Frielinghaus <xxschulz@de.ibm.com>
+
+ * configure.ac [spu-*-*]: Do not set skipdirs.
+ * configure: Re-generate.
+
2008-10-29 Bernd Schmidt <bernd.schmidt@analog.com>
* MAINTAINERS (Various Maintainers): Add myself to reload.
diff --git a/configure b/configure
index 13c5a48..591a6f3 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 aa4b613..77b3251 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 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")]
+)