static void mn10300_init_extra_frame_info (int fromleaf, struct frame_info *fi) { if (fi->next) fi->pc = FRAME_SAVED_PC (fi->next); frame_saved_regs_zalloc (fi); fi->extra_info = (struct frame_extra_info *) frame_obstack_alloc (sizeof (struct frame_extra_info)); fi->extra_info->status = 0; fi->extra_info->stack_size = 0; mn10300_analyze_prologue (fi, 0); }
void microblaze_init_extra_frame_info (struct frame_info *fi) { if (fi->next) fi->pc = FRAME_SAVED_PC (fi->next); frame_saved_regs_zalloc (fi); fi->extra_info = (struct frame_extra_info *) frame_obstack_alloc (sizeof (struct frame_extra_info)); fi->extra_info->status = 0; fi->extra_info->framesize = 0; if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame)) { /* We need to setup fi->frame here because run_stack_dummy gets it wrong by assuming it's always FP. */ fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM); } else microblaze_analyze_prologue (fi, 0); }
static void alpha_find_saved_regs (struct frame_info *frame) { int ireg; CORE_ADDR reg_position; unsigned long mask; alpha_extra_func_info_t proc_desc; int returnreg; frame_saved_regs_zalloc (frame); /* If it is the frame for __sigtramp, the saved registers are located in a sigcontext structure somewhere on the stack. __sigtramp passes a pointer to the sigcontext structure on the stack. If the stack layout for __sigtramp changes, or if sigcontext offsets change, we might have to update this code. */ #ifndef SIGFRAME_PC_OFF #define SIGFRAME_PC_OFF (2 * 8) #define SIGFRAME_REGSAVE_OFF (4 * 8) #define SIGFRAME_FPREGSAVE_OFF (SIGFRAME_REGSAVE_OFF + 32 * 8 + 8) #endif proc_desc = frame->proc_desc; if (proc_desc == NULL) /* I'm not sure how/whether this can happen. Normally when we can't find a proc_desc, we "synthesize" one using heuristic_proc_desc and set the saved_regs right away. */ return; /* Fill in the offsets for the registers which gen_mask says were saved. */ reg_position = frame->frame + PROC_REG_OFFSET (proc_desc); mask = PROC_REG_MASK (proc_desc); returnreg = PROC_PC_REG (proc_desc); /* Note that RA is always saved first, regardless of its actual register number. */ if (mask & (1 << returnreg)) { frame->saved_regs[returnreg] = reg_position; reg_position += 8; mask &= ~(1 << returnreg); /* Clear bit for RA so we don't save again later. */ } for (ireg = 0; ireg <= 31; ireg++) if (mask & (1 << ireg)) { frame->saved_regs[ireg] = reg_position; reg_position += 8; } /* Fill in the offsets for the registers which float_mask says were saved. */ reg_position = frame->frame + PROC_FREG_OFFSET (proc_desc); mask = PROC_FREG_MASK (proc_desc); for (ireg = 0; ireg <= 31; ireg++) if (mask & (1 << ireg)) { frame->saved_regs[FP0_REGNUM + ireg] = reg_position; reg_position += 8; } frame->saved_regs[PC_REGNUM] = frame->saved_regs[returnreg]; }