diff options
Diffstat (limited to 'gdb/sh-tdep.c')
-rw-r--r-- | gdb/sh-tdep.c | 391 |
1 files changed, 236 insertions, 155 deletions
diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c index dc68b15fad5..46b7deec1fc 100644 --- a/gdb/sh-tdep.c +++ b/gdb/sh-tdep.c @@ -1,5 +1,5 @@ /* Target-dependent code for Hitachi Super-H, for GDB. - Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GDB. @@ -33,12 +33,13 @@ #include "gdbcore.h" #include "value.h" #include "dis-asm.h" -#include "inferior.h" /* for BEFORE_TEXT_END etc. */ +#include "inferior.h" #include "gdb_string.h" #include "arch-utils.h" #include "floatformat.h" #include "regcache.h" #include "doublest.h" +#include "osabi.h" #include "sh-tdep.h" @@ -156,6 +157,28 @@ sh_sh3e_register_name (int reg_nr) } static const char * +sh_sh2e_register_name (int reg_nr) +{ + static char *register_names[] = + { + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "pc", "pr", "gbr", "vbr", "mach", "macl", "sr", + "fpul", "fpscr", + "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", + "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15", + "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + }; + if (reg_nr < 0) + return NULL; + if (reg_nr >= (sizeof (register_names) / sizeof (*register_names))) + return NULL; + return register_names[reg_nr]; +} + +static const char * sh_sh_dsp_register_name (int reg_nr) { static char *register_names[] = @@ -928,10 +951,13 @@ gdb_print_insn_sh (bfd_vma memaddr, disassemble_info *info) static CORE_ADDR sh_frame_chain (struct frame_info *frame) { - if (DEPRECATED_PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame)) - return frame->frame; /* dummy frame same as caller's frame */ - if (frame->pc && !inside_entry_file (frame->pc)) - return read_memory_integer (get_frame_base (frame) + frame->extra_info->f_offset, 4); + if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), + get_frame_base (frame), + get_frame_base (frame))) + return get_frame_base (frame); /* dummy frame same as caller's frame */ + if (get_frame_pc (frame) && !inside_entry_file (get_frame_pc (frame))) + return read_memory_integer (get_frame_base (frame) + + get_frame_extra_info (frame)->f_offset, 4); else return 0; } @@ -966,17 +992,21 @@ translate_insn_rn (int rn, int media_mode) static CORE_ADDR sh64_frame_chain (struct frame_info *frame) { - if (DEPRECATED_PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame)) - return frame->frame; /* dummy frame same as caller's frame */ - if (frame->pc && !inside_entry_file (frame->pc)) + if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), + get_frame_base (frame), + get_frame_base (frame))) + return get_frame_base (frame); /* dummy frame same as caller's frame */ + if (get_frame_pc (frame) && !inside_entry_file (get_frame_pc (frame))) { - int media_mode = pc_is_isa32 (frame->pc); + int media_mode = pc_is_isa32 (get_frame_pc (frame)); int size; if (gdbarch_tdep (current_gdbarch)->sh_abi == SH_ABI_32) size = 4; else size = REGISTER_RAW_SIZE (translate_insn_rn (FP_REGNUM, media_mode)); - return read_memory_integer (get_frame_base (frame) + frame->extra_info->f_offset, size); + return read_memory_integer (get_frame_base (frame) + + get_frame_extra_info (frame)->f_offset, + size); } else return 0; @@ -990,18 +1020,20 @@ sh64_frame_chain (struct frame_info *frame) static CORE_ADDR sh_find_callers_reg (struct frame_info *fi, int regnum) { - for (; fi; fi = fi->next) - if (DEPRECATED_PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame)) + for (; fi; fi = get_next_frame (fi)) + if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi), + get_frame_base (fi))) /* When the caller requests PR from the dummy frame, we return PC because that's where the previous routine appears to have done a call from. */ - return deprecated_read_register_dummy (fi->pc, fi->frame, regnum); + return deprecated_read_register_dummy (get_frame_pc (fi), + get_frame_base (fi), regnum); else { FRAME_INIT_SAVED_REGS (fi); - if (!fi->pc) + if (!get_frame_pc (fi)) return 0; - if (fi->saved_regs[regnum] != 0) - return read_memory_integer (fi->saved_regs[regnum], + if (get_frame_saved_regs (fi)[regnum] != 0) + return read_memory_integer (get_frame_saved_regs (fi)[regnum], REGISTER_RAW_SIZE (regnum)); } return read_register (regnum); @@ -1012,26 +1044,28 @@ sh64_get_saved_pr (struct frame_info *fi, int pr_regnum) { int media_mode = 0; - for (; fi; fi = fi->next) - if (DEPRECATED_PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame)) + for (; fi; fi = get_next_frame (fi)) + if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi), + get_frame_base (fi))) /* When the caller requests PR from the dummy frame, we return PC because that's where the previous routine appears to have done a call from. */ - return deprecated_read_register_dummy (fi->pc, fi->frame, pr_regnum); + return deprecated_read_register_dummy (get_frame_pc (fi), + get_frame_base (fi), pr_regnum); else { FRAME_INIT_SAVED_REGS (fi); - if (!fi->pc) + if (!get_frame_pc (fi)) return 0; - media_mode = pc_is_isa32 (fi->pc); + media_mode = pc_is_isa32 (get_frame_pc (fi)); - if (fi->saved_regs[pr_regnum] != 0) + if (get_frame_saved_regs (fi)[pr_regnum] != 0) { int gdb_reg_num = translate_insn_rn (pr_regnum, media_mode); int size = ((gdbarch_tdep (current_gdbarch)->sh_abi == SH_ABI_32) ? 4 : REGISTER_RAW_SIZE (gdb_reg_num)); - return read_memory_integer (fi->saved_regs[pr_regnum], size); + return read_memory_integer (get_frame_saved_regs (fi)[pr_regnum], size); } } return read_register (pr_regnum); @@ -1053,24 +1087,25 @@ sh_nofp_frame_init_saved_regs (struct frame_info *fi) int opc; int insn; int r3_val = 0; - char *dummy_regs = deprecated_generic_find_dummy_frame (fi->pc, fi->frame); + char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi), + get_frame_base (fi)); - if (fi->saved_regs == NULL) + if (get_frame_saved_regs (fi) == NULL) frame_saved_regs_zalloc (fi); else - memset (fi->saved_regs, 0, SIZEOF_FRAME_SAVED_REGS); + memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS); if (dummy_regs) { /* DANGER! This is ONLY going to work if the char buffer format of the saved registers is byte-for-byte identical to the CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */ - memcpy (fi->saved_regs, dummy_regs, sizeof (fi->saved_regs)); + memcpy (get_frame_saved_regs (fi), dummy_regs, SIZEOF_FRAME_SAVED_REGS); return; } - fi->extra_info->leaf_function = 1; - fi->extra_info->f_offset = 0; + get_frame_extra_info (fi)->leaf_function = 1; + get_frame_extra_info (fi)->f_offset = 0; for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++) where[rn] = -1; @@ -1081,10 +1116,10 @@ sh_nofp_frame_init_saved_regs (struct frame_info *fi) that does not appear to be part of the prologue. But give up after 20 of them, since we're getting silly then. */ - pc = get_pc_function_start (fi->pc); + pc = get_pc_function_start (get_frame_pc (fi)); if (!pc) { - fi->pc = 0; + deprecated_update_frame_pc_hack (fi, 0); return; } @@ -1102,7 +1137,7 @@ sh_nofp_frame_init_saved_regs (struct frame_info *fi) { where[gdbarch_tdep (current_gdbarch)->PR_REGNUM] = depth; /* If we're storing the pr then this isn't a leaf */ - fi->extra_info->leaf_function = 0; + get_frame_extra_info (fi)->leaf_function = 0; depth += 4; } else if (IS_MOV_R3 (insn)) @@ -1140,24 +1175,24 @@ sh_nofp_frame_init_saved_regs (struct frame_info *fi) if (rn == FP_REGNUM) have_fp = 1; - fi->saved_regs[rn] = fi->frame - where[rn] + depth - 4; + get_frame_saved_regs (fi)[rn] = get_frame_base (fi) - where[rn] + depth - 4; } else { - fi->saved_regs[rn] = 0; + get_frame_saved_regs (fi)[rn] = 0; } } if (have_fp) { - fi->saved_regs[SP_REGNUM] = read_memory_integer (fi->saved_regs[FP_REGNUM], 4); + get_frame_saved_regs (fi)[SP_REGNUM] = read_memory_integer (get_frame_saved_regs (fi)[FP_REGNUM], 4); } else { - fi->saved_regs[SP_REGNUM] = fi->frame - 4; + get_frame_saved_regs (fi)[SP_REGNUM] = get_frame_base (fi) - 4; } - fi->extra_info->f_offset = depth - where[FP_REGNUM] - 4; + get_frame_extra_info (fi)->f_offset = depth - where[FP_REGNUM] - 4; /* Work out the return pc - either from the saved pr or the pr value */ } @@ -1392,25 +1427,25 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi) int insn_size; int gdb_register_number; int register_number; - char *dummy_regs = deprecated_generic_find_dummy_frame (fi->pc, fi->frame); + char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi), get_frame_base (fi)); struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); - if (fi->saved_regs == NULL) + if (get_frame_saved_regs (fi) == NULL) frame_saved_regs_zalloc (fi); else - memset (fi->saved_regs, 0, SIZEOF_FRAME_SAVED_REGS); + memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS); if (dummy_regs) { /* DANGER! This is ONLY going to work if the char buffer format of the saved registers is byte-for-byte identical to the CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */ - memcpy (fi->saved_regs, dummy_regs, sizeof (fi->saved_regs)); + memcpy (get_frame_saved_regs (fi), dummy_regs, SIZEOF_FRAME_SAVED_REGS); return; } - fi->extra_info->leaf_function = 1; - fi->extra_info->f_offset = 0; + get_frame_extra_info (fi)->leaf_function = 1; + get_frame_extra_info (fi)->f_offset = 0; for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++) where[rn] = -1; @@ -1421,10 +1456,10 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi) that does not appear to be part of the prologue. But give up after 20 of them, since we're getting silly then. */ - pc = get_pc_function_start (fi->pc); + pc = get_pc_function_start (get_frame_pc (fi)); if (!pc) { - fi->pc = 0; + deprecated_update_frame_pc_hack (fi, 0); return; } @@ -1460,7 +1495,7 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi) int reg_nr = tdep->PR_C_REGNUM; where[reg_nr] = depth - ((((next_insn & 0xf) ^ 0x8) - 0x8) << 2); - fi->extra_info->leaf_function = 0; + get_frame_extra_info (fi)->leaf_function = 0; pc += insn_size; } } @@ -1488,7 +1523,7 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi) int reg_nr = tdep->PR_C_REGNUM; where[reg_nr] = depth - (r0_val - 4); r0_val -= 4; - fi->extra_info->leaf_function = 0; + get_frame_extra_info (fi)->leaf_function = 0; } else if (IS_MOV_R14_R0 (insn)) { @@ -1516,14 +1551,14 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi) { where[tdep->PR_REGNUM] = depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3); - fi->extra_info->leaf_function = 0; + get_frame_extra_info (fi)->leaf_function = 0; } else if (IS_STL_R18_R15 (insn)) { where[tdep->PR_REGNUM] = depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2); - fi->extra_info->leaf_function = 0; + get_frame_extra_info (fi)->leaf_function = 0; } else if (IS_STQ_R14_R15 (insn)) @@ -1553,11 +1588,11 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi) /* Watch out! saved_regs is only for the real registers, and doesn't include space for the pseudo registers. */ - fi->saved_regs[register_number]= fi->frame - where[rn] + depth; + get_frame_saved_regs (fi)[register_number]= get_frame_base (fi) - where[rn] + depth; } else - fi->saved_regs[register_number] = 0; + get_frame_saved_regs (fi)[register_number] = 0; } if (have_fp) @@ -1574,12 +1609,12 @@ sh64_nofp_frame_init_saved_regs (struct frame_info *fi) size = 4; else size = REGISTER_RAW_SIZE (fp_regnum); - fi->saved_regs[sp_regnum] = read_memory_integer (fi->saved_regs[fp_regnum], size); + get_frame_saved_regs (fi)[sp_regnum] = read_memory_integer (get_frame_saved_regs (fi)[fp_regnum], size); } else - fi->saved_regs[sp_regnum] = fi->frame; + get_frame_saved_regs (fi)[sp_regnum] = get_frame_base (fi); - fi->extra_info->f_offset = depth - where[fp_regnum]; + get_frame_extra_info (fi)->f_offset = depth - where[fp_regnum]; } static void @@ -1593,25 +1628,25 @@ sh_fp_frame_init_saved_regs (struct frame_info *fi) int opc; int insn; int r3_val = 0; - char *dummy_regs = deprecated_generic_find_dummy_frame (fi->pc, fi->frame); + char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi), get_frame_base (fi)); struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); - if (fi->saved_regs == NULL) + if (get_frame_saved_regs (fi) == NULL) frame_saved_regs_zalloc (fi); else - memset (fi->saved_regs, 0, SIZEOF_FRAME_SAVED_REGS); + memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS); if (dummy_regs) { /* DANGER! This is ONLY going to work if the char buffer format of the saved registers is byte-for-byte identical to the CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */ - memcpy (fi->saved_regs, dummy_regs, sizeof (fi->saved_regs)); + memcpy (get_frame_saved_regs (fi), dummy_regs, SIZEOF_FRAME_SAVED_REGS); return; } - fi->extra_info->leaf_function = 1; - fi->extra_info->f_offset = 0; + get_frame_extra_info (fi)->leaf_function = 1; + get_frame_extra_info (fi)->f_offset = 0; for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++) where[rn] = -1; @@ -1622,10 +1657,10 @@ sh_fp_frame_init_saved_regs (struct frame_info *fi) that does not appear to be part of the prologue. But give up after 20 of them, since we're getting silly then. */ - pc = get_pc_function_start (fi->pc); + pc = get_pc_function_start (get_frame_pc (fi)); if (!pc) { - fi->pc = 0; + deprecated_update_frame_pc_hack (fi, 0); return; } @@ -1643,7 +1678,7 @@ sh_fp_frame_init_saved_regs (struct frame_info *fi) { where[tdep->PR_REGNUM] = depth; /* If we're storing the pr then this isn't a leaf */ - fi->extra_info->leaf_function = 0; + get_frame_extra_info (fi)->leaf_function = 0; depth += 4; } else if (IS_MOV_R3 (insn)) @@ -1692,25 +1727,25 @@ sh_fp_frame_init_saved_regs (struct frame_info *fi) if (rn == FP_REGNUM) have_fp = 1; - fi->saved_regs[rn] = fi->frame - where[rn] + depth - 4; + get_frame_saved_regs (fi)[rn] = get_frame_base (fi) - where[rn] + depth - 4; } else { - fi->saved_regs[rn] = 0; + get_frame_saved_regs (fi)[rn] = 0; } } if (have_fp) { - fi->saved_regs[SP_REGNUM] = - read_memory_integer (fi->saved_regs[FP_REGNUM], 4); + get_frame_saved_regs (fi)[SP_REGNUM] = + read_memory_integer (get_frame_saved_regs (fi)[FP_REGNUM], 4); } else { - fi->saved_regs[SP_REGNUM] = fi->frame - 4; + get_frame_saved_regs (fi)[SP_REGNUM] = get_frame_base (fi) - 4; } - fi->extra_info->f_offset = depth - where[FP_REGNUM] - 4; + get_frame_extra_info (fi)->f_offset = depth - where[FP_REGNUM] - 4; /* Work out the return pc - either from the saved pr or the pr value */ } @@ -1720,29 +1755,29 @@ static void sh_init_extra_frame_info (int fromleaf, struct frame_info *fi) { - fi->extra_info = (struct frame_extra_info *) - frame_obstack_alloc (sizeof (struct frame_extra_info)); + frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info)); - if (fi->next) - fi->pc = FRAME_SAVED_PC (fi->next); + if (get_next_frame (fi)) + deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (get_next_frame (fi))); - if (DEPRECATED_PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame)) + 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 run_stack_dummy gets it wrong by assuming it's always FP. */ - fi->frame = deprecated_read_register_dummy (fi->pc, fi->frame, - SP_REGNUM); - fi->extra_info->return_pc = deprecated_read_register_dummy (fi->pc, - fi->frame, + 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); - fi->extra_info->f_offset = -(CALL_DUMMY_LENGTH + 4); - fi->extra_info->leaf_function = 0; + get_frame_extra_info (fi)->f_offset = -(CALL_DUMMY_LENGTH + 4); + get_frame_extra_info (fi)->leaf_function = 0; return; } else { FRAME_INIT_SAVED_REGS (fi); - fi->extra_info->return_pc = + get_frame_extra_info (fi)->return_pc = sh_find_callers_reg (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM); } } @@ -1750,30 +1785,30 @@ sh_init_extra_frame_info (int fromleaf, struct frame_info *fi) static void sh64_init_extra_frame_info (int fromleaf, struct frame_info *fi) { - int media_mode = pc_is_isa32 (fi->pc); + int media_mode = pc_is_isa32 (get_frame_pc (fi)); - fi->extra_info = (struct frame_extra_info *) - frame_obstack_alloc (sizeof (struct frame_extra_info)); + frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info)); - if (fi->next) - fi->pc = FRAME_SAVED_PC (fi->next); + if (get_next_frame (fi)) + deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (get_next_frame (fi))); - if (DEPRECATED_PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame)) + 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 run_stack_dummy gets it wrong by assuming it's always FP. */ - fi->frame = deprecated_read_register_dummy (fi->pc, fi->frame, - SP_REGNUM); - fi->extra_info->return_pc = - deprecated_read_register_dummy (fi->pc, fi->frame, PC_REGNUM); - fi->extra_info->f_offset = -(CALL_DUMMY_LENGTH + 4); - fi->extra_info->leaf_function = 0; + 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 = -(CALL_DUMMY_LENGTH + 4); + get_frame_extra_info (fi)->leaf_function = 0; return; } else { FRAME_INIT_SAVED_REGS (fi); - fi->extra_info->return_pc = + get_frame_extra_info (fi)->return_pc = sh64_get_saved_pr (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM); } } @@ -1805,7 +1840,7 @@ sh64_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp, 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 (frame->pc); + 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 @@ -1813,23 +1848,25 @@ sh64_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp, the current frame itself: otherwise, we would be getting the previous frame's registers which were saved by the current frame. */ - while (frame && ((frame = frame->next) != NULL)) + while (frame && ((frame = get_next_frame (frame)) != NULL)) { - if (DEPRECATED_PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame)) + 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 (frame->pc, frame->frame) + (deprecated_generic_find_dummy_frame (get_frame_pc (frame), get_frame_base (frame)) + REGISTER_BYTE (regnum)), REGISTER_RAW_SIZE (regnum)); return; } FRAME_INIT_SAVED_REGS (frame); - if (frame->saved_regs != NULL - && frame->saved_regs[regnum] != 0) + if (get_frame_saved_regs (frame) != NULL + && get_frame_saved_regs (frame)[regnum] != 0) { if (lval) /* found it saved on the stack */ *lval = lval_memory; @@ -1837,13 +1874,13 @@ sh64_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp, { if (raw_buffer) /* SP register treated specially */ store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), - frame->saved_regs[regnum]); + get_frame_saved_regs (frame)[regnum]); } else { /* any other register */ if (addrp) - *addrp = frame->saved_regs[regnum]; + *addrp = get_frame_saved_regs (frame)[regnum]; if (raw_buffer) { int size; @@ -1854,9 +1891,9 @@ sh64_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp, else size = REGISTER_RAW_SIZE (live_regnum); if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE) - read_memory (frame->saved_regs[regnum], raw_buffer, size); + read_memory (get_frame_saved_regs (frame)[regnum], raw_buffer, size); else - read_memory (frame->saved_regs[regnum], + read_memory (get_frame_saved_regs (frame)[regnum], raw_buffer + REGISTER_RAW_SIZE (live_regnum) - size, @@ -1897,7 +1934,7 @@ sh64_extract_struct_value_address (char *regbuf) static CORE_ADDR sh_frame_saved_pc (struct frame_info *frame) { - return ((frame)->extra_info->return_pc); + return (get_frame_extra_info (frame)->return_pc); } /* Discard from the stack the innermost frame, @@ -1909,7 +1946,9 @@ sh_pop_frame (void) register CORE_ADDR fp; register int regnum; - if (DEPRECATED_PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame)) + if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), + get_frame_base (frame), + get_frame_base (frame))) generic_pop_dummy_frame (); else { @@ -1918,11 +1957,11 @@ sh_pop_frame (void) /* Copy regs from where they were saved in the frame */ for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++) - if (frame->saved_regs[regnum]) + if (get_frame_saved_regs (frame)[regnum]) write_register (regnum, - read_memory_integer (frame->saved_regs[regnum], 4)); + read_memory_integer (get_frame_saved_regs (frame)[regnum], 4)); - write_register (PC_REGNUM, frame->extra_info->return_pc); + write_register (PC_REGNUM, get_frame_extra_info (frame)->return_pc); write_register (SP_REGNUM, fp + 4); } flush_cached_frames (); @@ -1937,9 +1976,11 @@ sh64_pop_frame (void) register int regnum; struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); - int media_mode = pc_is_isa32 (frame->pc); + int media_mode = pc_is_isa32 (get_frame_pc (frame)); - if (DEPRECATED_PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame)) + if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), + get_frame_base (frame), + get_frame_base (frame))) generic_pop_dummy_frame (); else { @@ -1948,7 +1989,7 @@ sh64_pop_frame (void) /* Copy regs from where they were saved in the frame */ for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++) - if (frame->saved_regs[regnum]) + if (get_frame_saved_regs (frame)[regnum]) { int size; if (tdep->sh_abi == SH_ABI_32 @@ -1959,11 +2000,11 @@ sh64_pop_frame (void) size = REGISTER_RAW_SIZE (translate_insn_rn (regnum, media_mode)); write_register (regnum, - read_memory_integer (frame->saved_regs[regnum], + read_memory_integer (get_frame_saved_regs (frame)[regnum], size)); } - write_register (PC_REGNUM, frame->extra_info->return_pc); + write_register (PC_REGNUM, get_frame_extra_info (frame)->return_pc); write_register (SP_REGNUM, fp + 8); } flush_cached_frames (); @@ -2319,12 +2360,6 @@ sh_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, } #endif -static int -sh_coerce_float_to_double (struct type *formal, struct type *actual) -{ - return 1; -} - /* Find a function's return value in the appropriate registers (in regbuf), and copy it into valbuf. Extract from an array REGBUF containing the (raw) register state a function return value of type @@ -2612,6 +2647,62 @@ sh3_show_regs (void) static void +sh2e_show_regs (void) +{ + printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n", + paddr (read_register (PC_REGNUM)), + (long) read_register (SR_REGNUM), + (long) read_register (PR_REGNUM), + (long) read_register (MACH_REGNUM), + (long) read_register (MACL_REGNUM)); + + printf_filtered ("GBR=%08lx VBR=%08lx", + (long) read_register (GBR_REGNUM), + (long) read_register (VBR_REGNUM)); + printf_filtered (" FPUL=%08lx FPSCR=%08lx", + (long) read_register (gdbarch_tdep (current_gdbarch)->FPUL_REGNUM), + (long) read_register (gdbarch_tdep (current_gdbarch)->FPSCR_REGNUM)); + + printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", + (long) read_register (0), + (long) read_register (1), + (long) read_register (2), + (long) read_register (3), + (long) read_register (4), + (long) read_register (5), + (long) read_register (6), + (long) read_register (7)); + printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", + (long) read_register (8), + (long) read_register (9), + (long) read_register (10), + (long) read_register (11), + (long) read_register (12), + (long) read_register (13), + (long) read_register (14), + (long) read_register (15)); + + printf_filtered (("FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"), + (long) read_register (FP0_REGNUM + 0), + (long) read_register (FP0_REGNUM + 1), + (long) read_register (FP0_REGNUM + 2), + (long) read_register (FP0_REGNUM + 3), + (long) read_register (FP0_REGNUM + 4), + (long) read_register (FP0_REGNUM + 5), + (long) read_register (FP0_REGNUM + 6), + (long) read_register (FP0_REGNUM + 7)); + printf_filtered (("FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"), + (long) read_register (FP0_REGNUM + 8), + (long) read_register (FP0_REGNUM + 9), + (long) read_register (FP0_REGNUM + 10), + (long) read_register (FP0_REGNUM + 11), + (long) read_register (FP0_REGNUM + 12), + (long) read_register (FP0_REGNUM + 13), + (long) read_register (FP0_REGNUM + 14), + (long) read_register (FP0_REGNUM + 15)); +} + +static void sh3e_show_regs (void) { struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); @@ -2938,7 +3029,7 @@ sh64_show_compact_regs (void) static void sh64_show_regs (void) { - if (pc_is_isa32 (deprecated_selected_frame->pc)) + if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame))) sh64_show_media_regs (); else sh64_show_compact_regs (); @@ -3996,7 +4087,7 @@ sh64_do_pseudo_register (int regnum) static void sh_do_register (int regnum) { - char raw_buffer[MAX_REGISTER_RAW_SIZE]; + char *raw_buffer = alloca (max_register_size (current_gdbarch)); fputs_filtered (REGISTER_NAME (regnum), gdb_stdout); print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), gdb_stdout); @@ -4113,7 +4204,7 @@ sh_compact_do_registers_info (int regnum, int fpregs) void sh64_do_registers_info (int regnum, int fpregs) { - if (pc_is_isa32 (deprecated_selected_frame->pc)) + if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame))) sh_do_registers_info (regnum, fpregs); else sh_compact_do_registers_info (regnum, fpregs); @@ -4216,26 +4307,11 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) gdbarch_register_name_ftype *sh_register_name; gdbarch_deprecated_store_return_value_ftype *sh_store_return_value; gdbarch_register_virtual_type_ftype *sh_register_virtual_type; - enum gdb_osabi osabi = GDB_OSABI_UNKNOWN; - - /* Try to determine the ABI of the object we are loading. */ - - if (info.abfd != NULL) - { - osabi = gdbarch_lookup_osabi (info.abfd); - /* If we get "unknown" back, just leave it that way. */ - } - /* Find a candidate among the list of pre-declared architectures. */ - for (arches = gdbarch_list_lookup_by_info (arches, &info); - arches != NULL; - arches = gdbarch_list_lookup_by_info (arches->next, &info)) - { - /* Make sure the ABI selection matches. */ - tdep = gdbarch_tdep (arches->gdbarch); - if (tdep && tdep->osabi == osabi) - return arches->gdbarch; - } + /* If there is already a candidate, use it. */ + arches = gdbarch_list_lookup_by_info (arches, &info); + if (arches != NULL) + return arches->gdbarch; /* None found, create a new architecture from the information provided. */ @@ -4246,8 +4322,6 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) ready to unwind the PC first (see frame.c:get_prev_frame()). */ set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default); - tdep->osabi = osabi; - /* Initialize the register numbers that are not common to all the variants to -1, if necessary thse will be overwritten in the case statement below. */ @@ -4333,6 +4407,20 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size); set_gdbarch_register_byte (gdbarch, sh_default_register_byte); break; + case bfd_mach_sh2e: + sh_register_name = sh_sh2e_register_name; + sh_show_regs = sh2e_show_regs; + sh_store_return_value = sh3e_sh4_store_return_value; + sh_register_virtual_type = sh_sh3e_register_virtual_type; + set_gdbarch_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs); + set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size); + set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size); + set_gdbarch_register_byte (gdbarch, sh_default_register_byte); + set_gdbarch_fp0_regnum (gdbarch, 25); + tdep->FPUL_REGNUM = 23; + tdep->FPSCR_REGNUM = 24; + tdep->FP_LAST_REGNUM = 40; + break; case bfd_mach_sh_dsp: sh_register_name = sh_sh_dsp_register_name; sh_show_regs = sh_dsp_show_regs; @@ -4575,8 +4663,6 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_call_dummy_p (gdbarch, 1); set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0); set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy); - set_gdbarch_coerce_float_to_double (gdbarch, - sh_coerce_float_to_double); set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame); set_gdbarch_push_return_address (gdbarch, sh_push_return_address); @@ -4589,17 +4675,13 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_frame_args_skip (gdbarch, 0); set_gdbarch_frameless_function_invocation (gdbarch, frameless_look_for_prologue); - set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, sh_frame_saved_pc); set_gdbarch_saved_pc_after_call (gdbarch, sh_saved_pc_after_call); set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown); set_gdbarch_believe_pcc_promotion (gdbarch, 1); - /* Hook in ABI-specific overrides, if they have been registered. - - FIXME: if the ABI is unknown, this is probably an embedded target, - so we should not warn about this situation. */ - gdbarch_init_osabi (info, gdbarch, osabi); + /* Hook in ABI-specific overrides, if they have been registered. */ + gdbarch_init_osabi (info, gdbarch); return gdbarch; } @@ -4612,8 +4694,7 @@ sh_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file) if (tdep == NULL) return; - fprintf_unfiltered (file, "sh_dump_tdep: OS ABI = %s\n", - gdbarch_osabi_name (tdep->osabi)); + /* FIXME: dump the rest of gdbarch_tdep. */ } void |