aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@freesoft.cz>1999-12-15 16:34:03 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>1999-12-15 15:34:03 +0000
commita087165623999d7fd5c743e1f63070a9556455db (patch)
tree215902be6cfedc77251a1f95f5439f107231e3df /gcc/function.c
parent285f3cf09acda794f6e7bba9cb6d5163c94b5af4 (diff)
downloadgcc-a087165623999d7fd5c743e1f63070a9556455db.zip
gcc-a087165623999d7fd5c743e1f63070a9556455db.tar.gz
gcc-a087165623999d7fd5c743e1f63070a9556455db.tar.bz2
function.c (PREFERRED_STACK_BOUDNARY): Provide default value.
* function.c (PREFERRED_STACK_BOUDNARY): Provide default value. (assign_stack_local_1): Limit alignment to PREFERRED_STACK_BOUNDARY, update stack_alignment_needed. (prepare_function_start): Initialize stack_alignment_needed * function.h (struct function): Add field stack_alignment_needed. From-SVN: r30958
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 67f5e41..2392f32 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -68,6 +68,10 @@ Boston, MA 02111-1307, USA. */
#define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT
#endif
+#if !defined (PREFERRED_STACK_BOUNDARY) && defined (STACK_BOUNDARY)
+#define PREFERRED_STACK_BOUNDARY STACK_BOUNDARY
+#endif
+
/* Some systems use __main in a way incompatible with its use in gcc, in these
cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
give the same symbol without quotes for an alternative entry point. You
@@ -543,6 +547,13 @@ assign_stack_local_1 (mode, size, align, function)
function->x_frame_offset -= size;
#endif
+ /* Ignore alignment we can't do with expected alignment of the boundary. */
+ if (alignment * BITS_PER_UNIT > PREFERRED_STACK_BOUNDARY)
+ alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
+
+ if (function->stack_alignment_needed < alignment * BITS_PER_UNIT)
+ function->stack_alignment_needed = alignment * BITS_PER_UNIT;
+
/* Round frame offset to that alignment.
We must be careful here, since FRAME_OFFSET might be negative and
division with a negative dividend isn't as well defined as we might
@@ -5764,6 +5775,8 @@ prepare_function_start ()
current_function->original_decl_initial = 0;
current_function->original_arg_vector = 0;
+ current_function->stack_alignment_needed = 0;
+
/* Set if a call to setjmp is seen. */
current_function_calls_setjmp = 0;