X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fm32c-tdep.c;h=429fecce07859112344580d8aeaa06c0c071779e;hb=abe7c33b45288b407e6d001aad713183d4bab5c6;hp=a147c94f1684bdaa4d900eab02ff5ab45963dcfc;hpb=948f8e3d72fa7047c43a952017ad4a7c9d55ab0d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c index a147c94f16..429fecce07 100644 --- a/gdb/m32c-tdep.c +++ b/gdb/m32c-tdep.c @@ -1,6 +1,6 @@ /* Renesas M32C target-dependent code for GDB, the GNU debugger. - Copyright (C) 2004-2013 Free Software Foundation, Inc. + Copyright (C) 2004-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -18,14 +18,6 @@ along with this program. If not, see . */ #include "defs.h" - -#include - -#if defined (HAVE_STRING_H) -#include -#endif - -#include "gdb_assert.h" #include "elf-bfd.h" #include "elf/m32c.h" #include "gdb/sim-m32c.h" @@ -43,6 +35,7 @@ #include "reggroups.h" #include "prologue-value.h" #include "target.h" +#include "objfiles.h" /* The m32c tdep structure. */ @@ -53,9 +46,13 @@ struct m32c_reg; /* The type of a function that moves the value of REG between CACHE or BUF --- in either direction. */ -typedef enum register_status (m32c_move_reg_t) (struct m32c_reg *reg, +typedef enum register_status (m32c_write_reg_t) (struct m32c_reg *reg, + struct regcache *cache, + const gdb_byte *buf); + +typedef enum register_status (m32c_read_reg_t) (struct m32c_reg *reg, struct regcache *cache, - void *buf); + gdb_byte *buf); struct m32c_reg { @@ -85,7 +82,8 @@ struct m32c_reg /* Functions to read its value from a regcache, and write its value to a regcache. */ - m32c_move_reg_t *read, *write; + m32c_read_reg_t *read; + m32c_write_reg_t *write; /* Data for READ and WRITE functions. The exact meaning depends on the specific functions selected; see the comments for those @@ -194,27 +192,18 @@ make_types (struct gdbarch *arch) this is called, so we avoid using them. */ tdep->voyd = arch_type (arch, TYPE_CODE_VOID, 1, "void"); tdep->ptr_voyd - = arch_type (arch, TYPE_CODE_PTR, gdbarch_ptr_bit (arch) / TARGET_CHAR_BIT, - NULL); - TYPE_TARGET_TYPE (tdep->ptr_voyd) = tdep->voyd; - TYPE_UNSIGNED (tdep->ptr_voyd) = 1; + = arch_pointer_type (arch, gdbarch_ptr_bit (arch), NULL, tdep->voyd); tdep->func_voyd = lookup_function_type (tdep->voyd); xsnprintf (type_name, sizeof (type_name), "%s_data_addr_t", gdbarch_bfd_arch_info (arch)->printable_name); tdep->data_addr_reg_type - = arch_type (arch, TYPE_CODE_PTR, data_addr_reg_bits / TARGET_CHAR_BIT, - xstrdup (type_name)); - TYPE_TARGET_TYPE (tdep->data_addr_reg_type) = tdep->voyd; - TYPE_UNSIGNED (tdep->data_addr_reg_type) = 1; + = arch_pointer_type (arch, data_addr_reg_bits, type_name, tdep->voyd); xsnprintf (type_name, sizeof (type_name), "%s_code_addr_t", gdbarch_bfd_arch_info (arch)->printable_name); tdep->code_addr_reg_type - = arch_type (arch, TYPE_CODE_PTR, code_addr_reg_bits / TARGET_CHAR_BIT, - xstrdup (type_name)); - TYPE_TARGET_TYPE (tdep->code_addr_reg_type) = tdep->func_voyd; - TYPE_UNSIGNED (tdep->code_addr_reg_type) = 1; + = arch_pointer_type (arch, code_addr_reg_bits, type_name, tdep->func_voyd); tdep->uint8 = arch_integer_type (arch, 8, 1, "uint8_t"); tdep->uint16 = arch_integer_type (arch, 16, 1, "uint16_t"); @@ -304,18 +293,24 @@ m32c_register_reggroup_p (struct gdbarch *gdbarch, int regnum, /* Register move functions. We declare them here using - m32c_move_reg_t to check the types. */ -static m32c_move_reg_t m32c_raw_read, m32c_raw_write; -static m32c_move_reg_t m32c_banked_read, m32c_banked_write; -static m32c_move_reg_t m32c_sb_read, m32c_sb_write; -static m32c_move_reg_t m32c_part_read, m32c_part_write; -static m32c_move_reg_t m32c_cat_read, m32c_cat_write; -static m32c_move_reg_t m32c_r3r2r1r0_read, m32c_r3r2r1r0_write; - + m32c_{read,write}_reg_t to check the types. */ +static m32c_read_reg_t m32c_raw_read; +static m32c_read_reg_t m32c_banked_read; +static m32c_read_reg_t m32c_sb_read; +static m32c_read_reg_t m32c_part_read; +static m32c_read_reg_t m32c_cat_read; +static m32c_read_reg_t m32c_r3r2r1r0_read; + +static m32c_write_reg_t m32c_raw_write; +static m32c_write_reg_t m32c_banked_write; +static m32c_write_reg_t m32c_sb_write; +static m32c_write_reg_t m32c_part_write; +static m32c_write_reg_t m32c_cat_write; +static m32c_write_reg_t m32c_r3r2r1r0_write; /* Copy the value of the raw register REG from CACHE to BUF. */ static enum register_status -m32c_raw_read (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_raw_read (struct m32c_reg *reg, struct regcache *cache, gdb_byte *buf) { return regcache_raw_read (cache, reg->num, buf); } @@ -323,9 +318,10 @@ m32c_raw_read (struct m32c_reg *reg, struct regcache *cache, void *buf) /* Copy the value of the raw register REG from BUF to CACHE. */ static enum register_status -m32c_raw_write (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_raw_write (struct m32c_reg *reg, struct regcache *cache, + const gdb_byte *buf) { - regcache_raw_write (cache, reg->num, (const void *) buf); + regcache_raw_write (cache, reg->num, buf); return REG_VALID; } @@ -355,7 +351,7 @@ m32c_banked_register (struct m32c_reg *reg, struct regcache *cache) masked in REG->n set, then read REG->ry. Otherwise, read REG->rx. */ static enum register_status -m32c_banked_read (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_banked_read (struct m32c_reg *reg, struct regcache *cache, gdb_byte *buf) { struct m32c_reg *bank_reg = m32c_banked_register (reg, cache); return regcache_raw_read (cache, bank_reg->num, buf); @@ -367,10 +363,11 @@ m32c_banked_read (struct m32c_reg *reg, struct regcache *cache, void *buf) masked in REG->n set, then write REG->ry. Otherwise, write REG->rx. */ static enum register_status -m32c_banked_write (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_banked_write (struct m32c_reg *reg, struct regcache *cache, + const gdb_byte *buf) { struct m32c_reg *bank_reg = m32c_banked_register (reg, cache); - regcache_raw_write (cache, bank_reg->num, (const void *) buf); + regcache_raw_write (cache, bank_reg->num, buf); return REG_VALID; } @@ -379,7 +376,7 @@ m32c_banked_write (struct m32c_reg *reg, struct regcache *cache, void *buf) /* Move the value of SB from CACHE to BUF. On bfd_mach_m32c, SB is a banked register; on bfd_mach_m16c, it's not. */ static enum register_status -m32c_sb_read (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_sb_read (struct m32c_reg *reg, struct regcache *cache, gdb_byte *buf) { if (gdbarch_bfd_arch_info (reg->arch)->mach == bfd_mach_m16c) return m32c_raw_read (reg->rx, cache, buf); @@ -391,7 +388,7 @@ m32c_sb_read (struct m32c_reg *reg, struct regcache *cache, void *buf) /* Move the value of SB from BUF to CACHE. On bfd_mach_m32c, SB is a banked register; on bfd_mach_m16c, it's not. */ static enum register_status -m32c_sb_write (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_sb_write (struct m32c_reg *reg, struct regcache *cache, const gdb_byte *buf) { if (gdbarch_bfd_arch_info (reg->arch)->mach == bfd_mach_m16c) m32c_raw_write (reg->rx, cache, buf); @@ -444,7 +441,7 @@ m32c_find_part (struct m32c_reg *reg, int *offset_p, int *len_p) REG->type values, where higher indices refer to more significant bits, read the value of the REG->n'th element. */ static enum register_status -m32c_part_read (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_part_read (struct m32c_reg *reg, struct regcache *cache, gdb_byte *buf) { int offset, len; @@ -459,7 +456,8 @@ m32c_part_read (struct m32c_reg *reg, struct regcache *cache, void *buf) values, where higher indices refer to more significant bits, write the value of the REG->n'th element. */ static enum register_status -m32c_part_write (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_part_write (struct m32c_reg *reg, struct regcache *cache, + const gdb_byte *buf) { int offset, len; @@ -474,27 +472,25 @@ m32c_part_write (struct m32c_reg *reg, struct regcache *cache, void *buf) concatenation of the values of the registers REG->rx and REG->ry, with REG->rx contributing the more significant bits. */ static enum register_status -m32c_cat_read (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_cat_read (struct m32c_reg *reg, struct regcache *cache, gdb_byte *buf) { int high_bytes = TYPE_LENGTH (reg->rx->type); int low_bytes = TYPE_LENGTH (reg->ry->type); - /* For address arithmetic. */ - unsigned char *cbuf = buf; enum register_status status; gdb_assert (TYPE_LENGTH (reg->type) == high_bytes + low_bytes); if (gdbarch_byte_order (reg->arch) == BFD_ENDIAN_BIG) { - status = regcache_cooked_read (cache, reg->rx->num, cbuf); + status = regcache_cooked_read (cache, reg->rx->num, buf); if (status == REG_VALID) - status = regcache_cooked_read (cache, reg->ry->num, cbuf + high_bytes); + status = regcache_cooked_read (cache, reg->ry->num, buf + high_bytes); } else { - status = regcache_cooked_read (cache, reg->rx->num, cbuf + low_bytes); + status = regcache_cooked_read (cache, reg->rx->num, buf + low_bytes); if (status == REG_VALID) - status = regcache_cooked_read (cache, reg->ry->num, cbuf); + status = regcache_cooked_read (cache, reg->ry->num, buf); } return status; @@ -505,24 +501,23 @@ m32c_cat_read (struct m32c_reg *reg, struct regcache *cache, void *buf) concatenation of the values of the registers REG->rx and REG->ry, with REG->rx contributing the more significant bits. */ static enum register_status -m32c_cat_write (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_cat_write (struct m32c_reg *reg, struct regcache *cache, + const gdb_byte *buf) { int high_bytes = TYPE_LENGTH (reg->rx->type); int low_bytes = TYPE_LENGTH (reg->ry->type); - /* For address arithmetic. */ - unsigned char *cbuf = buf; gdb_assert (TYPE_LENGTH (reg->type) == high_bytes + low_bytes); if (gdbarch_byte_order (reg->arch) == BFD_ENDIAN_BIG) { - regcache_cooked_write (cache, reg->rx->num, cbuf); - regcache_cooked_write (cache, reg->ry->num, cbuf + high_bytes); + regcache_cooked_write (cache, reg->rx->num, buf); + regcache_cooked_write (cache, reg->ry->num, buf + high_bytes); } else { - regcache_cooked_write (cache, reg->rx->num, cbuf + low_bytes); - regcache_cooked_write (cache, reg->ry->num, cbuf); + regcache_cooked_write (cache, reg->rx->num, buf + low_bytes); + regcache_cooked_write (cache, reg->ry->num, buf); } return REG_VALID; @@ -533,34 +528,31 @@ m32c_cat_write (struct m32c_reg *reg, struct regcache *cache, void *buf) the concatenation (from most significant to least) of r3, r2, r1, and r0. */ static enum register_status -m32c_r3r2r1r0_read (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_r3r2r1r0_read (struct m32c_reg *reg, struct regcache *cache, gdb_byte *buf) { struct gdbarch_tdep *tdep = gdbarch_tdep (reg->arch); int len = TYPE_LENGTH (tdep->r0->type); enum register_status status; - /* For address arithmetic. */ - unsigned char *cbuf = buf; - if (gdbarch_byte_order (reg->arch) == BFD_ENDIAN_BIG) { - status = regcache_cooked_read (cache, tdep->r0->num, cbuf + len * 3); + status = regcache_cooked_read (cache, tdep->r0->num, buf + len * 3); if (status == REG_VALID) - status = regcache_cooked_read (cache, tdep->r1->num, cbuf + len * 2); + status = regcache_cooked_read (cache, tdep->r1->num, buf + len * 2); if (status == REG_VALID) - status = regcache_cooked_read (cache, tdep->r2->num, cbuf + len * 1); + status = regcache_cooked_read (cache, tdep->r2->num, buf + len * 1); if (status == REG_VALID) - status = regcache_cooked_read (cache, tdep->r3->num, cbuf); + status = regcache_cooked_read (cache, tdep->r3->num, buf); } else { - status = regcache_cooked_read (cache, tdep->r0->num, cbuf); + status = regcache_cooked_read (cache, tdep->r0->num, buf); if (status == REG_VALID) - status = regcache_cooked_read (cache, tdep->r1->num, cbuf + len * 1); + status = regcache_cooked_read (cache, tdep->r1->num, buf + len * 1); if (status == REG_VALID) - status = regcache_cooked_read (cache, tdep->r2->num, cbuf + len * 2); + status = regcache_cooked_read (cache, tdep->r2->num, buf + len * 2); if (status == REG_VALID) - status = regcache_cooked_read (cache, tdep->r3->num, cbuf + len * 3); + status = regcache_cooked_read (cache, tdep->r3->num, buf + len * 3); } return status; @@ -571,27 +563,25 @@ m32c_r3r2r1r0_read (struct m32c_reg *reg, struct regcache *cache, void *buf) the concatenation (from most significant to least) of r3, r2, r1, and r0. */ static enum register_status -m32c_r3r2r1r0_write (struct m32c_reg *reg, struct regcache *cache, void *buf) +m32c_r3r2r1r0_write (struct m32c_reg *reg, struct regcache *cache, + const gdb_byte *buf) { struct gdbarch_tdep *tdep = gdbarch_tdep (reg->arch); int len = TYPE_LENGTH (tdep->r0->type); - /* For address arithmetic. */ - unsigned char *cbuf = buf; - if (gdbarch_byte_order (reg->arch) == BFD_ENDIAN_BIG) { - regcache_cooked_write (cache, tdep->r0->num, cbuf + len * 3); - regcache_cooked_write (cache, tdep->r1->num, cbuf + len * 2); - regcache_cooked_write (cache, tdep->r2->num, cbuf + len * 1); - regcache_cooked_write (cache, tdep->r3->num, cbuf); + regcache_cooked_write (cache, tdep->r0->num, buf + len * 3); + regcache_cooked_write (cache, tdep->r1->num, buf + len * 2); + regcache_cooked_write (cache, tdep->r2->num, buf + len * 1); + regcache_cooked_write (cache, tdep->r3->num, buf); } else { - regcache_cooked_write (cache, tdep->r0->num, cbuf); - regcache_cooked_write (cache, tdep->r1->num, cbuf + len * 1); - regcache_cooked_write (cache, tdep->r2->num, cbuf + len * 2); - regcache_cooked_write (cache, tdep->r3->num, cbuf + len * 3); + regcache_cooked_write (cache, tdep->r0->num, buf); + regcache_cooked_write (cache, tdep->r1->num, buf + len * 1); + regcache_cooked_write (cache, tdep->r2->num, buf + len * 2); + regcache_cooked_write (cache, tdep->r3->num, buf + len * 3); } return REG_VALID; @@ -630,7 +620,7 @@ m32c_pseudo_register_write (struct gdbarch *arch, gdb_assert (arch == tdep->regs[cookednum].arch); reg = &tdep->regs[cookednum]; - reg->write (reg, cache, (void *) buf); + reg->write (reg, cache, buf); } @@ -641,8 +631,8 @@ add_reg (struct gdbarch *arch, const char *name, struct type *type, int sim_num, - m32c_move_reg_t *read, - m32c_move_reg_t *write, + m32c_read_reg_t *read, + m32c_write_reg_t *write, struct m32c_reg *rx, struct m32c_reg *ry, int n) @@ -824,9 +814,6 @@ make_regs (struct gdbarch *arch) struct m32c_reg *sp; struct m32c_reg *r0hl; struct m32c_reg *r1hl; - struct m32c_reg *r2hl; - struct m32c_reg *r3hl; - struct m32c_reg *intbhl; struct m32c_reg *r2r0; struct m32c_reg *r3r1; struct m32c_reg *r3r1r2r0; @@ -890,9 +877,9 @@ make_regs (struct gdbarch *arch) r0hl = CHL (r0, tdep->int8); r1hl = CHL (r1, tdep->int8); - r2hl = CHL (r2, tdep->int8); - r3hl = CHL (r3, tdep->int8); - intbhl = CHL (intb, tdep->int16); + CHL (r2, tdep->int8); + CHL (r3, tdep->int8); + CHL (intb, tdep->int16); r2r0 = CCAT (r2, r0, tdep->int32); r3r1 = CCAT (r3, r1, tdep->int32); @@ -1003,20 +990,26 @@ make_regs (struct gdbarch *arch) /* Breakpoints. */ +constexpr gdb_byte m32c_break_insn[] = { 0x00 }; /* brk */ -static const unsigned char * -m32c_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pc, int *len) -{ - static unsigned char break_insn[] = { 0x00 }; /* brk */ - - *len = sizeof (break_insn); - return break_insn; -} - +typedef BP_MANIPULATION (m32c_break_insn) m32c_breakpoint; /* Prologue analysis. */ +enum m32c_prologue_kind +{ + /* This function uses a frame pointer. */ + prologue_with_frame_ptr, + + /* This function has no frame pointer. */ + prologue_sans_frame_ptr, + + /* This function sets up the stack, so its frame is the first + frame on the stack. */ + prologue_first_frame +}; + struct m32c_prologue { /* For consistency with the DWARF 2 .debug_frame info generated by @@ -1026,18 +1019,7 @@ struct m32c_prologue /* The architecture for which we generated this prologue info. */ struct gdbarch *arch; - enum { - /* This function uses a frame pointer. */ - prologue_with_frame_ptr, - - /* This function has no frame pointer. */ - prologue_sans_frame_ptr, - - /* This function sets up the stack, so its frame is the first - frame on the stack. */ - prologue_first_frame - - } kind; + enum m32c_prologue_kind kind; /* If KIND is prologue_with_frame_ptr, this is the offset from the CFA to where the frame pointer points. This is always zero or @@ -1107,6 +1089,13 @@ m32c_pv_push (struct m32c_pv_state *state, pv_t value, int size) } +enum srcdest_kind +{ + srcdest_reg, + srcdest_partial_reg, + srcdest_mem +}; + /* A source or destination location for an m16c or m32c instruction. */ struct srcdest @@ -1115,7 +1104,7 @@ struct srcdest If srcdest_partial_reg, the location is part of a register pointed to by REG. We don't try to handle this too well. If srcdest_mem, the location is memory whose address is ADDR. */ - enum { srcdest_reg, srcdest_partial_reg, srcdest_mem } kind; + enum srcdest_kind kind; pv_t *reg, addr; }; @@ -1873,10 +1862,11 @@ m32c_analyze_frame_prologue (struct frame_info *this_frame, *this_prologue_cache = FRAME_OBSTACK_ZALLOC (struct m32c_prologue); m32c_analyze_prologue (get_frame_arch (this_frame), - func_start, stop_addr, *this_prologue_cache); + func_start, stop_addr, + (struct m32c_prologue *) *this_prologue_cache); } - return *this_prologue_cache; + return (struct m32c_prologue *) *this_prologue_cache; } @@ -1940,7 +1930,6 @@ m32c_prev_register (struct frame_info *this_frame, struct m32c_prologue *p = m32c_analyze_frame_prologue (this_frame, this_prologue_cache); CORE_ADDR frame_base = m32c_frame_base (this_frame, this_prologue_cache); - int reg_size = register_size (get_frame_arch (this_frame), regnum); if (regnum == tdep->sp->num) return frame_unwind_got_constant (this_frame, regnum, frame_base); @@ -2243,14 +2232,14 @@ m32c_return_value (struct gdbarch *gdbarch, /* Everything else is passed in mem0, using as many bytes as needed. This is not what the Renesas tools do, but it's what GCC does at the moment. */ - struct minimal_symbol *mem0 + struct bound_minimal_symbol mem0 = lookup_minimal_symbol ("mem0", NULL, NULL); - if (! mem0) + if (! mem0.minsym) error (_("The return value is stored in memory at 'mem0', " "but GDB cannot find\n" "its address.")); - read_memory (SYMBOL_VALUE_ADDRESS (mem0), readbuf, valtype_len); + read_memory (BMSYMBOL_VALUE_ADDRESS (mem0), readbuf, valtype_len); } } @@ -2275,14 +2264,14 @@ m32c_return_value (struct gdbarch *gdbarch, /* Everything else is passed in mem0, using as many bytes as needed. This is not what the Renesas tools do, but it's what GCC does at the moment. */ - struct minimal_symbol *mem0 + struct bound_minimal_symbol mem0 = lookup_minimal_symbol ("mem0", NULL, NULL); - if (! mem0) + if (! mem0.minsym) error (_("The return value is stored in memory at 'mem0', " "but GDB cannot find\n" " its address.")); - write_memory (SYMBOL_VALUE_ADDRESS (mem0), writebuf, valtype_len); + write_memory (BMSYMBOL_VALUE_ADDRESS (mem0), writebuf, valtype_len); } } @@ -2453,7 +2442,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch, { const char *func_name; char *tramp_name; - struct minimal_symbol *tramp_msym; + struct bound_minimal_symbol tramp_msym; /* Try to find a linker symbol at this address. */ struct bound_minimal_symbol func_msym @@ -2464,8 +2453,8 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch, "couldn't find a symbol at that address, to find trampoline."), paddress (gdbarch, addr)); - func_name = SYMBOL_LINKAGE_NAME (func_msym.minsym); - tramp_name = xmalloc (strlen (func_name) + 5); + func_name = MSYMBOL_LINKAGE_NAME (func_msym.minsym); + tramp_name = (char *) xmalloc (strlen (func_name) + 5); strcpy (tramp_name, func_name); strcat (tramp_name, ".plt"); @@ -2476,7 +2465,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch, the name any more. */ xfree (tramp_name); - if (! tramp_msym) + if (! tramp_msym.minsym) { CORE_ADDR ptrval; @@ -2508,7 +2497,7 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch, else { /* The trampoline's address is our pointer. */ - addr = SYMBOL_VALUE_ADDRESS (tramp_msym); + addr = BMSYMBOL_VALUE_ADDRESS (tramp_msym); } } @@ -2539,20 +2528,20 @@ m32c_m16c_pointer_to_address (struct gdbarch *gdbarch, if (ptr_msym.minsym) { - const char *ptr_msym_name = SYMBOL_LINKAGE_NAME (ptr_msym.minsym); + const char *ptr_msym_name = MSYMBOL_LINKAGE_NAME (ptr_msym.minsym); int len = strlen (ptr_msym_name); if (len > 4 && strcmp (ptr_msym_name + len - 4, ".plt") == 0) { - struct minimal_symbol *func_msym; + struct bound_minimal_symbol func_msym; /* We have a .plt symbol; try to find the symbol for the corresponding function. Since the trampoline contains a jump instruction, we could also just extract the jump's target address. I don't see much advantage one way or the other. */ - char *func_name = xmalloc (len - 4 + 1); + char *func_name = (char *) xmalloc (len - 4 + 1); memcpy (func_name, ptr_msym_name, len - 4); func_name[len - 4] = '\0'; func_msym @@ -2560,8 +2549,8 @@ m32c_m16c_pointer_to_address (struct gdbarch *gdbarch, /* If we do have such a symbol, return its value as the function's true address. */ - if (func_msym) - ptr = SYMBOL_VALUE_ADDRESS (func_msym); + if (func_msym.minsym) + ptr = BMSYMBOL_VALUE_ADDRESS (func_msym); } } else @@ -2625,7 +2614,7 @@ m32c_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc, static struct gdbarch * m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { - struct gdbarch *arch; + struct gdbarch *gdbarch; struct gdbarch_tdep *tdep; unsigned long mach = info.bfd_arch_info->mach; @@ -2636,52 +2625,53 @@ m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) arches = gdbarch_list_lookup_by_info (arches->next, &info)) return arches->gdbarch; - tdep = xcalloc (1, sizeof (*tdep)); - arch = gdbarch_alloc (&info, tdep); + tdep = XCNEW (struct gdbarch_tdep); + gdbarch = gdbarch_alloc (&info, tdep); /* Essential types. */ - make_types (arch); + make_types (gdbarch); /* Address/pointer conversions. */ if (mach == bfd_mach_m16c) { - set_gdbarch_address_to_pointer (arch, m32c_m16c_address_to_pointer); - set_gdbarch_pointer_to_address (arch, m32c_m16c_pointer_to_address); + set_gdbarch_address_to_pointer (gdbarch, m32c_m16c_address_to_pointer); + set_gdbarch_pointer_to_address (gdbarch, m32c_m16c_pointer_to_address); } /* Register set. */ - make_regs (arch); + make_regs (gdbarch); /* Disassembly. */ - set_gdbarch_print_insn (arch, print_insn_m32c); + set_gdbarch_print_insn (gdbarch, print_insn_m32c); /* Breakpoints. */ - set_gdbarch_breakpoint_from_pc (arch, m32c_breakpoint_from_pc); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, m32c_breakpoint::kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, m32c_breakpoint::bp_from_kind); /* Prologue analysis and unwinding. */ - set_gdbarch_inner_than (arch, core_addr_lessthan); - set_gdbarch_skip_prologue (arch, m32c_skip_prologue); - set_gdbarch_unwind_pc (arch, m32c_unwind_pc); - set_gdbarch_unwind_sp (arch, m32c_unwind_sp); + set_gdbarch_inner_than (gdbarch, core_addr_lessthan); + set_gdbarch_skip_prologue (gdbarch, m32c_skip_prologue); + set_gdbarch_unwind_pc (gdbarch, m32c_unwind_pc); + set_gdbarch_unwind_sp (gdbarch, m32c_unwind_sp); #if 0 /* I'm dropping the dwarf2 sniffer because it has a few problems. They may be in the dwarf2 cfi code in GDB, or they may be in the debug info emitted by the upstream toolchain. I don't know which, but I do know that the prologue analyzer works better. MVS 04/13/06 */ - dwarf2_append_sniffers (arch); + dwarf2_append_sniffers (gdbarch); #endif - frame_unwind_append_unwinder (arch, &m32c_unwind); + frame_unwind_append_unwinder (gdbarch, &m32c_unwind); /* Inferior calls. */ - set_gdbarch_push_dummy_call (arch, m32c_push_dummy_call); - set_gdbarch_return_value (arch, m32c_return_value); - set_gdbarch_dummy_id (arch, m32c_dummy_id); + set_gdbarch_push_dummy_call (gdbarch, m32c_push_dummy_call); + set_gdbarch_return_value (gdbarch, m32c_return_value); + set_gdbarch_dummy_id (gdbarch, m32c_dummy_id); /* Trampolines. */ - set_gdbarch_skip_trampoline_code (arch, m32c_skip_trampoline_code); + set_gdbarch_skip_trampoline_code (gdbarch, m32c_skip_trampoline_code); - set_gdbarch_virtual_frame_pointer (arch, m32c_virtual_frame_pointer); + set_gdbarch_virtual_frame_pointer (gdbarch, m32c_virtual_frame_pointer); /* m32c function boundary addresses are not necessarily even. Therefore, the `vbit', which indicates a pointer to a virtual @@ -2691,9 +2681,9 @@ m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) In order to verify this, see the definition of TARGET_PTRMEMFUNC_VBIT_LOCATION in gcc/defaults.h along with the definition of FUNCTION_BOUNDARY in gcc/config/m32c/m32c.h. */ - set_gdbarch_vbit_in_delta (arch, 1); + set_gdbarch_vbit_in_delta (gdbarch, 1); - return arch; + return gdbarch; } /* Provide a prototype to silence -Wmissing-prototypes. */