]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
configure.ac [spu-*-*]: Do not set skipdirs.
authorStefan Schulze Frielinghaus <xxschulz@de.ibm.com>
Wed, 29 Oct 2008 19:33:45 +0000 (19:33 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Wed, 29 Oct 2008 19:33:45 +0000 (19:33 +0000)
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

ChangeLog
configure
configure.ac
gcc/ChangeLog
gcc/config/spu/spu.c
gcc/config/spu/spu.h
gcc/config/spu/spu.md

index f1167b2c28dd8a995056bc95d360f0518f0cd8a8..87edb554f37ddae6f82034aab2b09b01c6f73d54 100644 (file)
--- 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.
index 13c5a48a38b41ad4cb6a44cf13469072e953c96c..591a6f3195d0484358cc2d04d62a9ca9151f21af 100755 (executable)
--- 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}"
index aa4b6133dae583e2437b2e79ff8fcc9d4ae24b66..77b32516f03bd39d9f274a4fa3a5f9236d43c75c 100644 (file)
@@ -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}"
index dc5ab3be569ae2030794846df60956fb2575fcb8..bf3467d032374b7fef06df72b0dd0161b08f58df 100644 (file)
@@ -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
index e3781d5c8a16c1293ae194ab4e35d7586a9490f2..cd7f6edacb20c499a03821eb44dbf438e479d1ee 100644 (file)
@@ -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
index 4789c10387eb64e7771215d25d17c029a9f5d592..f93a0e6d645de57a69931c723c03cabad577abcd 100644 (file)
@@ -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},                    \
index d1fa6f0350807d85f0b6b835d83ebae48ac9c100..e7b48f5694129561f2615381572fa152b1cae706 100644 (file)
  (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")]
+)