i386.h (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN): New.

* config/i386/i386.h (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN): New.
	* function.c (expand_main_function): Implement it.
	* doc/tm.texi: Document it.

From-SVN: r44664
This commit is contained in:
Richard Henderson 2001-08-06 09:38:18 -07:00 committed by Richard Henderson
parent eac69b8a00
commit 1d48205639
4 changed files with 46 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2001-08-06 Richard Henderson <rth@redhat.com>
* config/i386/i386.h (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN): New.
* function.c (expand_main_function): Implement it.
* doc/tm.texi: Document it.
2001-08-06 Stan Shebs <shebs@apple.com> 2001-08-06 Stan Shebs <shebs@apple.com>
* doc/install.texi: Document powerpc-*-darwin* details. * doc/install.texi: Document powerpc-*-darwin* details.

View File

@ -640,6 +640,13 @@ extern int ix86_arch;
aligned; the compiler cannot rely on having this alignment. */ aligned; the compiler cannot rely on having this alignment. */
#define PREFERRED_STACK_BOUNDARY ix86_preferred_stack_boundary #define PREFERRED_STACK_BOUNDARY ix86_preferred_stack_boundary
/* As of July 2001, many runtimes to not align the stack properly when
entering main. This causes expand_main_function to forcably align
the stack, which results in aligned frames for functions called from
main, though it does nothing for the alignment of main itself. */
#define FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN \
(ix86_preferred_stack_boundary > STACK_BOUNDARY)
/* Allocation boundary for the code of a function. */ /* Allocation boundary for the code of a function. */
#define FUNCTION_BOUNDARY 16 #define FUNCTION_BOUNDARY 16

View File

@ -1028,6 +1028,12 @@ for the desired alignment (measured in bits). If @code{STACK_BOUNDARY} is
also defined, this macro must evaluate to a value equal to or larger also defined, this macro must evaluate to a value equal to or larger
than @code{STACK_BOUNDARY}. than @code{STACK_BOUNDARY}.
@findex FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
@item FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
A C expression that evaluates true if @code{PREFERRED_STACK_BOUNDARY} is
not guaranteed by the runtime and we should emit code to align the stack
at the beginning of @code{main}.
@cindex @code{PUSH_ROUNDING}, interaction with @code{PREFERRED_STACK_BOUNDARY} @cindex @code{PUSH_ROUNDING}, interaction with @code{PREFERRED_STACK_BOUNDARY}
If @code{PUSH_ROUNDING} is not defined, the stack will always be aligned If @code{PUSH_ROUNDING} is not defined, the stack will always be aligned
to the specified boundary. If @code{PUSH_ROUNDING} is defined and specifies to the specified boundary. If @code{PUSH_ROUNDING} is defined and specifies

View File

@ -6315,10 +6315,35 @@ mark_varargs ()
void void
expand_main_function () expand_main_function ()
{ {
#if !defined (HAS_INIT_SECTION) #ifdef FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
if (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN)
{
int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
rtx tmp;
/* Forcably align the stack. */
#ifdef STACK_GROWS_DOWNWARD
tmp = expand_binop (Pmode, and_optab, stack_pointer_rtx,
GEN_INT (-align), stack_pointer_rtx, 1, OPTAB_WIDEN);
#else
tmp = expand_binop (Pmode, add_optab, stack_pointer_rtx,
GEN_INT (align - 1), NULL_RTX, 1, OPTAB_WIDEN);
tmp = expand_binop (Pmode, and_optab, tmp, GEN_INT (-align),
stack_pointer_rtx, 1, OPTAB_WIDEN);
#endif
if (tmp != stack_pointer_rtx)
emit_move_insn (stack_pointer_rtx, tmp);
/* Enlist allocate_dynamic_stack_space to pick up the pieces. */
tmp = force_reg (Pmode, const0_rtx);
allocate_dynamic_stack_space (tmp, NULL_RTX, BIGGEST_ALIGNMENT);
}
#endif
#ifndef HAS_INIT_SECTION
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, NAME__MAIN), 0, emit_library_call (gen_rtx_SYMBOL_REF (Pmode, NAME__MAIN), 0,
VOIDmode, 0); VOIDmode, 0);
#endif /* not HAS_INIT_SECTION */ #endif
} }
extern struct obstack permanent_obstack; extern struct obstack permanent_obstack;