HOST_WIDE_INT stack_usage_size = -1;
rtx_code_label *final_label;
rtx final_target, target;
+ rtx addr = (virtuals_instantiated
+ ? plus_constant (Pmode, stack_pointer_rtx,
+ get_stack_dynamic_offset ())
+ : virtual_stack_dynamic_rtx);
/* If we're asking for zero bytes, it doesn't matter what we point
to since we can't dereference it. But return a reasonable
address anyway. */
if (size == const0_rtx)
- return virtual_stack_dynamic_rtx;
+ return addr;
/* Otherwise, show we're calling alloca or equivalent. */
cfun->calls_alloca = 1;
poly_int64 saved_stack_pointer_delta;
if (!STACK_GROWS_DOWNWARD)
- emit_move_insn (target, virtual_stack_dynamic_rtx);
+ emit_move_insn (target, force_operand (addr, target));
/* Check stack bounds if necessary. */
if (crtl->limit_stack)
stack_pointer_delta = saved_stack_pointer_delta;
if (STACK_GROWS_DOWNWARD)
- emit_move_insn (target, virtual_stack_dynamic_rtx);
+ emit_move_insn (target, force_operand (addr, target));
}
suppress_reg_args_size = false;
vec_free (cfun->local_decls);
}
+/* Return the value of STACK_DYNAMIC_OFFSET for the current function.
+ This is done through a function wrapper so that the macro sees a
+ predictable set of included files. */
+
+poly_int64
+get_stack_dynamic_offset ()
+{
+ return STACK_DYNAMIC_OFFSET (current_function_decl);
+}
+
/* Pass through the INSNS of function FNDECL and convert virtual register
references to hard register references. */
/* Compute the offsets to use for this function. */
in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);
var_offset = targetm.starting_frame_offset ();
- dynamic_offset = STACK_DYNAMIC_OFFSET (current_function_decl);
+ dynamic_offset = get_stack_dynamic_offset ();
out_arg_offset = STACK_POINTER_OFFSET;
#ifdef FRAME_POINTER_CFA_OFFSET
cfa_offset = FRAME_POINTER_CFA_OFFSET (current_function_decl);
extern basic_block emit_return_for_exit (edge exit_fallthru_edge,
bool simple_p);
extern void reposition_prologue_and_epilogue_notes (void);
+extern poly_int64 get_stack_dynamic_offset ();
/* Returns the name of the current function. */
extern const char *fndecl_name (tree);