X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fsh-tdep.c;h=46b7deec1fcde169f8486cce70807106e9c4b0a6;hb=54c7009d04fc3da51b50cfbefe5f5894db2cad32;hp=67ebbf3fc9bf2f8d5013557f567bf1ac7c9d7176;hpb=2ee563b53258d390d7446e90a67f465d504ae44c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c index 67ebbf3fc9..46b7deec1f 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" @@ -155,6 +156,28 @@ sh_sh3e_register_name (int reg_nr) return register_names[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) { @@ -884,7 +907,14 @@ sh_saved_pc_after_call (struct frame_info *frame) static int sh_use_struct_convention (int gcc_p, struct type *type) { +#if 0 return (TYPE_LENGTH (type) > 1); +#else + int len = TYPE_LENGTH (type); + int nelem = TYPE_NFIELDS (type); + return ((len != 1 && len != 2 && len != 4 && len != 8) || nelem != 1) && + (len != 8 || TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)) != 4); +#endif } static int @@ -911,19 +941,23 @@ gdb_print_insn_sh (bfd_vma memaddr, disassemble_info *info) return print_insn_sh (memaddr, info); } -/* Given a GDB frame, determine the address of the calling function's frame. - This will be used to create a new GDB frame struct, and then - INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame. +/* Given a GDB frame, determine the address of the calling function's + frame. This will be used to create a new GDB frame struct, and + then INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC will be + called for the new frame. For us, the frame address is its stack pointer value, so we look up the function prologue to determine the caller's sp value, and return it. */ static CORE_ADDR sh_frame_chain (struct frame_info *frame) { - if (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 (FRAME_FP (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; } @@ -958,17 +992,21 @@ translate_insn_rn (int rn, int media_mode) static CORE_ADDR sh64_frame_chain (struct frame_info *frame) { - if (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 (FRAME_FP (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; @@ -982,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 (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 generic_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); @@ -1004,26 +1044,28 @@ sh64_get_saved_pr (struct frame_info *fi, int pr_regnum) { int media_mode = 0; - for (; fi; fi = fi->next) - if (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 generic_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); @@ -1045,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; @@ -1073,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; } @@ -1094,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)) @@ -1132,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 */ } @@ -1384,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; @@ -1413,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; } @@ -1452,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; } } @@ -1480,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)) { @@ -1508,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)) @@ -1545,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) @@ -1566,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 @@ -1585,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; @@ -1614,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; } @@ -1635,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)) @@ -1684,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 */ } @@ -1712,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 (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 = generic_read_register_dummy (fi->pc, fi->frame, - SP_REGNUM); - fi->extra_info->return_pc = generic_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 = sh_find_callers_reg (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM); } } @@ -1742,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 (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 = generic_read_register_dummy (fi->pc, fi->frame, - SP_REGNUM); - fi->extra_info->return_pc = - generic_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); } } @@ -1797,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 @@ -1805,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 (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; @@ -1829,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; @@ -1846,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, @@ -1867,7 +1912,7 @@ sh64_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp, if (addrp) *addrp = REGISTER_BYTE (live_regnum); if (raw_buffer) - read_register_gen (live_regnum, raw_buffer); + deprecated_read_register_gen (live_regnum, raw_buffer); } /* Extract from an array REGBUF containing the (raw) register state @@ -1889,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, @@ -1901,20 +1946,22 @@ sh_pop_frame (void) register CORE_ADDR fp; register int regnum; - if (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 { - fp = FRAME_FP (frame); + fp = get_frame_base (frame); 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 (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 (); @@ -1929,18 +1976,20 @@ 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 (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 { - fp = FRAME_FP (frame); + fp = get_frame_base (frame); 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 (frame->saved_regs[regnum]) + if (get_frame_saved_regs (frame)[regnum]) { int size; if (tdep->sh_abi == SH_ABI_32 @@ -1951,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 (); @@ -2045,8 +2094,11 @@ sh_push_arguments (int nargs, struct value **args, CORE_ADDR sp, if (len < 4) { /* value gets right-justified in the register or stack word */ - memcpy (valbuf + (4 - len), - (char *) VALUE_CONTENTS (args[argnum]), len); + if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) + memcpy (valbuf + (4 - len), + (char *) VALUE_CONTENTS (args[argnum]), len); + else + memcpy (valbuf, (char *) VALUE_CONTENTS (args[argnum]), len); val = valbuf; } else @@ -2213,7 +2265,8 @@ sh64_push_arguments (int nargs, struct value **args, CORE_ADDR sp, if (float_arg_index <= tdep->FLOAT_ARGLAST_REGNUM) { /* Goes in FR0...FR11 */ - write_register_gen (FP0_REGNUM + float_arg_index, val); + deprecated_write_register_gen (FP0_REGNUM + float_arg_index, + val); fp_args[float_arg_index] = 1; /* Skip the corresponding general argument register. */ int_argreg ++; @@ -2256,7 +2309,7 @@ sh64_push_arguments (int nargs, struct value **args, CORE_ADDR sp, call the gdbarch function to do register writes, and that will properly know how to deal with pseudoregs. */ - write_register_gen (regnum, val); + deprecated_write_register_gen (regnum, val); fp_args[double_arg_index] = 1; fp_args[double_arg_index + 1] = 1; /* Skip the corresponding general argument register. */ @@ -2307,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 @@ -2457,22 +2504,25 @@ sh_default_store_return_value (struct type *type, char *valbuf) { /* Add leading zeros to the value. */ memset (buf, 0, REGISTER_RAW_SIZE (R0_REGNUM)); - memcpy (buf + REGISTER_RAW_SIZE (R0_REGNUM) - TYPE_LENGTH (type), - valbuf, TYPE_LENGTH (type)); - write_register_bytes (REGISTER_BYTE (R0_REGNUM), buf, - REGISTER_RAW_SIZE (R0_REGNUM)); + if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) + memcpy (buf + REGISTER_RAW_SIZE (R0_REGNUM) - TYPE_LENGTH (type), + valbuf, TYPE_LENGTH (type)); + else + memcpy (buf, valbuf, TYPE_LENGTH (type)); + deprecated_write_register_bytes (REGISTER_BYTE (R0_REGNUM), buf, + REGISTER_RAW_SIZE (R0_REGNUM)); } else - write_register_bytes (REGISTER_BYTE (R0_REGNUM), valbuf, - TYPE_LENGTH (type)); + deprecated_write_register_bytes (REGISTER_BYTE (R0_REGNUM), valbuf, + TYPE_LENGTH (type)); } static void sh3e_sh4_store_return_value (struct type *type, char *valbuf) { if (TYPE_CODE (type) == TYPE_CODE_FLT) - write_register_bytes (REGISTER_BYTE (FP0_REGNUM), - valbuf, TYPE_LENGTH (type)); + deprecated_write_register_bytes (REGISTER_BYTE (FP0_REGNUM), + valbuf, TYPE_LENGTH (type)); else sh_default_store_return_value (type, valbuf); } @@ -2488,7 +2538,7 @@ sh64_store_return_value (struct type *type, char *valbuf) if (len == 4) { /* Return value stored in FP0_REGNUM */ - write_register_gen (FP0_REGNUM, valbuf); + deprecated_write_register_gen (FP0_REGNUM, valbuf); } if (len == 8) { @@ -2511,10 +2561,10 @@ sh64_store_return_value (struct type *type, char *valbuf) offset = REGISTER_RAW_SIZE (return_register) - len; memcpy (buf + offset, valbuf, len); - write_register_gen (return_register, buf); + deprecated_write_register_gen (return_register, buf); } else - write_register_gen (return_register, valbuf); + deprecated_write_register_gen (return_register, valbuf); } } @@ -2596,6 +2646,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) { @@ -2923,7 +3029,7 @@ sh64_show_compact_regs (void) static void sh64_show_regs (void) { - if (pc_is_isa32 (selected_frame->pc)) + if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame))) sh64_show_media_regs (); else sh64_show_compact_regs (); @@ -3905,7 +4011,7 @@ sh_do_fp_register (int regnum) raw_buffer = (char *) alloca (REGISTER_RAW_SIZE (FP0_REGNUM)); /* Get the data in raw format. */ - if (!frame_register_read (selected_frame, regnum, raw_buffer)) + if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer)) error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum)); /* Get the register as a number */ @@ -3981,13 +4087,13 @@ 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); /* Get the data in raw format. */ - if (!frame_register_read (selected_frame, regnum, raw_buffer)) + if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer)) printf_filtered ("*value not available*\n"); val_print (REGISTER_VIRTUAL_TYPE (regnum), raw_buffer, 0, 0, @@ -4098,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 (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); @@ -4199,35 +4305,22 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) struct gdbarch *gdbarch; struct gdbarch_tdep *tdep; gdbarch_register_name_ftype *sh_register_name; - gdbarch_store_return_value_ftype *sh_store_return_value; + 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. */ tdep = XMALLOC (struct gdbarch_tdep); gdbarch = gdbarch_alloc (&info, tdep); - tdep->osabi = osabi; + /* NOTE: cagney/2002-12-06: This can be deleted when this arch is + ready to unwind the PC first (see frame.c:get_prev_frame()). */ + set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default); /* Initialize the register numbers that are not common to all the variants to -1, if necessary thse will be overwritten in the case @@ -4276,10 +4369,10 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_pc_regnum (gdbarch, 16); set_gdbarch_register_size (gdbarch, 4); set_gdbarch_register_bytes (gdbarch, SH_DEFAULT_NUM_REGS * 4); - set_gdbarch_do_registers_info (gdbarch, sh_do_registers_info); + set_gdbarch_deprecated_do_registers_info (gdbarch, sh_do_registers_info); set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc); set_gdbarch_frame_chain (gdbarch, sh_frame_chain); - set_gdbarch_get_saved_register (gdbarch, generic_get_saved_register); + set_gdbarch_get_saved_register (gdbarch, deprecated_generic_get_saved_register); set_gdbarch_init_extra_frame_info (gdbarch, sh_init_extra_frame_info); set_gdbarch_deprecated_extract_return_value (gdbarch, sh_extract_return_value); set_gdbarch_push_arguments (gdbarch, sh_push_arguments); @@ -4314,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; @@ -4503,7 +4610,7 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_pseudo_register_read (gdbarch, sh64_pseudo_register_read); set_gdbarch_pseudo_register_write (gdbarch, sh64_pseudo_register_write); - set_gdbarch_do_registers_info (gdbarch, sh64_do_registers_info); + set_gdbarch_deprecated_do_registers_info (gdbarch, sh64_do_registers_info); set_gdbarch_frame_init_saved_regs (gdbarch, sh64_nofp_frame_init_saved_regs); set_gdbarch_breakpoint_from_pc (gdbarch, sh_sh64_breakpoint_from_pc); set_gdbarch_init_extra_frame_info (gdbarch, sh64_init_extra_frame_info); @@ -4544,28 +4651,23 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT); set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT); set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT); - set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);/*??should be 8?*/ + set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT); - set_gdbarch_use_generic_dummy_frames (gdbarch, 1); set_gdbarch_call_dummy_length (gdbarch, 0); - set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT); set_gdbarch_call_dummy_address (gdbarch, entry_point_address); set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1); /*???*/ set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0); set_gdbarch_call_dummy_start_offset (gdbarch, 0); - set_gdbarch_pc_in_call_dummy (gdbarch, generic_pc_in_call_dummy); set_gdbarch_call_dummy_words (gdbarch, sh_call_dummy_words); set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof (sh_call_dummy_words)); 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); - set_gdbarch_store_return_value (gdbarch, sh_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sh_store_return_value); set_gdbarch_skip_prologue (gdbarch, sh_skip_prologue); set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_decr_pc_after_break (gdbarch, 0); @@ -4573,19 +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_frame_args_address (gdbarch, default_frame_address); - set_gdbarch_frame_locals_address (gdbarch, default_frame_address); 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; } @@ -4598,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