/* Simple frame_unwind_cache. This finds the "extra info" for the frame. */ struct trad_frame_cache * mn10300_frame_unwind_cache (struct frame_info *next_frame, void **this_prologue_cache) { struct trad_frame_cache *cache; CORE_ADDR pc, start, end; if (*this_prologue_cache) return (*this_prologue_cache); cache = trad_frame_cache_zalloc (next_frame); pc = gdbarch_unwind_pc (current_gdbarch, next_frame); mn10300_analyze_prologue (next_frame, (void **) &cache, pc); if (find_pc_partial_function (pc, NULL, &start, &end)) trad_frame_set_id (cache, frame_id_build (trad_frame_get_this_base (cache), start)); else trad_frame_set_id (cache, frame_id_build (trad_frame_get_this_base (cache), frame_func_unwind (next_frame))); (*this_prologue_cache) = cache; return cache; }
static CORE_ADDR mips_sde_frame_base_address (struct frame_info *this_frame, void **this_cache) { struct trad_frame_cache *this_trad_cache = mips_sde_frame_cache (this_frame, this_cache); return trad_frame_get_this_base (this_trad_cache); }
static CORE_ADDR mn10300_frame_base_address (struct frame_info *next_frame, void **this_prologue_cache) { struct trad_frame_cache *cache = mn10300_frame_unwind_cache (next_frame, this_prologue_cache); return trad_frame_get_this_base (cache); }
static void set_movm_offsets (struct frame_info *fi, void **this_cache, int movm_args) { struct trad_frame_cache *cache; int offset = 0; CORE_ADDR base; if (fi == NULL || this_cache == NULL) return; cache = mn10300_frame_unwind_cache (fi, this_cache); if (cache == NULL) return; base = trad_frame_get_this_base (cache); if (movm_args & movm_other_bit) { /* The `other' bit leaves a blank area of four bytes at the beginning of its block of saved registers, making it 32 bytes long in total. */ trad_frame_set_reg_addr (cache, E_LAR_REGNUM, base + offset + 4); trad_frame_set_reg_addr (cache, E_LIR_REGNUM, base + offset + 8); trad_frame_set_reg_addr (cache, E_MDR_REGNUM, base + offset + 12); trad_frame_set_reg_addr (cache, E_A0_REGNUM + 1, base + offset + 16); trad_frame_set_reg_addr (cache, E_A0_REGNUM, base + offset + 20); trad_frame_set_reg_addr (cache, E_D0_REGNUM + 1, base + offset + 24); trad_frame_set_reg_addr (cache, E_D0_REGNUM, base + offset + 28); offset += 32; } if (movm_args & movm_a3_bit) { trad_frame_set_reg_addr (cache, E_A3_REGNUM, base + offset); offset += 4; } if (movm_args & movm_a2_bit) { trad_frame_set_reg_addr (cache, E_A2_REGNUM, base + offset); offset += 4; } if (movm_args & movm_d3_bit) { trad_frame_set_reg_addr (cache, E_D3_REGNUM, base + offset); offset += 4; } if (movm_args & movm_d2_bit) { trad_frame_set_reg_addr (cache, E_D2_REGNUM, base + offset); offset += 4; } if (AM33_MODE) { if (movm_args & movm_exother_bit) { trad_frame_set_reg_addr (cache, E_MCVF_REGNUM, base + offset); trad_frame_set_reg_addr (cache, E_MCRL_REGNUM, base + offset + 4); trad_frame_set_reg_addr (cache, E_MCRH_REGNUM, base + offset + 8); trad_frame_set_reg_addr (cache, E_MDRQ_REGNUM, base + offset + 12); trad_frame_set_reg_addr (cache, E_E1_REGNUM, base + offset + 16); trad_frame_set_reg_addr (cache, E_E0_REGNUM, base + offset + 20); offset += 24; } if (movm_args & movm_exreg1_bit) { trad_frame_set_reg_addr (cache, E_E7_REGNUM, base + offset); trad_frame_set_reg_addr (cache, E_E6_REGNUM, base + offset + 4); trad_frame_set_reg_addr (cache, E_E5_REGNUM, base + offset + 8); trad_frame_set_reg_addr (cache, E_E4_REGNUM, base + offset + 12); offset += 16; } if (movm_args & movm_exreg0_bit) { trad_frame_set_reg_addr (cache, E_E3_REGNUM, base + offset); trad_frame_set_reg_addr (cache, E_E2_REGNUM, base + offset + 4); offset += 8; } } /* The last (or first) thing on the stack will be the PC. */ trad_frame_set_reg_addr (cache, E_PC_REGNUM, base + offset); /* Save the SP in the 'traditional' way. This will be the same location where the PC is saved. */ trad_frame_set_reg_value (cache, E_SP_REGNUM, base + offset); }