extern int one_stepped;
extern char register_valid[];
+extern struct obstack frame_cache_obstack;
\f
void
}
+/* If saved registers of frame FI are not known yet, read and cache them.
+ &FDATAP contains aix_framedata; TDATAP can be NULL,
+ in which case the framedata are read.
+ */
+
+static void
+frame_get_cache_fsr (fi, fdatap)
+ struct frame_info *fi;
+ struct aix_framedata *fdatap;
+{
+ int ii;
+ CORE_ADDR frame_addr;
+ struct aix_framedata work_fdata;
+ if (fi->cache_fsr)
+ return;
+
+ if (fdatap = NULL) {
+ fdatap = &work_fdata;
+ function_frame_info (get_pc_function_start (fi->pc), fdatap);
+ }
+
+ fi->cache_fsr = (struct frame_saved_regs *)
+ obstack_alloc (&frame_cache_obstack, sizeof (struct frame_saved_regs));
+ bzero (fi->cache_fsr, sizeof (struct frame_saved_regs));
+
+ if (fi->prev && fi->prev->frame)
+ frame_addr = fi->prev->frame;
+ else
+ frame_addr = read_memory_integer (fi->frame, 4);
+
+ /* if != -1, fdatap->saved_fpr is the smallest number of saved_fpr.
+ All fpr's from saved_fpr to fp31 are saved right underneath caller
+ stack pointer, starting from fp31 first. */
+
+ if (fdatap->saved_fpr >= 0) {
+ for (ii=31; ii >= fdatap->saved_fpr; --ii)
+ fi->cache_fsr->regs [FP0_REGNUM + ii] = frame_addr - ((32 - ii) * 8);
+ frame_addr -= (32 - fdatap->saved_fpr) * 8;
+ }
+
+ /* if != -1, fdatap->saved_gpr is the smallest number of saved_gpr.
+ All gpr's from saved_gpr to gpr31 are saved right under saved fprs,
+ starting from r31 first. */
+
+ if (fdatap->saved_gpr >= 0)
+ for (ii=31; ii >= fdatap->saved_gpr; --ii)
+ fi->cache_fsr->regs [ii] = frame_addr - ((32 - ii) * 4);
+}
+
/* Return the address of a frame. This is the inital %sp value when the frame
was first allocated. For functions calling alloca(), it might be saved in
an alloca register. */
CORE_ADDR
frame_initial_stack_address (fi)
-struct frame_info *fi;
+ struct frame_info *fi;
{
- CORE_ADDR frame_addr, tmpaddr;
+ CORE_ADDR tmpaddr;
struct aix_framedata fdata;
struct frame_info *callee_fi;
- int ii;
-
- extern struct obstack frame_cache_obstack;
/* if the initial stack pointer (frame address) of this frame is known,
just return it. */
/* find out if this function is using an alloca register.. */
- tmpaddr = get_pc_function_start (fi->pc);
- function_frame_info (tmpaddr, &fdata);
+ function_frame_info (get_pc_function_start (fi->pc), &fdata);
/* if saved registers of this frame are not known yet, read and cache them. */
- if (!fi->cache_fsr) {
- fi->cache_fsr = (struct frame_saved_regs *)
- obstack_alloc (&frame_cache_obstack, sizeof (struct frame_saved_regs));
- bzero (fi->cache_fsr, sizeof (struct frame_saved_regs));
-
- if (fi->prev && fi->prev->frame)
- frame_addr = fi->prev->frame;
- else
- frame_addr = read_memory_integer (fi->frame, 4);
-
- /* if != -1, fdata.saved_fpr is the smallest number of saved_fpr. All fpr's
- from saved_fpr to fp31 are saved right underneath caller stack pointer,
- starting from fp31 first. */
-
- if (fdata.saved_fpr >= 0) {
- for (ii=31; ii >= fdata.saved_fpr; --ii)
- fi->cache_fsr->regs [FP0_REGNUM + ii] = frame_addr - ((32 - ii) * 8);
- frame_addr -= (32 - fdata.saved_fpr) * 8;
- }
-
- /* if != -1, fdata.saved_gpr is the smallest number of saved_gpr. All gpr's
- from saved_gpr to gpr31 are saved right under saved fprs, starting
- from r31 first. */
-
- if (fdata.saved_gpr >= 0)
- for (ii=31; ii >= fdata.saved_gpr; --ii)
- fi->cache_fsr->regs [ii] = frame_addr - ((32 - ii) * 4);
- }
+ if (!fi->cache_fsr)
+ frame_get_cache_fsr (fi, &fdata);
/* If no alloca register used, then fi->frame is the value of the %sp for
this frame, and it is good enough. */
if (!fi->next)
return fi->initial_sp = read_register (fdata.alloca_reg);
- /* Otherwise, this is a caller frame. Callee has already saved (???) its
- registers. Find the address in which caller's alloca register is saved. */
+ /* Otherwise, this is a caller frame. Callee has usually already saved
+ registers, but there are are exceptions (such as when the callee
+ has no parameters). Find the address in which caller's alloca
+ register is saved. */
for (callee_fi = fi->next; callee_fi; callee_fi = callee_fi->next) {
if (!callee_fi->cache_fsr)
- fatal ("Callee has not saved caller's registers.");
+ frame_get_cache_fsr (fi, NULL);
/* this is the address in which alloca register is saved. */