OSDN Git Service

* function.c (PREFERRED_STACK_BOUDNARY): Provide default value.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Dec 1999 15:34:03 +0000 (15:34 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Dec 1999 15:34:03 +0000 (15:34 +0000)
(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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30958 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/function.c
gcc/function.h

index 5bc25d7..ca95516 100644 (file)
@@ -1,3 +1,11 @@
+Wed Dec 15 16:11:55 MET 1999  Jan Hubicka  <hubicka@freesoft.cz>
+
+       * 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.
+
 Wed Dec 15 14:55:24 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
 
        * caller-save.c (insert_one_insn): Returns struct insn_chain *.
index 67f5e41..2392f32 100644 (file)
@@ -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;
 
index dc0b507..059d8e1 100644 (file)
@@ -456,6 +456,8 @@ struct function
   int uses_pic_offset_table;
   /* tm.h can use this to store whatever it likes.  */
   struct machine_function *machine;
+  /* The largest alignment of slot allocated on the stack.  */
+  int stack_alignment_needed;
 
   /* Language-specific code can use this to store whatever it likes.  */
   struct language_function *language;