X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fm32r-tdep.c;h=e22ca9dd779d3d5a3dc21c73b3498cc429b3c5e1;hb=91158a569dc571a9916dfad98c6c95ce789ad18d;hp=c27195b2f9348fe3db837c99af8b36ac050cec5a;hpb=0dfff4cba79b63947da409e72b2863b160a6233a;p=binutils-gdb.git diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c index c27195b2f93..e22ca9dd779 100644 --- a/gdb/m32r-tdep.c +++ b/gdb/m32r-tdep.c @@ -1,7 +1,7 @@ /* Target-dependent code for Renesas M32R, for GDB. Copyright (C) 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, - 2008 Free Software Foundation, Inc. + 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GDB. @@ -235,7 +235,7 @@ m32r_register_type (struct gdbarch *gdbarch, int reg_nr) else if (reg_nr == M32R_SP_REGNUM || reg_nr == M32R_FP_REGNUM) return builtin_type (gdbarch)->builtin_data_ptr; else - return builtin_type_int32; + return builtin_type (gdbarch)->builtin_int32; } @@ -248,15 +248,18 @@ static void m32r_store_return_value (struct type *type, struct regcache *regcache, const void *valbuf) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR regval; int len = TYPE_LENGTH (type); - regval = extract_unsigned_integer (valbuf, len > 4 ? 4 : len); + regval = extract_unsigned_integer (valbuf, len > 4 ? 4 : len, byte_order); regcache_cooked_write_unsigned (regcache, RET1_REGNUM, regval); if (len > 4) { - regval = extract_unsigned_integer ((gdb_byte *) valbuf + 4, len - 4); + regval = extract_unsigned_integer ((gdb_byte *) valbuf + 4, + len - 4, byte_order); regcache_cooked_write_unsigned (regcache, RET1_REGNUM + 1, regval); } } @@ -265,9 +268,11 @@ m32r_store_return_value (struct type *type, struct regcache *regcache, should be cached because this thrashing is getting nuts. */ static int -decode_prologue (CORE_ADDR start_pc, CORE_ADDR scan_limit, +decode_prologue (struct gdbarch *gdbarch, + CORE_ADDR start_pc, CORE_ADDR scan_limit, CORE_ADDR *pl_endptr, unsigned long *framelength) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); unsigned long framesize; int insn; int op1; @@ -283,10 +288,10 @@ decode_prologue (CORE_ADDR start_pc, CORE_ADDR scan_limit, for (current_pc = start_pc; current_pc < scan_limit; current_pc += 2) { /* Check if current pc's location is readable. */ - if (!safe_read_memory_integer (current_pc, 2, &return_value)) + if (!safe_read_memory_integer (current_pc, 2, byte_order, &return_value)) return -1; - insn = read_memory_unsigned_integer (current_pc, 2); + insn = read_memory_unsigned_integer (current_pc, 2, byte_order); if (insn == 0x0000) break; @@ -308,25 +313,30 @@ decode_prologue (CORE_ADDR start_pc, CORE_ADDR scan_limit, current_pc += 2; /* skip the immediate data */ /* Check if current pc's location is readable. */ - if (!safe_read_memory_integer (current_pc, 2, &return_value)) + if (!safe_read_memory_integer (current_pc, 2, byte_order, + &return_value)) return -1; if (insn == 0x8faf) /* add3 sp, sp, xxxx */ /* add 16 bit sign-extended offset */ { framesize += - -((short) read_memory_unsigned_integer (current_pc, 2)); + -((short) read_memory_unsigned_integer (current_pc, + 2, byte_order)); } else { if (((insn >> 8) == 0xe4) /* ld24 r4, xxxxxx; sub sp, r4 */ - && safe_read_memory_integer (current_pc + 2, 2, + && safe_read_memory_integer (current_pc + 2, + 2, byte_order, &return_value) && read_memory_unsigned_integer (current_pc + 2, - 2) == 0x0f24) + 2, byte_order) + == 0x0f24) /* subtract 24 bit sign-extended negative-offset */ { - insn = read_memory_unsigned_integer (current_pc - 2, 4); + insn = read_memory_unsigned_integer (current_pc - 2, + 4, byte_order); if (insn & 0x00800000) /* sign extend */ insn |= 0xff000000; /* negative */ else @@ -449,9 +459,10 @@ decode_prologue (CORE_ADDR start_pc, CORE_ADDR scan_limit, #define DEFAULT_SEARCH_LIMIT 128 -CORE_ADDR +static CORE_ADDR m32r_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR func_addr, func_end; struct symtab_and_line sal; LONGEST return_value; @@ -478,11 +489,11 @@ m32r_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) func_end = pc + DEFAULT_SEARCH_LIMIT; /* If pc's location is not readable, just quit. */ - if (!safe_read_memory_integer (pc, 4, &return_value)) + if (!safe_read_memory_integer (pc, 4, byte_order, &return_value)) return pc; /* Find the end of prologue. */ - if (decode_prologue (pc, func_end, &sal.end, NULL) < 0) + if (decode_prologue (gdbarch, pc, func_end, &sal.end, NULL) < 0) return pc; return sal.end; @@ -669,6 +680,7 @@ m32r_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int stack_offset, stack_alloc; int argreg = ARG1_REGNUM; int argnum; @@ -713,7 +725,8 @@ m32r_push_dummy_call (struct gdbarch *gdbarch, struct value *function, if (len > 8 && (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)) { - store_unsigned_integer (valbuf, 4, VALUE_ADDRESS (args[argnum])); + store_unsigned_integer (valbuf, 4, byte_order, + value_address (args[argnum])); typecode = TYPE_CODE_PTR; len = 4; val = valbuf; @@ -741,7 +754,8 @@ m32r_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* there's room in a register */ regval = extract_unsigned_integer (val, - register_size (gdbarch, argreg)); + register_size (gdbarch, argreg), + byte_order); regcache_cooked_write_unsigned (regcache, argreg++, regval); } @@ -767,6 +781,8 @@ static void m32r_extract_return_value (struct type *type, struct regcache *regcache, void *dst) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); bfd_byte *valbuf = dst; int len = TYPE_LENGTH (type); ULONGEST tmp; @@ -774,18 +790,18 @@ m32r_extract_return_value (struct type *type, struct regcache *regcache, /* By using store_unsigned_integer we avoid having to do anything special for small big-endian values. */ regcache_cooked_read_unsigned (regcache, RET1_REGNUM, &tmp); - store_unsigned_integer (valbuf, (len > 4 ? len - 4 : len), tmp); + store_unsigned_integer (valbuf, (len > 4 ? len - 4 : len), byte_order, tmp); /* Ignore return values more than 8 bytes in size because the m32r returns anything more than 8 bytes in the stack. */ if (len > 4) { regcache_cooked_read_unsigned (regcache, RET1_REGNUM + 1, &tmp); - store_unsigned_integer (valbuf + len - 4, 4, tmp); + store_unsigned_integer (valbuf + len - 4, 4, byte_order, tmp); } } -enum return_value_convention +static enum return_value_convention m32r_return_value (struct gdbarch *gdbarch, struct type *func_type, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)