diff options
author | Richard Henderson <rth@redhat.com> | 2001-08-06 09:38:18 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2001-08-06 09:38:18 -0700 |
commit | 1d4820563901c443ef95b649963c54efbb1268a4 (patch) | |
tree | 036477bc0564edd805a70401d4b824040095475f /gcc/function.c | |
parent | eac69b8a008bd5426d3410d624aa9d88577fd69f (diff) | |
download | gcc-1d4820563901c443ef95b649963c54efbb1268a4.zip gcc-1d4820563901c443ef95b649963c54efbb1268a4.tar.gz gcc-1d4820563901c443ef95b649963c54efbb1268a4.tar.bz2 |
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/gcc/function.c b/gcc/function.c index 6015366..0c4d712 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6315,10 +6315,35 @@ mark_varargs () void 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, VOIDmode, 0); -#endif /* not HAS_INIT_SECTION */ +#endif } extern struct obstack permanent_obstack; |