X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Favr-tdep.c;h=f6f43a0a23377f4bdeb6a48c542ed0c87cfd7a3b;hb=038d48680941f014349256aeb7bab14b3f01d58e;hp=be0b543e6ffb8753ad1e61a62e887691230ce331;hpb=487d975399dfcb2bb2f0998a7d12bd62acdd9fa1;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c index be0b543e6f..f6f43a0a23 100644 --- a/gdb/avr-tdep.c +++ b/gdb/avr-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for Atmel AVR, for GDB. - Copyright (C) 1996-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -34,7 +34,6 @@ #include "symfile.h" #include "arch-utils.h" #include "regcache.h" -#include #include "dis-asm.h" #include "objfiles.h" @@ -112,6 +111,7 @@ enum AVR_ARG1_REGNUM = 24, /* Single byte argument */ AVR_ARGN_REGNUM = 25, /* Multi byte argments */ + AVR_LAST_ARG_REGNUM = 8, /* Last argument register */ AVR_RET1_REGNUM = 24, /* Single byte return value */ AVR_RETN_REGNUM = 25, /* Multi byte return value */ @@ -308,7 +308,7 @@ avr_address_to_pointer (struct gdbarch *gdbarch, /* Is it a data address in flash? */ if (AVR_TYPE_ADDRESS_CLASS_FLASH (type)) { - /* A data address in flash is always byte addressed. */ + /* A data pointer in flash is byte addressed. */ store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order, avr_convert_iaddr_to_raw (addr)); } @@ -316,8 +316,8 @@ avr_address_to_pointer (struct gdbarch *gdbarch, else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD) { - /* A code address, either a function pointer or the program counter, is - word (16 bits) addressed. */ + /* A code pointer is word (16 bits) addressed. We shift the address down + by 1 bit to convert it to a pointer. */ store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order, avr_convert_iaddr_to_raw (addr >> 1)); } @@ -339,12 +339,19 @@ avr_pointer_to_address (struct gdbarch *gdbarch, /* Is it a data address in flash? */ if (AVR_TYPE_ADDRESS_CLASS_FLASH (type)) - return avr_make_iaddr (addr); + { + /* A data pointer in flash is already byte addressed. */ + return avr_make_iaddr (addr); + } /* Is it a code address? */ else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD || TYPE_CODE_SPACE (TYPE_TARGET_TYPE (type))) - return avr_make_iaddr (addr << 1); + { + /* A code pointer is word (16 bits) addressed so we shift it up + by 1 bit to convert it to an address. */ + return avr_make_iaddr (addr << 1); + } else return avr_make_saddr (addr); } @@ -981,7 +988,7 @@ avr_frame_unwind_cache (struct frame_info *this_frame, int i; if (*this_prologue_cache) - return *this_prologue_cache; + return (struct avr_unwind_cache *) *this_prologue_cache; info = FRAME_OBSTACK_ZALLOC (struct avr_unwind_cache); *this_prologue_cache = info; @@ -1100,8 +1107,6 @@ static struct value * avr_frame_prev_register (struct frame_info *this_frame, void **this_prologue_cache, int regnum) { - struct gdbarch *gdbarch = get_frame_arch (this_frame); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); struct avr_unwind_cache *info = avr_frame_unwind_cache (this_frame, this_prologue_cache); @@ -1192,15 +1197,15 @@ 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 bfd_byte *contents, int len) { struct stack_item *si; - si = xmalloc (sizeof (struct stack_item)); - si->data = xmalloc (len); + si = XNEW (struct stack_item); + si->data = (gdb_byte *) xmalloc (len); si->len = len; si->prev = prev; memcpy (si->data, contents, len); @@ -1263,7 +1268,6 @@ avr_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr) { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int i; gdb_byte buf[3]; int call_length = gdbarch_tdep (gdbarch)->call_length; @@ -1292,23 +1296,24 @@ avr_push_dummy_call (struct gdbarch *gdbarch, struct value *function, const bfd_byte *contents = value_contents (arg); int len = TYPE_LENGTH (type); - /* Calculate the potential last register needed. */ - last_regnum = regnum - (len + (len & 1)); + /* Calculate the potential last register needed. + E.g. For length 2, registers regnum and regnum-1 (say 25 and 24) + shall be used. So, last needed register will be regnum-1(24). */ + last_regnum = regnum - (len + (len & 1)) + 1; /* If there are registers available, use them. Once we start putting stuff on the stack, all subsequent args go on stack. */ - if ((si == NULL) && (last_regnum >= 8)) + if ((si == NULL) && (last_regnum >= AVR_LAST_ARG_REGNUM)) { - ULONGEST val; - /* Skip a register for odd length args. */ if (len & 1) regnum--; - val = extract_unsigned_integer (contents, len, byte_order); + /* Write MSB of argument into register and subsequent bytes in + decreasing register numbers. */ for (j = 0; j < len; j++) regcache_cooked_write_unsigned - (regcache, regnum--, val >> (8 * (len - j - 1))); + (regcache, regnum--, contents[len - j - 1]); } /* No registers available, push the args onto the stack. */ else @@ -1358,9 +1363,6 @@ avr_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg) return reg; if (reg == 32) return AVR_SP_REGNUM; - - warning (_("Unmapped DWARF Register #%d encountered."), reg); - return -1; } @@ -1629,7 +1631,6 @@ _initialize_avr_tdep (void) /* FIXME: TRoth/2002-02-18: This should probably be changed to 'info avr io_registers' to signify it is not available on other platforms. */ - add_cmd ("io_registers", class_info, avr_io_reg_read_command, - _("query remote avr target for io space register values"), - &infolist); + add_info ("io_registers", avr_io_reg_read_command, + _("query remote avr target for io space register values")); }