Geert Bosch wrote:
> Nested functions aren't used that much in C indeed... :)
Paul, would you please review this patch?
> --- arm.c.orig 2007-11-20 16:27:04.000000000 -0500
> +++ arm.c 2007-11-21 18:15:18.000000000 -0500
> @@ -10448,6 +10448,14 @@ arm_get_frame_offsets (void)
> /* Saved registers include the stack frame. */
> offsets->saved_regs = offsets->saved_args + saved;
> offsets->soft_frame = offsets->saved_regs + CALLER_INTERWORKING_SLOT_SIZE;
> +
> + /* Allow for storage of static chain when it needs its own space in the
> + frame. */
> + if (IS_NESTED (arm_current_func_type ())
> + && regs_ever_live[3]
> + && offsets->saved_args == 0)
> + offsets->soft_frame += 4;
> +
> /* A leaf function does not need any stack alignment if it has nothing
> on the stack. */
> if (leaf && frame_size == 0)
> @@ -10569,6 +10577,7 @@ arm_expand_prologue (void)
> unsigned long live_regs_mask;
> unsigned long func_type;
> int fp_offset = 0;
> + int static_chain_size = 0;
> int saved_pretend_args = 0;
> int saved_regs = 0;
> unsigned HOST_WIDE_INT args_to_push;
> @@ -10643,6 +10652,7 @@ arm_expand_prologue (void)
> insn = emit_insn (insn);
>
> fp_offset = 4;
> + static_chain_size = 4;
>
> /* Just tell the dwarf backend that we adjusted SP. */
> dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
> @@ -10836,14 +10846,15 @@ arm_expand_prologue (void)
> }
>
> offsets = arm_get_frame_offsets ();
> - if (offsets->outgoing_args != offsets->saved_args + saved_regs)
> + if (offsets->outgoing_args != offsets->saved_args + saved_regs
> + + static_chain_size)
> {
> /* This add can produce multiple insns for a large constant, so we
> need to get tricky. */
> rtx last = get_last_insn ();
>
> amount = GEN_INT (offsets->saved_args + saved_regs
> - - offsets->outgoing_args);
> + + static_chain_size - offsets->outgoing_args);
>
> insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
> amount));
>
--
Mark Mitchell
CodeSourcery
[EMAIL PROTECTED]
(650) 331-3385 x713