summaryrefslogtreecommitdiff
path: root/gnu/egcs/gcc/protector.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/egcs/gcc/protector.c')
-rw-r--r--gnu/egcs/gcc/protector.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gnu/egcs/gcc/protector.c b/gnu/egcs/gcc/protector.c
index 17568326dad..e674a886849 100644
--- a/gnu/egcs/gcc/protector.c
+++ b/gnu/egcs/gcc/protector.c
@@ -1900,6 +1900,11 @@ assign_stack_local_for_pseudo_reg (mode, size, align)
push_allocated_offset += units_per_push;
}
+ /* At the second call from global alloc, alpha push frame and assign
+ a local variable to the top of the stack */
+ if (first_call_from_global_alloc && STARTING_FRAME_OFFSET == 0)
+ push_frame_offset = push_allocated_offset = 0;
+
return new;
#endif
}
@@ -2388,6 +2393,13 @@ push_frame_of_reg_equiv_memory_loc (push_size, boundary)
XEXP (x, 0)->used = 1;
}
}
+ else if (GET_CODE (x) == MEM
+ && XEXP (x, 0) == frame_pointer_rtx
+ && boundary == 0)
+ {
+ XEXP (x, 0) = plus_constant (frame_pointer_rtx, push_size);
+ XEXP (x, 0)->used = 1; insn_pushed = TRUE;
+ }
}
}
@@ -2423,6 +2435,13 @@ push_frame_of_reg_equiv_constant (push_size, boundary)
x->used = 1;
}
}
+ else if (x == frame_pointer_rtx
+ && boundary == 0)
+ {
+ reg_equiv_constant[i]
+ = plus_constant (frame_pointer_rtx, push_size);
+ reg_equiv_constant[i]->used = 1; insn_pushed = TRUE;
+ }
}
}