X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsh-tdep.c;h=fe64cf979a01d0d1036a73635347c9edaf7cf02c;hb=e98ee8c458f3a8405eb93e71b00f801b4bbe3635;hp=49ef8c64a0fb77f0438cf01415077a941d415d97;hpb=05d1431c1e0a4ecf30462109f5fb9876d78b7b4a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c index 49ef8c64a0..fe64cf979a 100644 --- a/gdb/sh-tdep.c +++ b/gdb/sh-tdep.c @@ -1,8 +1,6 @@ /* Target-dependent code for Renesas Super-H, for GDB. - Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1993-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -34,15 +32,13 @@ #include "value.h" #include "dis-asm.h" #include "inferior.h" -#include "gdb_string.h" -#include "gdb_assert.h" #include "arch-utils.h" -#include "floatformat.h" #include "regcache.h" -#include "doublest.h" +#include "target-float.h" #include "osabi.h" #include "reggroups.h" #include "regset.h" +#include "objfiles.h" #include "sh-tdep.h" @@ -54,6 +50,7 @@ #include "dwarf2.h" /* registers numbers shared with the simulator. */ #include "gdb/sim-sh.h" +#include /* List of "set sh ..." and "show sh ..." commands. */ static struct cmd_list_element *setshcmdlist = NULL; @@ -61,7 +58,7 @@ static struct cmd_list_element *showshcmdlist = NULL; static const char sh_cc_gcc[] = "gcc"; static const char sh_cc_renesas[] = "renesas"; -static const char *sh_cc_enum[] = { +static const char *const sh_cc_enum[] = { sh_cc_gcc, sh_cc_renesas, NULL @@ -69,8 +66,6 @@ static const char *sh_cc_enum[] = { static const char *sh_active_calling_convention = sh_cc_gcc; -static void (*sh_show_regs) (struct frame_info *); - #define SH_NUM_REGS 67 struct sh_frame_cache @@ -91,15 +86,30 @@ struct sh_frame_cache static int sh_is_renesas_calling_convention (struct type *func_type) { - return ((func_type - && TYPE_CALLING_CONVENTION (func_type) == DW_CC_GNU_renesas_sh) - || sh_active_calling_convention == sh_cc_renesas); + int val = 0; + + if (func_type) + { + func_type = check_typedef (func_type); + + if (TYPE_CODE (func_type) == TYPE_CODE_PTR) + func_type = check_typedef (TYPE_TARGET_TYPE (func_type)); + + if (TYPE_CODE (func_type) == TYPE_CODE_FUNC + && TYPE_CALLING_CONVENTION (func_type) == DW_CC_GNU_renesas_sh) + val = 1; + } + + if (sh_active_calling_convention == sh_cc_renesas) + val = 1; + + return val; } static const char * sh_sh_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const 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", @@ -121,7 +131,7 @@ sh_sh_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh3_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const 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", @@ -143,7 +153,7 @@ sh_sh3_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh3e_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const 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", @@ -165,7 +175,7 @@ sh_sh3e_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh2e_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const 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", @@ -187,7 +197,7 @@ sh_sh2e_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh2a_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const char *register_names[] = { /* general registers 0-15 */ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", @@ -227,7 +237,7 @@ sh_sh2a_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh2a_nofpu_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const char *register_names[] = { /* general registers 0-15 */ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", @@ -267,7 +277,7 @@ sh_sh2a_nofpu_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh_dsp_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const 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", @@ -289,7 +299,7 @@ sh_sh_dsp_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh3_dsp_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const 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", @@ -312,7 +322,7 @@ sh_sh3_dsp_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh4_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const char *register_names[] = { /* general registers 0-15 */ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", @@ -329,15 +339,16 @@ sh_sh4_register_name (struct gdbarch *gdbarch, int reg_nr) "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0", /* bank 1 51 - 58 */ "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1", + /* 59 - 66 */ "", "", "", "", "", "", "", "", /* pseudo bank register. */ "", - /* double precision (pseudo) 59 - 66 */ + /* double precision (pseudo) 68 - 75 */ "dr0", "dr2", "dr4", "dr6", "dr8", "dr10", "dr12", "dr14", - /* vectors (pseudo) 67 - 70 */ + /* vectors (pseudo) 76 - 79 */ "fv0", "fv4", "fv8", "fv12", - /* FIXME: missing XF 71 - 86 */ - /* FIXME: missing XD 87 - 94 */ + /* FIXME: missing XF */ + /* FIXME: missing XD */ }; if (reg_nr < 0) return NULL; @@ -349,7 +360,7 @@ sh_sh4_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh4_nofpu_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const char *register_names[] = { /* general registers 0-15 */ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", @@ -366,12 +377,13 @@ sh_sh4_nofpu_register_name (struct gdbarch *gdbarch, int reg_nr) "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0", /* bank 1 51 - 58 */ "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1", + /* 59 - 66 */ "", "", "", "", "", "", "", "", /* pseudo bank register. */ "", - /* double precision (pseudo) 59 - 66 -- not for nofpu target */ + /* double precision (pseudo) 68 - 75 -- not for nofpu target */ "", "", "", "", "", "", "", "", - /* vectors (pseudo) 67 - 70 -- not for nofpu target */ + /* vectors (pseudo) 76 - 79 -- not for nofpu target */ "", "", "", "", }; if (reg_nr < 0) @@ -384,7 +396,7 @@ sh_sh4_nofpu_register_name (struct gdbarch *gdbarch, int reg_nr) static const char * sh_sh4al_dsp_register_name (struct gdbarch *gdbarch, int reg_nr) { - static char *register_names[] = { + static const 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", @@ -404,11 +416,20 @@ sh_sh4al_dsp_register_name (struct gdbarch *gdbarch, int reg_nr) return register_names[reg_nr]; } -static const unsigned char * -sh_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr) +/* Implement the breakpoint_kind_from_pc gdbarch method. */ + +static int +sh_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr) { - /* 0xc3c3 is trapa #c3, and it works in big and little endian modes. */ - static unsigned char breakpoint[] = { 0xc3, 0xc3 }; + return 2; +} + +/* Implement the sw_breakpoint_from_kind gdbarch method. */ + +static const gdb_byte * +sh_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size) +{ + *size = kind; /* For remote stub targets, trapa #20 is used. */ if (strcmp (target_shortname, "remote") == 0) @@ -417,19 +438,18 @@ sh_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr) static unsigned char little_remote_breakpoint[] = { 0x20, 0xc3 }; if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) - { - *lenptr = sizeof (big_remote_breakpoint); - return big_remote_breakpoint; - } + return big_remote_breakpoint; else - { - *lenptr = sizeof (little_remote_breakpoint); - return little_remote_breakpoint; - } + return little_remote_breakpoint; } + else + { + /* 0xc3c3 is trapa #c3, and it works in big and little endian + modes. */ + static unsigned char breakpoint[] = { 0xc3, 0xc3 }; - *lenptr = sizeof (breakpoint); - return breakpoint; + return breakpoint; + } } /* Prologue looks like @@ -520,22 +540,18 @@ sh_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr) static CORE_ADDR sh_analyze_prologue (struct gdbarch *gdbarch, - CORE_ADDR pc, CORE_ADDR current_pc, + CORE_ADDR pc, CORE_ADDR limit_pc, struct sh_frame_cache *cache, ULONGEST fpscr) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); ULONGEST inst; - CORE_ADDR opc; int offset; int sav_offset = 0; int r3_val = 0; int reg, sav_reg = -1; - if (pc >= current_pc) - return current_pc; - cache->uses_fp = 0; - for (opc = pc + (2 * 28); pc < opc; pc += 2) + for (; pc < limit_pc; pc += 2) { inst = read_memory_unsigned_integer (pc, 2, byte_order); /* See where the registers will be saved to. */ @@ -600,7 +616,8 @@ sh_analyze_prologue (struct gdbarch *gdbarch, } } } - else if (IS_MOVI20 (inst)) + else if (IS_MOVI20 (inst) + && (pc + 2 < limit_pc)) { if (sav_reg < 0) { @@ -642,14 +659,17 @@ sh_analyze_prologue (struct gdbarch *gdbarch, } else if (IS_MOV_SP_FP (inst)) { + pc += 2; + /* Don't go any further than six more instructions. */ + limit_pc = std::min (limit_pc, pc + (2 * 6)); + cache->uses_fp = 1; /* At this point, only allow argument register moves to other registers or argument register moves to @(X,fp) which are moving the register arguments onto the stack area allocated by a former add somenumber to SP call. Don't allow moving to an fp indirect address above fp + cache->sp_offset. */ - pc += 2; - for (opc = pc + 12; pc < opc; pc += 2) + for (; pc < limit_pc; pc += 2) { inst = read_memory_integer (pc, 2, byte_order); if (IS_MOV_ARG_TO_IND_R14 (inst)) @@ -681,9 +701,12 @@ sh_analyze_prologue (struct gdbarch *gdbarch, jsr, which will be very confusing. Most likely the next instruction is going to be IS_MOV_SP_FP in the delay slot. If so, note that before returning the current pc. */ - inst = read_memory_integer (pc + 2, 2, byte_order); - if (IS_MOV_SP_FP (inst)) - cache->uses_fp = 1; + if (pc + 2 < limit_pc) + { + inst = read_memory_integer (pc + 2, 2, byte_order); + if (IS_MOV_SP_FP (inst)) + cache->uses_fp = 1; + } break; } #if 0 /* This used to just stop when it found an instruction @@ -699,55 +722,42 @@ sh_analyze_prologue (struct gdbarch *gdbarch, } /* Skip any prologue before the guts of a function. */ - -/* Skip the prologue using the debug information. If this fails we'll - fall back on the 'guess' method below. */ static CORE_ADDR -after_prologue (CORE_ADDR pc) +sh_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) { - struct symtab_and_line sal; - CORE_ADDR func_addr, func_end; - - /* If we can not find the symbol in the partial symbol table, then - there is no hope we can determine the function's start address - with this code. */ - if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end)) - return 0; - - /* Get the line associated with FUNC_ADDR. */ - sal = find_pc_line (func_addr, 0); - - /* There are only two cases to consider. First, the end of the source line - is within the function bounds. In that case we return the end of the - source line. Second is the end of the source line extends beyond the - bounds of the current function. We need to use the slow code to - examine instructions in that case. */ - if (sal.end < func_end) - return sal.end; - else - return 0; -} - -static CORE_ADDR -sh_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) -{ - CORE_ADDR pc; + CORE_ADDR post_prologue_pc, func_addr, func_end_addr, limit_pc; struct sh_frame_cache cache; /* See if we can determine the end of the prologue via the symbol table. If so, then return either PC, or the PC after the prologue, whichever is greater. */ - pc = after_prologue (start_pc); + if (find_pc_partial_function (pc, NULL, &func_addr, &func_end_addr)) + { + post_prologue_pc = skip_prologue_using_sal (gdbarch, func_addr); + if (post_prologue_pc != 0) + return std::max (pc, post_prologue_pc); + } + + /* Can't determine prologue from the symbol table, need to examine + instructions. */ + + /* Find an upper limit on the function prologue using the debug + information. If the debug information could not be used to provide + that bound, then use an arbitrary large number as the upper bound. */ + limit_pc = skip_prologue_using_sal (gdbarch, pc); + if (limit_pc == 0) + /* Don't go any further than 28 instructions. */ + limit_pc = pc + (2 * 28); - /* If after_prologue returned a useful address, then use it. Else - fall back on the instruction skipping code. */ - if (pc) - return max (pc, start_pc); + /* Do not allow limit_pc to be past the function end, if we know + where that end is... */ + if (func_end_addr != 0) + limit_pc = std::min (limit_pc, func_end_addr); cache.sp_offset = -4; - pc = sh_analyze_prologue (gdbarch, start_pc, (CORE_ADDR) -1, &cache, 0); - if (!cache.uses_fp) - return start_pc; + post_prologue_pc = sh_analyze_prologue (gdbarch, pc, limit_pc, &cache, 0); + if (cache.uses_fp) + pc = post_prologue_pc; return pc; } @@ -903,22 +913,22 @@ sh_frame_align (struct gdbarch *ignore, CORE_ADDR sp) to R7. */ /* Helper function to justify value in register according to endianess. */ -static char * +static const gdb_byte * sh_justify_value_in_reg (struct gdbarch *gdbarch, struct value *val, int len) { - static char valbuf[4]; + static gdb_byte valbuf[4]; memset (valbuf, 0, sizeof (valbuf)); if (len < 4) { /* value gets right-justified in the register or stack word. */ if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) - memcpy (valbuf + (4 - len), (char *) value_contents (val), len); + memcpy (valbuf + (4 - len), value_contents (val), len); else - memcpy (valbuf, (char *) value_contents (val), len); + memcpy (valbuf, value_contents (val), len); return valbuf; } - return (char *) value_contents (val); + return value_contents (val); } /* Helper function to eval number of bytes to allocate on stack. */ @@ -1029,8 +1039,6 @@ sh_next_flt_argreg (struct gdbarch *gdbarch, int len, struct type *func_type) static int sh_treat_as_flt_p (struct type *type) { - int len = TYPE_LENGTH (type); - /* Ordinary float types are obviously treated as float. */ if (TYPE_CODE (type) == TYPE_CODE_FLT) return 1; @@ -1065,7 +1073,7 @@ sh_push_dummy_call_fpu (struct gdbarch *gdbarch, struct type *func_type = value_type (function); struct type *type; CORE_ADDR regval; - char *val; + const gdb_byte *val; int len, reg_size = 0; int pass_on_stack = 0; int treat_as_flt; @@ -1206,7 +1214,7 @@ sh_push_dummy_call_nofpu (struct gdbarch *gdbarch, struct type *func_type = value_type (function); struct type *type; CORE_ADDR regval; - char *val; + const gdb_byte *val; int len, reg_size = 0; int pass_on_stack = 0; int last_reg_arg = INT_MAX; @@ -1299,13 +1307,11 @@ sh_push_dummy_call_nofpu (struct gdbarch *gdbarch, TYPE, and copy that, in virtual format, into VALBUF. */ static void sh_extract_return_value_nofpu (struct type *type, struct regcache *regcache, - void *valbuf) + gdb_byte *valbuf) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int len = TYPE_LENGTH (type); - int return_register = R0_REGNUM; - int offset; if (len <= 4) { @@ -1318,7 +1324,7 @@ sh_extract_return_value_nofpu (struct type *type, struct regcache *regcache, { int i, regnum = R0_REGNUM; for (i = 0; i < len; i += 4) - regcache_raw_read (regcache, regnum++, (char *) valbuf + i); + regcache->raw_read (regnum++, valbuf + i); } else error (_("bad size for return value")); @@ -1326,19 +1332,19 @@ sh_extract_return_value_nofpu (struct type *type, struct regcache *regcache, static void sh_extract_return_value_fpu (struct type *type, struct regcache *regcache, - void *valbuf) + gdb_byte *valbuf) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); if (sh_treat_as_flt_p (type)) { int len = TYPE_LENGTH (type); int i, regnum = gdbarch_fp0_regnum (gdbarch); for (i = 0; i < len; i += 4) if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) - regcache_raw_read (regcache, regnum++, - (char *) valbuf + len - 4 - i); + regcache->raw_read (regnum++, + valbuf + len - 4 - i); else - regcache_raw_read (regcache, regnum++, (char *) valbuf + i); + regcache->raw_read (regnum++, valbuf + i); } else sh_extract_return_value_nofpu (type, regcache, valbuf); @@ -1352,9 +1358,9 @@ sh_extract_return_value_fpu (struct type *type, struct regcache *regcache, the result is stored in r0, left-justified. */ static void sh_store_return_value_nofpu (struct type *type, struct regcache *regcache, - const void *valbuf) + const gdb_byte *valbuf) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); ULONGEST val; int len = TYPE_LENGTH (type); @@ -1368,35 +1374,37 @@ sh_store_return_value_nofpu (struct type *type, struct regcache *regcache, { int i, regnum = R0_REGNUM; for (i = 0; i < len; i += 4) - regcache_raw_write (regcache, regnum++, (char *) valbuf + i); + regcache->raw_write (regnum++, valbuf + i); } } static void sh_store_return_value_fpu (struct type *type, struct regcache *regcache, - const void *valbuf) + const gdb_byte *valbuf) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); if (sh_treat_as_flt_p (type)) { int len = TYPE_LENGTH (type); int i, regnum = gdbarch_fp0_regnum (gdbarch); for (i = 0; i < len; i += 4) if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) - regcache_raw_write (regcache, regnum++, - (char *) valbuf + len - 4 - i); + regcache->raw_write (regnum++, + valbuf + len - 4 - i); else - regcache_raw_write (regcache, regnum++, (char *) valbuf + i); + regcache->raw_write (regnum++, valbuf + i); } else sh_store_return_value_nofpu (type, regcache, valbuf); } static enum return_value_convention -sh_return_value_nofpu (struct gdbarch *gdbarch, struct type *func_type, +sh_return_value_nofpu (struct gdbarch *gdbarch, struct value *function, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) { + struct type *func_type = function ? value_type (function) : NULL; + if (sh_use_struct_convention_nofpu ( sh_is_renesas_calling_convention (func_type), type)) return RETURN_VALUE_STRUCT_CONVENTION; @@ -1408,10 +1416,12 @@ sh_return_value_nofpu (struct gdbarch *gdbarch, struct type *func_type, } static enum return_value_convention -sh_return_value_fpu (struct gdbarch *gdbarch, struct type *func_type, +sh_return_value_fpu (struct gdbarch *gdbarch, struct value *function, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) { + struct type *func_type = function ? value_type (function) : NULL; + if (sh_use_struct_convention ( sh_is_renesas_calling_convention (func_type), type)) return RETURN_VALUE_STRUCT_CONVENTION; @@ -1422,714 +1432,6 @@ sh_return_value_fpu (struct gdbarch *gdbarch, struct type *func_type, return RETURN_VALUE_REGISTER_CONVENTION; } -/* Print the registers in a form similar to the E7000. */ - -static void -sh_generic_show_regs (struct frame_info *frame) -{ - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum - (get_frame_arch (frame))), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); -} - -static void -sh3_show_regs (struct frame_info *frame) -{ - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum - (get_frame_arch (frame))), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - printf_filtered - (" SSR %08lx SPC %08lx\n", - (long) get_frame_register_unsigned (frame, SSR_REGNUM), - (long) get_frame_register_unsigned (frame, SPC_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); -} - -static void -sh2e_show_regs (struct frame_info *frame) -{ - struct gdbarch *gdbarch = get_frame_arch (frame); - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum (gdbarch)), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - printf_filtered - (" SSR %08lx SPC %08lx FPUL %08lx FPSCR %08lx\n", - (long) get_frame_register_unsigned (frame, SSR_REGNUM), - (long) get_frame_register_unsigned (frame, SPC_REGNUM), - (long) get_frame_register_unsigned (frame, FPUL_REGNUM), - (long) get_frame_register_unsigned (frame, FPSCR_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); - - printf_filtered - ("FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 0), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 1), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 2), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 3), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 4), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 5), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 6), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 7)); - printf_filtered - ("FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 8), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 9), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 10), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 11), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 12), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 13), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 14), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 15)); -} - -static void -sh2a_show_regs (struct frame_info *frame) -{ - struct gdbarch *gdbarch = get_frame_arch (frame); - int pr = get_frame_register_unsigned (frame, FPSCR_REGNUM) & 0x80000; - - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum (gdbarch)), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx TBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, TBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - printf_filtered - (" SSR %08lx SPC %08lx FPUL %08lx FPSCR %08lx\n", - (long) get_frame_register_unsigned (frame, SSR_REGNUM), - (long) get_frame_register_unsigned (frame, SPC_REGNUM), - (long) get_frame_register_unsigned (frame, FPUL_REGNUM), - (long) get_frame_register_unsigned (frame, FPSCR_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); - - printf_filtered - (pr ? "DR0-DR6 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n" - : "FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 0), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 1), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 2), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 3), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 4), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 5), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 6), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 7)); - printf_filtered - (pr ? "DR8-DR14 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n" - : "FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 8), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 9), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 10), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 11), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 12), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 13), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 14), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 15)); - printf_filtered - ("BANK=%-3d\n", (int) get_frame_register_unsigned (frame, BANK_REGNUM)); - printf_filtered - ("R0b-R7b %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 0), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 1), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 2), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 3), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 4), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 5), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 6), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 7)); - printf_filtered - ("R8b-R14b %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 8), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 9), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 10), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 11), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 12), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 13), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 14)); - printf_filtered - ("MACHb=%08lx IVNb=%08lx PRb=%08lx GBRb=%08lx MACLb=%08lx\n", - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 15), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 16), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 17), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 18), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 19)); -} - -static void -sh2a_nofpu_show_regs (struct frame_info *frame) -{ - int pr = get_frame_register_unsigned (frame, FPSCR_REGNUM) & 0x80000; - - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum - (get_frame_arch (frame))), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx TBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, TBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - printf_filtered - (" SSR %08lx SPC %08lx FPUL %08lx FPSCR %08lx\n", - (long) get_frame_register_unsigned (frame, SSR_REGNUM), - (long) get_frame_register_unsigned (frame, SPC_REGNUM), - (long) get_frame_register_unsigned (frame, FPUL_REGNUM), - (long) get_frame_register_unsigned (frame, FPSCR_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); - - printf_filtered - ("BANK=%-3d\n", (int) get_frame_register_unsigned (frame, BANK_REGNUM)); - printf_filtered - ("R0b-R7b %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 0), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 1), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 2), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 3), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 4), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 5), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 6), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 7)); - printf_filtered - ("R8b-R14b %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 8), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 9), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 10), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 11), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 12), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 13), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 14)); - printf_filtered - ("MACHb=%08lx IVNb=%08lx PRb=%08lx GBRb=%08lx MACLb=%08lx\n", - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 15), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 16), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 17), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 18), - (long) get_frame_register_unsigned (frame, R0_BANK0_REGNUM + 19)); -} - -static void -sh3e_show_regs (struct frame_info *frame) -{ - struct gdbarch *gdbarch = get_frame_arch (frame); - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum (gdbarch)), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - printf_filtered - (" SSR %08lx SPC %08lx FPUL %08lx FPSCR %08lx\n", - (long) get_frame_register_unsigned (frame, SSR_REGNUM), - (long) get_frame_register_unsigned (frame, SPC_REGNUM), - (long) get_frame_register_unsigned (frame, FPUL_REGNUM), - (long) get_frame_register_unsigned (frame, FPSCR_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); - - printf_filtered - ("FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 0), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 1), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 2), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 3), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 4), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 5), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 6), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 7)); - printf_filtered - ("FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 8), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 9), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 10), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 11), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 12), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 13), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 14), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 15)); -} - -static void -sh3_dsp_show_regs (struct frame_info *frame) -{ - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum - (get_frame_arch (frame))), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - - printf_filtered - (" SSR %08lx SPC %08lx DSR %08lx\n", - (long) get_frame_register_unsigned (frame, SSR_REGNUM), - (long) get_frame_register_unsigned (frame, SPC_REGNUM), - (long) get_frame_register_unsigned (frame, DSR_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); - - printf_filtered - ("A0G=%02lx A0=%08lx M0=%08lx X0=%08lx Y0=%08lx RS=%08lx MOD=%08lx\n", - (long) get_frame_register_unsigned (frame, A0G_REGNUM) & 0xff, - (long) get_frame_register_unsigned (frame, A0_REGNUM), - (long) get_frame_register_unsigned (frame, M0_REGNUM), - (long) get_frame_register_unsigned (frame, X0_REGNUM), - (long) get_frame_register_unsigned (frame, Y0_REGNUM), - (long) get_frame_register_unsigned (frame, RS_REGNUM), - (long) get_frame_register_unsigned (frame, MOD_REGNUM)); - printf_filtered - ("A1G=%02lx A1=%08lx M1=%08lx X1=%08lx Y1=%08lx RE=%08lx\n", - (long) get_frame_register_unsigned (frame, A1G_REGNUM) & 0xff, - (long) get_frame_register_unsigned (frame, A1_REGNUM), - (long) get_frame_register_unsigned (frame, M1_REGNUM), - (long) get_frame_register_unsigned (frame, X1_REGNUM), - (long) get_frame_register_unsigned (frame, Y1_REGNUM), - (long) get_frame_register_unsigned (frame, RE_REGNUM)); -} - -static void -sh4_show_regs (struct frame_info *frame) -{ - struct gdbarch *gdbarch = get_frame_arch (frame); - int pr = get_frame_register_unsigned (frame, FPSCR_REGNUM) & 0x80000; - - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum (gdbarch)), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - printf_filtered - (" SSR %08lx SPC %08lx FPUL %08lx FPSCR %08lx\n", - (long) get_frame_register_unsigned (frame, SSR_REGNUM), - (long) get_frame_register_unsigned (frame, SPC_REGNUM), - (long) get_frame_register_unsigned (frame, FPUL_REGNUM), - (long) get_frame_register_unsigned (frame, FPSCR_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); - - printf_filtered - (pr ? "DR0-DR6 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n" - : "FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 0), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 1), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 2), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 3), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 4), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 5), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 6), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 7)); - printf_filtered - (pr ? "DR8-DR14 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n" - : "FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 8), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 9), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 10), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 11), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 12), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 13), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 14), - (long) get_frame_register_unsigned - (frame, gdbarch_fp0_regnum (gdbarch) + 15)); -} - -static void -sh4_nofpu_show_regs (struct frame_info *frame) -{ - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum - (get_frame_arch (frame))), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - printf_filtered - (" SSR %08lx SPC %08lx FPUL %08lx FPSCR %08lx\n", - (long) get_frame_register_unsigned (frame, SSR_REGNUM), - (long) get_frame_register_unsigned (frame, SPC_REGNUM), - (long) get_frame_register_unsigned (frame, FPUL_REGNUM), - (long) get_frame_register_unsigned (frame, FPSCR_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); -} - -static void -sh_dsp_show_regs (struct frame_info *frame) -{ - printf_filtered - (" PC %s SR %08lx PR %08lx MACH %08lx\n", - phex (get_frame_register_unsigned (frame, - gdbarch_pc_regnum - (get_frame_arch (frame))), 4), - (long) get_frame_register_unsigned (frame, SR_REGNUM), - (long) get_frame_register_unsigned (frame, PR_REGNUM), - (long) get_frame_register_unsigned (frame, MACH_REGNUM)); - - printf_filtered - (" GBR %08lx VBR %08lx DSR %08lx MACL %08lx\n", - (long) get_frame_register_unsigned (frame, GBR_REGNUM), - (long) get_frame_register_unsigned (frame, VBR_REGNUM), - (long) get_frame_register_unsigned (frame, DSR_REGNUM), - (long) get_frame_register_unsigned (frame, MACL_REGNUM)); - - printf_filtered - ("R0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 0), - (long) get_frame_register_unsigned (frame, 1), - (long) get_frame_register_unsigned (frame, 2), - (long) get_frame_register_unsigned (frame, 3), - (long) get_frame_register_unsigned (frame, 4), - (long) get_frame_register_unsigned (frame, 5), - (long) get_frame_register_unsigned (frame, 6), - (long) get_frame_register_unsigned (frame, 7)); - printf_filtered - ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - (long) get_frame_register_unsigned (frame, 8), - (long) get_frame_register_unsigned (frame, 9), - (long) get_frame_register_unsigned (frame, 10), - (long) get_frame_register_unsigned (frame, 11), - (long) get_frame_register_unsigned (frame, 12), - (long) get_frame_register_unsigned (frame, 13), - (long) get_frame_register_unsigned (frame, 14), - (long) get_frame_register_unsigned (frame, 15)); - - printf_filtered - ("A0G=%02lx A0=%08lx M0=%08lx X0=%08lx Y0=%08lx RS=%08lx MOD=%08lx\n", - (long) get_frame_register_unsigned (frame, A0G_REGNUM) & 0xff, - (long) get_frame_register_unsigned (frame, A0_REGNUM), - (long) get_frame_register_unsigned (frame, M0_REGNUM), - (long) get_frame_register_unsigned (frame, X0_REGNUM), - (long) get_frame_register_unsigned (frame, Y0_REGNUM), - (long) get_frame_register_unsigned (frame, RS_REGNUM), - (long) get_frame_register_unsigned (frame, MOD_REGNUM)); - printf_filtered ("A1G=%02lx A1=%08lx M1=%08lx X1=%08lx Y1=%08lx RE=%08lx\n", - (long) get_frame_register_unsigned (frame, A1G_REGNUM) & 0xff, - (long) get_frame_register_unsigned (frame, A1_REGNUM), - (long) get_frame_register_unsigned (frame, M1_REGNUM), - (long) get_frame_register_unsigned (frame, X1_REGNUM), - (long) get_frame_register_unsigned (frame, Y1_REGNUM), - (long) get_frame_register_unsigned (frame, RE_REGNUM)); -} - -static void -sh_show_regs_command (char *args, int from_tty) -{ - if (sh_show_regs) - (*sh_show_regs) (get_current_frame ()); -} - static struct type * sh_sh2a_register_type (struct gdbarch *gdbarch, int reg_nr) { @@ -2224,16 +1526,16 @@ sh_register_reggroup_p (struct gdbarch *gdbarch, int regnum, /* On the sh4, the DRi pseudo registers are problematic if the target is little endian. When the user writes one of those registers, for - instance with 'ser var $dr0=1', we want the double to be stored + instance with 'set var $dr0=1', we want the double to be stored like this: - fr0 = 0x00 0x00 0x00 0x00 0x00 0xf0 0x3f - fr1 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + fr0 = 0x00 0x00 0xf0 0x3f + fr1 = 0x00 0x00 0x00 0x00 This corresponds to little endian byte order & big endian word order. However if we let gdb write the register w/o conversion, it will write fr0 and fr1 this way: - fr0 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 - fr1 = 0x00 0x00 0x00 0x00 0x00 0xf0 0x3f + fr0 = 0x00 0x00 0x00 0x00 + fr1 = 0x00 0x00 0xf0 0x3f because it will consider fr0 and fr1 as a single LE stretch of memory. To achieve what we want we must force gdb to store things in @@ -2242,38 +1544,58 @@ sh_register_reggroup_p (struct gdbarch *gdbarch, int regnum, In case the target is big endian, there is no problem, the raw bytes will look like: - fr0 = 0x3f 0xf0 0x00 0x00 0x00 0x00 0x00 - fr1 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + fr0 = 0x3f 0xf0 0x00 0x00 + fr1 = 0x00 0x00 0x00 0x00 The other pseudo registers (the FVs) also don't pose a problem because they are stored as 4 individual FP elements. */ +static struct type * +sh_littlebyte_bigword_type (struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (tdep->sh_littlebyte_bigword_type == NULL) + tdep->sh_littlebyte_bigword_type + = arch_float_type (gdbarch, -1, "builtin_type_sh_littlebyte_bigword", + floatformats_ieee_double_littlebyte_bigword); + + return tdep->sh_littlebyte_bigword_type; +} + static void -sh_register_convert_to_virtual (int regnum, struct type *type, - char *from, char *to) +sh_register_convert_to_virtual (struct gdbarch *gdbarch, int regnum, + struct type *type, gdb_byte *from, gdb_byte *to) { - if (regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM) + if (gdbarch_byte_order (gdbarch) != BFD_ENDIAN_LITTLE) { - DOUBLEST val; - floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, - from, &val); - store_typed_floating (to, type, val); + /* It is a no-op. */ + memcpy (to, from, register_size (gdbarch, regnum)); + return; } + + if (regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM) + target_float_convert (from, sh_littlebyte_bigword_type (gdbarch), + to, type); else error ("sh_register_convert_to_virtual called with non DR register number"); } static void -sh_register_convert_to_raw (struct type *type, int regnum, - const void *from, void *to) +sh_register_convert_to_raw (struct gdbarch *gdbarch, struct type *type, + int regnum, const gdb_byte *from, gdb_byte *to) { - if (regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM) + if (gdbarch_byte_order (gdbarch) != BFD_ENDIAN_LITTLE) { - DOUBLEST val = extract_typed_floating (from, type); - floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, - &val, to); + /* It is a no-op. */ + memcpy (to, from, register_size (gdbarch, regnum)); + return; } + + if (regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM) + target_float_convert (from, type, + to, sh_littlebyte_bigword_type (gdbarch)); else error (_("sh_register_convert_to_raw called with non DR register number")); } @@ -2305,7 +1627,7 @@ dr_reg_base_num (struct gdbarch *gdbarch, int dr_regnum) static enum register_status pseudo_register_read_portions (struct gdbarch *gdbarch, - struct regcache *regcache, + readable_regcache *regcache, int portions, int base_regnum, gdb_byte *buffer) { @@ -2317,7 +1639,7 @@ pseudo_register_read_portions (struct gdbarch *gdbarch, gdb_byte *b; b = buffer + register_size (gdbarch, base_regnum) * portion; - status = regcache_raw_read (regcache, base_regnum + portion, b); + status = regcache->raw_read (base_regnum + portion, b); if (status != REG_VALID) return status; } @@ -2326,17 +1648,18 @@ pseudo_register_read_portions (struct gdbarch *gdbarch, } static enum register_status -sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, +sh_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache, int reg_nr, gdb_byte *buffer) { int base_regnum; - char temp_buffer[MAX_REGISTER_SIZE]; enum register_status status; if (reg_nr == PSEUDO_BANK_REGNUM) - return regcache_raw_read (regcache, BANK_REGNUM, buffer); + return regcache->raw_read (BANK_REGNUM, buffer); else if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) { + /* Enough space for two float registers. */ + gdb_byte temp_buffer[4 * 2]; base_regnum = dr_reg_base_num (gdbarch, reg_nr); /* Build the value in the provided buffer. */ @@ -2346,7 +1669,7 @@ sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, if (status == REG_VALID) { /* We must pay attention to the endiannes. */ - sh_register_convert_to_virtual (reg_nr, + sh_register_convert_to_virtual (gdbarch, reg_nr, register_type (gdbarch, reg_nr), temp_buffer, buffer); } @@ -2369,7 +1692,6 @@ sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, int reg_nr, const gdb_byte *buffer) { int base_regnum, portion; - char temp_buffer[MAX_REGISTER_SIZE]; if (reg_nr == PSEUDO_BANK_REGNUM) { @@ -2379,21 +1701,23 @@ sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, so that a re-read happens next time it's necessary. */ int bregnum; - regcache_raw_write (regcache, BANK_REGNUM, buffer); + regcache->raw_write (BANK_REGNUM, buffer); for (bregnum = R0_BANK0_REGNUM; bregnum < MACLB_REGNUM; ++bregnum) - regcache_invalidate (regcache, bregnum); + regcache->invalidate (bregnum); } else if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) { + /* Enough space for two float registers. */ + gdb_byte temp_buffer[4 * 2]; base_regnum = dr_reg_base_num (gdbarch, reg_nr); /* We must pay attention to the endiannes. */ - sh_register_convert_to_raw (register_type (gdbarch, reg_nr), + sh_register_convert_to_raw (gdbarch, register_type (gdbarch, reg_nr), reg_nr, buffer, temp_buffer); /* Write the real regs for which this one is an alias. */ for (portion = 0; portion < 2; portion++) - regcache_raw_write (regcache, base_regnum + portion, + regcache->raw_write (base_regnum + portion, (temp_buffer + register_size (gdbarch, base_regnum) * portion)); @@ -2404,8 +1728,8 @@ sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, /* Write the real regs for which this one is an alias. */ for (portion = 0; portion < 4; portion++) - regcache_raw_write (regcache, base_regnum + portion, - ((char *) buffer + regcache->raw_write (base_regnum + portion, + (buffer + register_size (gdbarch, base_regnum) * portion)); } @@ -2546,7 +1870,7 @@ sh_frame_cache (struct frame_info *this_frame, void **this_cache) int i; if (*this_cache) - return *this_cache; + return (struct sh_frame_cache *) *this_cache; cache = sh_alloc_frame_cache (); *this_cache = cache; @@ -2565,7 +1889,16 @@ sh_frame_cache (struct frame_info *this_frame, void **this_cache) if (cache->pc != 0) { ULONGEST fpscr; - fpscr = get_frame_register_unsigned (this_frame, FPSCR_REGNUM); + + /* Check for the existence of the FPSCR register. If it exists, + fetch its value for use in prologue analysis. Passing a zero + value is the best choice for architecture variants upon which + there's no FPSCR register. */ + if (gdbarch_register_reggroup_p (gdbarch, FPSCR_REGNUM, all_reggroup)) + fpscr = get_frame_register_unsigned (this_frame, FPSCR_REGNUM); + else + fpscr = 0; + sh_analyze_prologue (gdbarch, cache->pc, current_pc, cache, fpscr); } @@ -2635,6 +1968,7 @@ sh_frame_this_id (struct frame_info *this_frame, void **this_cache, static const struct frame_unwind sh_frame_unwind = { NORMAL_FRAME, + default_frame_unwind_stop_reason, sh_frame_this_id, sh_frame_prev_register, NULL, @@ -2678,11 +2012,65 @@ static const struct frame_base sh_frame_base = { sh_frame_base_address }; -/* The epilogue is defined here as the area at the end of a function, +static struct sh_frame_cache * +sh_make_stub_cache (struct frame_info *this_frame) +{ + struct gdbarch *gdbarch = get_frame_arch (this_frame); + struct sh_frame_cache *cache; + + cache = sh_alloc_frame_cache (); + + cache->saved_sp + = get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch)); + + return cache; +} + +static void +sh_stub_this_id (struct frame_info *this_frame, void **this_cache, + struct frame_id *this_id) +{ + struct sh_frame_cache *cache; + + if (*this_cache == NULL) + *this_cache = sh_make_stub_cache (this_frame); + cache = (struct sh_frame_cache *) *this_cache; + + *this_id = frame_id_build (cache->saved_sp, get_frame_pc (this_frame)); +} + +static int +sh_stub_unwind_sniffer (const struct frame_unwind *self, + struct frame_info *this_frame, + void **this_prologue_cache) +{ + CORE_ADDR addr_in_block; + + addr_in_block = get_frame_address_in_block (this_frame); + if (in_plt_section (addr_in_block)) + return 1; + + return 0; +} + +static const struct frame_unwind sh_stub_unwind = +{ + NORMAL_FRAME, + default_frame_unwind_stop_reason, + sh_stub_this_id, + sh_frame_prev_register, + NULL, + sh_stub_unwind_sniffer +}; + +/* Implement the stack_frame_destroyed_p gdbarch method. + + The epilogue is defined here as the area at the end of a function, either on the `ret' instruction itself or after an instruction which destroys the function's stack frame. */ + static int -sh_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc) +sh_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR func_addr = 0, func_end = 0; @@ -2776,7 +2164,7 @@ sh_corefile_supply_regset (const struct regset *regset, struct regcache *regcache, int regnum, const void *regs, size_t len) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); const struct sh_corefile_regmap *regmap = (regset == &sh_corefile_gregset ? tdep->core_gregmap @@ -2787,8 +2175,8 @@ sh_corefile_supply_regset (const struct regset *regset, { if ((regnum == -1 || regnum == regmap[i].regnum) && regmap[i].offset + 4 <= len) - regcache_raw_supply (regcache, regmap[i].regnum, - (char *)regs + regmap[i].offset); + regcache->raw_supply + (regmap[i].regnum, (char *) regs + regmap[i].offset); } } @@ -2802,7 +2190,7 @@ sh_corefile_collect_regset (const struct regset *regset, const struct regcache *regcache, int regnum, void *regs, size_t len) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); const struct sh_corefile_regmap *regmap = (regset == &sh_corefile_gregset ? tdep->core_gregmap @@ -2813,7 +2201,7 @@ sh_corefile_collect_regset (const struct regset *regset, { if ((regnum == -1 || regnum == regmap[i].regnum) && regmap[i].offset + 4 <= len) - regcache_raw_collect (regcache, regmap[i].regnum, + regcache->raw_collect (regmap[i].regnum, (char *)regs + regmap[i].offset); } } @@ -2821,34 +2209,47 @@ sh_corefile_collect_regset (const struct regset *regset, /* The following two regsets have the same contents, so it is tempting to unify them, but they are distiguished by their address, so don't. */ -struct regset sh_corefile_gregset = +const struct regset sh_corefile_gregset = { NULL, sh_corefile_supply_regset, sh_corefile_collect_regset }; -static struct regset sh_corefile_fpregset = +static const struct regset sh_corefile_fpregset = { NULL, sh_corefile_supply_regset, sh_corefile_collect_regset }; -static const struct regset * -sh_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, - size_t sect_size) +static void +sh_iterate_over_regset_sections (struct gdbarch *gdbarch, + iterate_over_regset_sections_cb *cb, + void *cb_data, + const struct regcache *regcache) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - if (tdep->core_gregmap && strcmp (sect_name, ".reg") == 0) - return &sh_corefile_gregset; + if (tdep->core_gregmap != NULL) + cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, + &sh_corefile_gregset, NULL, cb_data); - if (tdep->core_fpregmap && strcmp (sect_name, ".reg2") == 0) - return &sh_corefile_fpregset; + if (tdep->core_fpregmap != NULL) + cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, + &sh_corefile_fpregset, NULL, cb_data); +} - return NULL; +/* This is the implementation of gdbarch method + return_in_first_hidden_param_p. */ + +static int +sh_return_in_first_hidden_param_p (struct gdbarch *gdbarch, + struct type *type) +{ + return 0; } + static struct gdbarch * @@ -2857,57 +2258,6 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) struct gdbarch *gdbarch; struct gdbarch_tdep *tdep; - sh_show_regs = sh_generic_show_regs; - switch (info.bfd_arch_info->mach) - { - case bfd_mach_sh2e: - sh_show_regs = sh2e_show_regs; - break; - case bfd_mach_sh2a: - sh_show_regs = sh2a_show_regs; - break; - case bfd_mach_sh2a_nofpu: - sh_show_regs = sh2a_nofpu_show_regs; - break; - case bfd_mach_sh_dsp: - sh_show_regs = sh_dsp_show_regs; - break; - - case bfd_mach_sh3: - case bfd_mach_sh3_nommu: - case bfd_mach_sh2a_nofpu_or_sh3_nommu: - sh_show_regs = sh3_show_regs; - break; - - case bfd_mach_sh3e: - case bfd_mach_sh2a_or_sh3e: - sh_show_regs = sh3e_show_regs; - break; - - case bfd_mach_sh3_dsp: - case bfd_mach_sh4al_dsp: - sh_show_regs = sh3_dsp_show_regs; - break; - - case bfd_mach_sh4: - case bfd_mach_sh4a: - case bfd_mach_sh2a_or_sh4: - sh_show_regs = sh4_show_regs; - break; - - case bfd_mach_sh4_nofpu: - case bfd_mach_sh4_nommu_nofpu: - case bfd_mach_sh4a_nofpu: - case bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu: - sh_show_regs = sh4_nofpu_show_regs; - break; - - case bfd_mach_sh5: - sh_show_regs = sh64_show_regs; - /* SH5 is handled entirely in sh64-tdep.c. */ - return sh64_gdbarch_init (info, arches); - } - /* If there is already a candidate, use it. */ arches = gdbarch_list_lookup_by_info (arches, &info); if (arches != NULL) @@ -2915,13 +2265,17 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* None found, create a new architecture from the information provided. */ - tdep = XZALLOC (struct gdbarch_tdep); + tdep = XCNEW (struct gdbarch_tdep); gdbarch = gdbarch_alloc (&info, tdep); set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT); set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT); set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT); set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT); + + set_gdbarch_wchar_bit (gdbarch, 2 * TARGET_CHAR_BIT); + set_gdbarch_wchar_signed (gdbarch, 0); + set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT); set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT); set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT); @@ -2936,9 +2290,9 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_register_type (gdbarch, sh_default_register_type); set_gdbarch_register_reggroup_p (gdbarch, sh_register_reggroup_p); - set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, sh_breakpoint_kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, sh_sw_breakpoint_from_kind); - set_gdbarch_print_insn (gdbarch, print_insn_sh); set_gdbarch_register_sim_regno (gdbarch, legacy_register_sim_regno); set_gdbarch_return_value (gdbarch, sh_return_value_nofpu); @@ -2947,6 +2301,8 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call_nofpu); + set_gdbarch_return_in_first_hidden_param_p (gdbarch, + sh_return_in_first_hidden_param_p); set_gdbarch_believe_pcc_promotion (gdbarch, 1); @@ -2956,11 +2312,12 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_dummy_id (gdbarch, sh_dummy_id); frame_base_set_default (gdbarch, &sh_frame_base); - set_gdbarch_in_function_epilogue_p (gdbarch, sh_in_function_epilogue_p); + set_gdbarch_stack_frame_destroyed_p (gdbarch, sh_stack_frame_destroyed_p); dwarf2_frame_set_init_reg (gdbarch, sh_dwarf2_frame_init_reg); - set_gdbarch_regset_from_core_section (gdbarch, sh_regset_from_core_section); + set_gdbarch_iterate_over_regset_sections + (gdbarch, sh_iterate_over_regset_sections); switch (info.bfd_arch_info->mach) { @@ -2975,6 +2332,7 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) case bfd_mach_sh2e: /* doubles on sh2e and sh3e are actually 4 byte. */ set_gdbarch_double_bit (gdbarch, 4 * TARGET_CHAR_BIT); + set_gdbarch_double_format (gdbarch, floatformats_ieee_single); set_gdbarch_register_name (gdbarch, sh_sh2e_register_name); set_gdbarch_register_type (gdbarch, sh_sh3e_register_type); @@ -3020,6 +2378,7 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) case bfd_mach_sh2a_or_sh3e: /* doubles on sh2e and sh3e are actually 4 byte. */ set_gdbarch_double_bit (gdbarch, 4 * TARGET_CHAR_BIT); + set_gdbarch_double_format (gdbarch, floatformats_ieee_single); set_gdbarch_register_name (gdbarch, sh_sh3e_register_name); set_gdbarch_register_type (gdbarch, sh_sh3e_register_type); @@ -3067,36 +2426,31 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) gdbarch_init_osabi (info, gdbarch); dwarf2_append_unwinders (gdbarch); + frame_unwind_append_unwinder (gdbarch, &sh_stub_unwind); frame_unwind_append_unwinder (gdbarch, &sh_frame_unwind); return gdbarch; } static void -show_sh_command (char *args, int from_tty) +show_sh_command (const char *args, int from_tty) { help_list (showshcmdlist, "show sh ", all_commands, gdb_stdout); } static void -set_sh_command (char *args, int from_tty) +set_sh_command (const char *args, int from_tty) { printf_unfiltered ("\"set sh\" must be followed by an appropriate subcommand.\n"); help_list (setshcmdlist, "set sh ", all_commands, gdb_stdout); } -extern initialize_file_ftype _initialize_sh_tdep; /* -Wmissing-prototypes */ - void _initialize_sh_tdep (void) { - struct cmd_list_element *c; - gdbarch_register (bfd_arch_sh, sh_gdbarch_init, NULL); - add_com ("regs", class_vars, sh_show_regs_command, _("Print all registers")); - add_prefix_cmd ("sh", no_class, set_sh_command, "SH specific commands.", &setshcmdlist, "set sh ", 0, &setlist); add_prefix_cmd ("sh", no_class, show_sh_command, "SH specific commands.",