X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcris-tdep.c;h=5fa79ef2cfa49bd91d93cf3d10440b148683647b;hb=24b9144d4ba83d37751786b08b48ad62fb7aef26;hp=88a64411176300415f97f79b7fac52ebb4df59c4;hpb=8d7493201cf01c9836403695f67f7e157341bfd5;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c index 88a6441117..5fa79ef2cf 100644 --- a/gdb/cris-tdep.c +++ b/gdb/cris-tdep.c @@ -1,6 +1,6 @@ /* Target dependent code for CRIS, for GDB, the GNU debugger. - Copyright (C) 2001-2015 Free Software Foundation, Inc. + Copyright (C) 2001-2018 Free Software Foundation, Inc. Contributed by Axis Communications AB. Written by Hendrik Ruijter, Stefan Andersson, and Orjan Friberg. @@ -320,7 +320,7 @@ cris_sigtramp_frame_unwind_cache (struct frame_info *this_frame, int i; if ((*this_cache)) - return (*this_cache); + return (struct cris_unwind_cache *) (*this_cache); info = FRAME_OBSTACK_ZALLOC (struct cris_unwind_cache); (*this_cache) = info; @@ -485,7 +485,7 @@ struct instruction_environment int delay_slot_pc_active; int xflag_found; int disable_interrupt; - int byte_order; + enum bfd_endian byte_order; } inst_env_type; /* Machine-dependencies in CRIS for opcodes. */ @@ -634,13 +634,13 @@ static struct gdbarch *cris_gdbarch_init (struct gdbarch_info, static void cris_dump_tdep (struct gdbarch *, struct ui_file *); -static void set_cris_version (char *ignore_args, int from_tty, +static void set_cris_version (const char *ignore_args, int from_tty, struct cmd_list_element *c); -static void set_cris_mode (char *ignore_args, int from_tty, +static void set_cris_mode (const char *ignore_args, int from_tty, struct cmd_list_element *c); -static void set_cris_dwarf2_cfi (char *ignore_args, int from_tty, +static void set_cris_dwarf2_cfi (const char *ignore_args, int from_tty, struct cmd_list_element *c); static CORE_ADDR cris_scan_prologue (CORE_ADDR pc, @@ -665,14 +665,14 @@ struct stack_item { int len; struct stack_item *prev; - void *data; + gdb_byte *data; }; static struct stack_item * push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len) { struct stack_item *si = XNEW (struct stack_item); - si->data = xmalloc (len); + si->data = (gdb_byte *) xmalloc (len); si->len = len; si->prev = prev; memcpy (si->data, contents, len); @@ -704,7 +704,7 @@ cris_frame_unwind_cache (struct frame_info *this_frame, struct cris_unwind_cache *info; if ((*this_prologue_cache)) - return (*this_prologue_cache); + return (struct cris_unwind_cache *) (*this_prologue_cache); info = FRAME_OBSTACK_ZALLOC (struct cris_unwind_cache); (*this_prologue_cache) = info; @@ -811,16 +811,9 @@ cris_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int struct_return, CORE_ADDR struct_addr) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - int stack_offset; int argreg; int argnum; - /* The function's arguments and memory allocated by gdb for the arguments to - point at reside in separate areas on the stack. - Both frame pointers grow toward higher addresses. */ - CORE_ADDR fp_arg; - CORE_ADDR fp_mem; - struct stack_item *si = NULL; /* Push the return address. */ @@ -837,7 +830,6 @@ cris_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Now load as many as possible of the first arguments into registers, and push the rest onto the stack. */ argreg = ARG1_REGNUM; - stack_offset = 0; for (argnum = 0; argnum < nargs; argnum++) { @@ -1041,9 +1033,6 @@ cris_scan_prologue (CORE_ADDR pc, struct frame_info *this_frame, unsigned short insn_next; int regno; - /* Is there a push fp? */ - int have_fp; - /* Number of byte on stack used for local variables and movem. */ int val; @@ -1402,20 +1391,24 @@ cris_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame) return sp; } -/* Use the program counter to determine the contents and size of a breakpoint - instruction. It returns a pointer to a string of bytes that encode a - breakpoint instruction, stores the length of the string to *lenptr, and - adjusts pcptr (if necessary) to point to the actual memory location where - the breakpoint should be inserted. */ +/* Implement the breakpoint_kind_from_pc gdbarch method. */ + +static int +cris_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr) +{ + return 2; +} + +/* Implement the sw_breakpoint_from_kind gdbarch method. */ -static const unsigned char * -cris_breakpoint_from_pc (struct gdbarch *gdbarch, - CORE_ADDR *pcptr, int *lenptr) +static const gdb_byte * +cris_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); static unsigned char break8_insn[] = {0x38, 0xe9}; static unsigned char break15_insn[] = {0x3f, 0xe9}; - *lenptr = 2; + + *size = kind; if (tdep->cris_mode == cris_mode_guru) return break15_insn; @@ -1441,19 +1434,19 @@ cris_spec_reg_applicable (struct gdbarch *gdbarch, /* Indeterminate/obsolete. */ return 0; case cris_ver_v0_3: - return (version >= 0 && version <= 3); + return in_inclusive_range (version, 0U, 3U); case cris_ver_v3p: return (version >= 3); case cris_ver_v8: - return (version == 8 || version == 9); + return in_inclusive_range (version, 8U, 9U); case cris_ver_v8p: return (version >= 8); case cris_ver_v0_10: - return (version >= 0 && version <= 10); + return in_inclusive_range (version, 0U, 10U); case cris_ver_v3_10: - return (version >= 3 && version <= 10); + return in_inclusive_range (version, 3U, 10U); case cris_ver_v8_10: - return (version >= 8 && version <= 10); + return in_inclusive_range (version, 8U, 10U); case cris_ver_v10: return (version == 10); case cris_ver_v10p: @@ -1472,7 +1465,6 @@ cris_spec_reg_applicable (struct gdbarch *gdbarch, static int cris_register_size (struct gdbarch *gdbarch, int regno) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); int i; int spec_regno; @@ -1651,7 +1643,7 @@ static void cris_store_return_value (struct type *type, struct regcache *regcache, 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); @@ -1703,7 +1695,7 @@ cris_special_register_name (struct gdbarch *gdbarch, int regno) static const char * cris_register_name (struct gdbarch *gdbarch, int regno) { - static char *cris_genreg_names[] = + static const char *cris_genreg_names[] = { "r0", "r1", "r2", "r3", \ "r4", "r5", "r6", "r7", \ "r8", "r9", "r10", "r11", \ @@ -1728,14 +1720,14 @@ cris_register_name (struct gdbarch *gdbarch, int regno) static const char * crisv32_register_name (struct gdbarch *gdbarch, int regno) { - static char *crisv32_genreg_names[] = + static const char *crisv32_genreg_names[] = { "r0", "r1", "r2", "r3", \ "r4", "r5", "r6", "r7", \ "r8", "r9", "r10", "r11", \ "r12", "r13", "sp", "acr" }; - static char *crisv32_sreg_names[] = + static const char *crisv32_sreg_names[] = { "s0", "s1", "s2", "s3", \ "s4", "s5", "s6", "s7", \ "s8", "s9", "s10", "s11", \ @@ -1790,9 +1782,6 @@ cris_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg) if (reg >= 0 && reg < ARRAY_SIZE (cris_dwarf_regmap)) regnum = cris_dwarf_regmap[reg]; - if (regnum == -1) - warning (_("Unmapped DWARF Register #%d encountered."), reg); - return regnum; } @@ -1822,7 +1811,7 @@ static void cris_extract_return_value (struct type *type, struct regcache *regcache, 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); @@ -2000,25 +1989,25 @@ find_cris_op (unsigned short insn, inst_env_type *inst_env) actually an internal error. */ static int -find_step_target (struct frame_info *frame, inst_env_type *inst_env) +find_step_target (struct regcache *regcache, inst_env_type *inst_env) { int i; int offset; unsigned short insn; - struct gdbarch *gdbarch = get_frame_arch (frame); + struct gdbarch *gdbarch = regcache->arch (); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); /* Create a local register image and set the initial state. */ for (i = 0; i < NUM_GENREGS; i++) { inst_env->reg[i] = - (unsigned long) get_frame_register_unsigned (frame, i); + (unsigned long) regcache_raw_get_unsigned (regcache, i); } offset = NUM_GENREGS; for (i = 0; i < NUM_SPECREGS; i++) { inst_env->preg[i] = - (unsigned long) get_frame_register_unsigned (frame, offset + i); + (unsigned long) regcache_raw_get_unsigned (regcache, offset + i); } inst_env->branch_found = 0; inst_env->slot_needed = 0; @@ -2071,16 +2060,16 @@ find_step_target (struct frame_info *frame, inst_env_type *inst_env) digs through the opcodes in order to find all possible targets. Either one ordinary target or two targets for branches may be found. */ -static int -cris_software_single_step (struct frame_info *frame) +static std::vector +cris_software_single_step (struct regcache *regcache) { - struct gdbarch *gdbarch = get_frame_arch (frame); - struct address_space *aspace = get_frame_address_space (frame); + struct gdbarch *gdbarch = regcache->arch (); inst_env_type inst_env; + std::vector next_pcs; /* Analyse the present instruction environment and insert breakpoints. */ - int status = find_step_target (frame, &inst_env); + int status = find_step_target (regcache, &inst_env); if (status == -1) { /* Could not find a target. Things are likely to go downhill @@ -2093,18 +2082,19 @@ cris_software_single_step (struct frame_info *frame) and possibly another one for a branch, jump, etc. */ CORE_ADDR next_pc = (CORE_ADDR) inst_env.reg[gdbarch_pc_regnum (gdbarch)]; - insert_single_step_breakpoint (gdbarch, aspace, next_pc); + + next_pcs.push_back (next_pc); if (inst_env.branch_found && (CORE_ADDR) inst_env.branch_break_address != next_pc) { CORE_ADDR branch_target_address = (CORE_ADDR) inst_env.branch_break_address; - insert_single_step_breakpoint (gdbarch, - aspace, branch_target_address); + + next_pcs.push_back (branch_target_address); } } - return 1; + return next_pcs; } /* Calculates the prefix value for quick offset addressing mode. */ @@ -3795,22 +3785,6 @@ cris_gdb_func (struct gdbarch *gdbarch, enum cris_op_type op_type, } } -/* This wrapper is to avoid cris_get_assembler being called before - exec_bfd has been set. */ - -static int -cris_delayed_get_disassembler (bfd_vma addr, struct disassemble_info *info) -{ - int (*print_insn) (bfd_vma addr, struct disassemble_info *info); - /* FIXME: cagney/2003-08-27: It should be possible to select a CRIS - disassembler, even when there is no BFD. Does something like - "gdb; target remote; disassmeble *0x123" work? */ - gdb_assert (exec_bfd != NULL); - print_insn = cris_get_disassembler (exec_bfd); - gdb_assert (print_insn != NULL); - return print_insn (addr, info); -} - /* Originally from . */ typedef unsigned char cris_elf_greg_t[4]; @@ -3826,7 +3800,7 @@ typedef cris_elf_greg_t crisv32_elf_gregset_t[CRISV32_ELF_NGREG]; static void cris_supply_gregset (struct regcache *regcache, cris_elf_gregset_t *gregsetp) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); int i; cris_elf_greg_t *regp = *gregsetp; @@ -3892,13 +3866,9 @@ static struct core_fns cris_elf_core_fns = NULL /* next */ }; -extern initialize_file_ftype _initialize_cris_tdep; /* -Wmissing-prototypes */ - void _initialize_cris_tdep (void) { - struct cmd_list_element *c; - gdbarch_register (bfd_arch_cris, cris_gdbarch_init, cris_dump_tdep); /* CRIS-specific user-commands. */ @@ -3956,7 +3926,7 @@ cris_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file) } static void -set_cris_version (char *ignore_args, int from_tty, +set_cris_version (const char *ignore_args, int from_tty, struct cmd_list_element *c) { struct gdbarch_info info; @@ -3971,7 +3941,7 @@ set_cris_version (char *ignore_args, int from_tty, } static void -set_cris_mode (char *ignore_args, int from_tty, +set_cris_mode (const char *ignore_args, int from_tty, struct cmd_list_element *c) { struct gdbarch_info info; @@ -3984,7 +3954,7 @@ set_cris_mode (char *ignore_args, int from_tty, } static void -set_cris_dwarf2_cfi (char *ignore_args, int from_tty, +set_cris_dwarf2_cfi (const char *ignore_args, int from_tty, struct cmd_list_element *c) { struct gdbarch_info info; @@ -4036,32 +4006,15 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) } /* No matching architecture was found. Create a new one. */ - tdep = XNEW (struct gdbarch_tdep); + tdep = XCNEW (struct gdbarch_tdep); + info.byte_order = BFD_ENDIAN_LITTLE; gdbarch = gdbarch_alloc (&info, tdep); tdep->cris_version = usr_cmd_cris_version; tdep->cris_mode = usr_cmd_cris_mode; tdep->cris_dwarf2_cfi = usr_cmd_cris_dwarf2_cfi; - /* INIT shall ensure that the INFO.BYTE_ORDER is non-zero. */ - switch (info.byte_order) - { - case BFD_ENDIAN_LITTLE: - /* Ok. */ - break; - - case BFD_ENDIAN_BIG: - internal_error (__FILE__, __LINE__, - _("cris_gdbarch_init: big endian byte order in info")); - break; - - default: - internal_error (__FILE__, __LINE__, - _("cris_gdbarch_init: unknown byte order in info")); - } - set_gdbarch_return_value (gdbarch, cris_return_value); - set_gdbarch_sp_regnum (gdbarch, 14); /* Length of ordinary registers used in push_word and a few other @@ -4086,9 +4039,7 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) case 8: case 9: /* Old versions; not supported. */ - internal_error (__FILE__, __LINE__, - _("cris_gdbarch_init: unsupported CRIS version")); - break; + return 0; case 10: case 11: @@ -4128,8 +4079,8 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) break; default: - internal_error (__FILE__, __LINE__, - _("cris_gdbarch_init: unknown CRIS version")); + /* Unknown version. */ + return 0; } /* Dummy frame functions (shared between CRISv10 and CRISv32 since they @@ -4142,7 +4093,8 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* The stack grows downward. */ set_gdbarch_inner_than (gdbarch, core_addr_lessthan); - set_gdbarch_breakpoint_from_pc (gdbarch, cris_breakpoint_from_pc); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, cris_breakpoint_kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, cris_sw_breakpoint_from_kind); set_gdbarch_unwind_pc (gdbarch, cris_unwind_pc); set_gdbarch_unwind_sp (gdbarch, cris_unwind_sp); @@ -4167,10 +4119,5 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Hook in ABI-specific overrides, if they have been registered. */ gdbarch_init_osabi (info, gdbarch); - /* FIXME: cagney/2003-08-27: It should be possible to select a CRIS - disassembler, even when there is no BFD. Does something like - "gdb; target remote; disassmeble *0x123" work? */ - set_gdbarch_print_insn (gdbarch, cris_delayed_get_disassembler); - return gdbarch; }