diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 28cbfda34ba..c5cbb7485e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-04-22 Olivier Hainque + + * config/alpha/alpha.c (alpha_expand_prologue [OPEN_VMS_ABI]): Don't + set FRP on stack adjustment for outgoing args if frame_pointer_needed. + 2003-04-22 Vincent Celier * gthr-gnat.h, gthr-gnat.c: new sources for implementation of diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 2bcf9128f33..81d8c206a8b 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -7503,11 +7503,31 @@ alpha_expand_prologue () /* If we have to allocate space for outgoing args, do it now. */ if (current_function_outgoing_args_size != 0) - FRP (emit_move_insn - (stack_pointer_rtx, - plus_constant (hard_frame_pointer_rtx, - - (ALPHA_ROUND - (current_function_outgoing_args_size))))); + { + rtx seq + = emit_move_insn (stack_pointer_rtx, + plus_constant + (hard_frame_pointer_rtx, + - (ALPHA_ROUND + (current_function_outgoing_args_size)))); + + /* Only set FRAME_RELATED_P on the stack adjustment we just emitted + if ! frame_pointer_needed. Setting the bit will change the CFA + computation rule to use sp again, which would be wrong if we had + frame_pointer_needed, as this means sp might move unpredictably + later on. + + Also, note that + frame_pointer_needed + => vms_unwind_regno == HARD_FRAME_POINTER_REGNUM + and + current_function_outgoing_args_size != 0 + => alpha_procedure_type != PT_NULL, + + so when we are not setting the bit here, we are guaranteed to + have emited an FRP frame pointer update just before. */ + RTX_FRAME_RELATED_P (seq) = ! frame_pointer_needed; + } } else if (!TARGET_ABI_UNICOSMK) {