- /* Now we know how deep things are, we can work out their addresses. */
- for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
- {
- register_number = translate_rn_to_arch_reg_num (rn, media_mode);
-
- if (where[rn] >= 0)
- {
- if (rn == fp_regnum)
- have_fp = 1;
-
- /* Watch out! saved_regs is only for the real registers, and
- doesn't include space for the pseudo registers. */
- deprecated_get_frame_saved_regs (fi)[register_number]= get_frame_base (fi) - where[rn] + depth;
-
- }
- else
- deprecated_get_frame_saved_regs (fi)[register_number] = 0;
- }
-
- if (have_fp)
- {
- /* SP_REGNUM is 15. For shmedia 15 is the real register. For
- shcompact 15 is the arch register corresponding to the pseudo
- register r15 which still is the SP register. */
- /* The place on the stack where fp is stored contains the sp of
- the caller. */
- /* Again, saved_registers contains only space for the real
- registers, so we store in DEPRECATED_FP_REGNUM position. */
- int size;
- if (tdep->sh_abi == SH_ABI_32)
- size = 4;
- else
- size = REGISTER_RAW_SIZE (fp_regnum);
- deprecated_get_frame_saved_regs (fi)[sp_regnum] = read_memory_integer (deprecated_get_frame_saved_regs (fi)[fp_regnum], size);
- }
- else
- deprecated_get_frame_saved_regs (fi)[sp_regnum] = get_frame_base (fi);
-
- get_frame_extra_info (fi)->f_offset = depth - where[fp_regnum];
-}
-
-/* Initialize the extra info saved in a FRAME */
-static void
-sh64_init_extra_frame_info (int fromleaf, struct frame_info *fi)
-{
- int media_mode = pc_is_isa32 (get_frame_pc (fi));
-
- frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
-
- if (get_next_frame (fi))
- deprecated_update_frame_pc_hack (fi, DEPRECATED_FRAME_SAVED_PC (get_next_frame (fi)));
-
- if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
- get_frame_base (fi)))
- {
- /* We need to setup fi->frame here because call_function_by_hand
- gets it wrong by assuming it's always FP. */
- deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi), SP_REGNUM));
- get_frame_extra_info (fi)->return_pc =
- deprecated_read_register_dummy (get_frame_pc (fi),
- get_frame_base (fi), PC_REGNUM);
- get_frame_extra_info (fi)->f_offset = -(DEPRECATED_CALL_DUMMY_LENGTH + 4);
- get_frame_extra_info (fi)->leaf_function = 0;
- return;
- }
- else
- {
- DEPRECATED_FRAME_INIT_SAVED_REGS (fi);
- get_frame_extra_info (fi)->return_pc =
- sh64_get_saved_pr (fi, PR_REGNUM);
- }
-}
-
-static void
-sh64_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
- struct frame_info *frame, int regnum,
- enum lval_type *lval)
-{
- int media_mode;
- int live_regnum = regnum;
- struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
-
- if (!target_has_registers)
- error ("No registers.");
-
- /* Normal systems don't optimize out things with register numbers. */
- if (optimized != NULL)
- *optimized = 0;
-
- if (addrp) /* default assumption: not found in memory */
- *addrp = 0;
-
- if (raw_buffer)
- memset (raw_buffer, 0, sizeof (raw_buffer));
-
- /* We must do this here, before the following while loop changes
- frame, and makes it NULL. If this is a media register number,
- but we are in compact mode, it will become the corresponding
- compact pseudo register. If there is no corresponding compact
- pseudo-register what do we do?*/
- media_mode = pc_is_isa32 (get_frame_pc (frame));
- live_regnum = translate_insn_rn (regnum, media_mode);
-
- /* Note: since the current frame's registers could only have been
- saved by frames INTERIOR TO the current frame, we skip examining
- the current frame itself: otherwise, we would be getting the
- previous frame's registers which were saved by the current frame. */
-
- while (frame && ((frame = get_next_frame (frame)) != NULL))
- {
- if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
- get_frame_base (frame),
- get_frame_base (frame)))
- {
- if (lval) /* found it in a CALL_DUMMY frame */
- *lval = not_lval;
- if (raw_buffer)
- memcpy (raw_buffer,
- (deprecated_generic_find_dummy_frame (get_frame_pc (frame), get_frame_base (frame))
- + DEPRECATED_REGISTER_BYTE (regnum)),
- REGISTER_RAW_SIZE (regnum));
- return;
- }
-
- DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
- if (deprecated_get_frame_saved_regs (frame) != NULL
- && deprecated_get_frame_saved_regs (frame)[regnum] != 0)
- {
- if (lval) /* found it saved on the stack */
- *lval = lval_memory;
- if (regnum == SP_REGNUM)
- {
- if (raw_buffer) /* SP register treated specially */
- store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum),
- deprecated_get_frame_saved_regs (frame)[regnum]);
- }
- else
- { /* any other register */
-
- if (addrp)
- *addrp = deprecated_get_frame_saved_regs (frame)[regnum];
- if (raw_buffer)
- {
- int size;
- if (tdep->sh_abi == SH_ABI_32
- && (live_regnum == DEPRECATED_FP_REGNUM
- || live_regnum == PR_REGNUM))
- size = 4;
- else
- size = REGISTER_RAW_SIZE (live_regnum);
- if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
- read_memory (deprecated_get_frame_saved_regs (frame)[regnum], raw_buffer, size);
- else
- read_memory (deprecated_get_frame_saved_regs (frame)[regnum],
- raw_buffer
- + REGISTER_RAW_SIZE (live_regnum)
- - size,
- size);
- }
- }
- return;
- }
- }
-
- /* If we get thru the loop to this point, it means the register was
- not saved in any frame. Return the actual live-register value. */
-
- if (lval) /* found it in a live register */
- *lval = lval_register;
- if (addrp)
- *addrp = DEPRECATED_REGISTER_BYTE (live_regnum);
- if (raw_buffer)
- deprecated_read_register_gen (live_regnum, raw_buffer);
-}
-
-static CORE_ADDR
-sh64_extract_struct_value_address (char *regbuf)
-{
- return (extract_unsigned_integer ((regbuf + DEPRECATED_REGISTER_BYTE (STRUCT_RETURN_REGNUM)),
- REGISTER_RAW_SIZE (STRUCT_RETURN_REGNUM)));
-}
-
-static CORE_ADDR
-sh_frame_saved_pc (struct frame_info *frame)
-{
- return (get_frame_extra_info (frame)->return_pc);
-}
-
-/* Discard from the stack the innermost frame, restoring all saved registers.
- Used in the 'return' command. */
-static void
-sh64_pop_frame (void)
-{
- struct frame_info *frame = get_current_frame ();
- CORE_ADDR fp;
- int regnum;
- struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
-
- int media_mode = pc_is_isa32 (get_frame_pc (frame));
-
- if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
- get_frame_base (frame),
- get_frame_base (frame)))
- generic_pop_dummy_frame ();
- else
- {
- fp = get_frame_base (frame);
- DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
-
- /* Copy regs from where they were saved in the frame */
- for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
- if (deprecated_get_frame_saved_regs (frame)[regnum])
- {
- int size;
- if (tdep->sh_abi == SH_ABI_32
- && (regnum == DEPRECATED_FP_REGNUM
- || regnum == PR_REGNUM))
- size = 4;
- else
- size = REGISTER_RAW_SIZE (translate_insn_rn (regnum,
- media_mode));
- write_register (regnum,
- read_memory_integer (deprecated_get_frame_saved_regs (frame)[regnum],
- size));
- }
-
- write_register (PC_REGNUM, get_frame_extra_info (frame)->return_pc);
- write_register (SP_REGNUM, fp + 8);
- }
- flush_cached_frames ();