[PATCH] ia64 -fstack-protector support
Jakub Jelinek
jakub@redhat.com
Mon Jul 4 19:04:00 GMT 2005
Hi!
Tested with make check and
make check RUNTESTFLAGS=--target_board=unix/-fstack-protector
Ok to commit?
2005-07-04 Jakub Jelinek <jakub@redhat.com>
* config/ia64/ia64.h (FRAME_GROWS_DOWNWARD): Define to 1 if
-fstack-protect.
* config/ia64/ia64.c (ia64_compute_frame_size): Make sure
size is a multiple of 16 if FRAME_GROWS_DOWNWARD.
(ia64_initial_elimination_offset): Support FRAME_GROWS_DOWNWARD
layout.
--- gcc/config/ia64/ia64.h.jj 2005-07-02 02:28:14.000000000 +0200
+++ gcc/config/ia64/ia64.h 2005-07-04 12:17:46.000000000 +0200
@@ -951,7 +951,7 @@ enum reg_class
/* Define this macro to non-zero if the addresses of local variable slots
are at negative offsets from the frame pointer. */
-#define FRAME_GROWS_DOWNWARD 0
+#define FRAME_GROWS_DOWNWARD (flag_stack_protect != 0)
/* Offset from the frame pointer to the first local variable slot to
be allocated. */
--- gcc/config/ia64/ia64.c.jj 2005-07-03 13:53:07.000000000 +0200
+++ gcc/config/ia64/ia64.c 2005-07-04 12:29:03.000000000 +0200
@@ -2367,6 +2367,9 @@ ia64_compute_frame_size (HOST_WIDE_INT s
else
pretend_args_size = current_function_pretend_args_size;
+ if (FRAME_GROWS_DOWNWARD)
+ size = IA64_STACK_ALIGN (size);
+
total_size = (spill_size + extra_spill_size + size + pretend_args_size
+ current_function_outgoing_args_size);
total_size = IA64_STACK_ALIGN (total_size);
@@ -2391,27 +2394,22 @@ ia64_compute_frame_size (HOST_WIDE_INT s
HOST_WIDE_INT
ia64_initial_elimination_offset (int from, int to)
{
- HOST_WIDE_INT offset;
+ HOST_WIDE_INT offset, size;
- ia64_compute_frame_size (get_frame_size ());
+ ia64_compute_frame_size (size = get_frame_size ());
switch (from)
{
case FRAME_POINTER_REGNUM:
+ offset = FRAME_GROWS_DOWNWARD ? IA64_STACK_ALIGN (size) : 0;
+ if (!current_function_is_leaf)
+ offset += 16 + current_function_outgoing_args_size;
switch (to)
{
case HARD_FRAME_POINTER_REGNUM:
- if (current_function_is_leaf)
- offset = -current_frame_info.total_size;
- else
- offset = -(current_frame_info.total_size
- - current_function_outgoing_args_size - 16);
+ offset -= current_frame_info.total_size;
break;
case STACK_POINTER_REGNUM:
- if (current_function_is_leaf)
- offset = 0;
- else
- offset = 16 + current_function_outgoing_args_size;
break;
default:
Jakub
More information about the Gcc-patches
mailing list