From 6d1915d4fa8f22d76e7e116bc38a4a3e9e9c0c67 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Mon, 26 Oct 2009 16:53:57 +0000 Subject: [PATCH] 2009-10-26 Tristan Gingold * avr-tdep.c (avr_push_dummy_call): Handle avr6 architecture. Fix the returned value. Fix style. --- gdb/ChangeLog | 5 +++++ gdb/avr-tdep.c | 27 ++++++++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7df87657438..8502d724060 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2009-10-26 Tristan Gingold + + * avr-tdep.c (avr_push_dummy_call): Handle avr6 architecture. + Fix the returned value. Fix style. + 2009-10-26 Joel Brobecker * MAINTAINERS (Responsible Maintainers): Add info about the microblaze diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c index 7f56e540099..6340c21783f 100644 --- a/gdb/avr-tdep.c +++ b/gdb/avr-tdep.c @@ -1181,7 +1181,8 @@ avr_push_dummy_call (struct gdbarch *gdbarch, struct value *function, { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int i; - unsigned char buf[2]; + unsigned char buf[3]; + int call_length = gdbarch_tdep (gdbarch)->call_length; CORE_ADDR return_pc = avr_convert_iaddr_to_raw (bp_addr); int regnum = AVR_ARGN_REGNUM; struct stack_item *si = NULL; @@ -1219,11 +1220,9 @@ avr_push_dummy_call (struct gdbarch *gdbarch, struct value *function, regnum--; val = extract_unsigned_integer (contents, len, byte_order); - for (j=0; j> (8*(len-j-1))); - } + for (j = 0; j < len; j++) + regcache_cooked_write_unsigned + (regcache, regnum--, val >> (8 * (len - j - 1))); } /* No registers available, push the args onto the stack. */ else @@ -1245,17 +1244,23 @@ avr_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Set the return address. For the avr, the return address is the BP_ADDR. Need to push the return address onto the stack noting that it needs to be in big-endian order on the stack. */ - buf[0] = (return_pc >> 8) & 0xff; - buf[1] = return_pc & 0xff; + for (i = 1; i <= call_length; i++) + { + buf[call_length - i] = return_pc & 0xff; + return_pc >>= 8; + } - sp -= 2; - write_memory (sp + 1, buf, 2); /* Add one since pushes are post decr ops. */ + sp -= call_length; + /* Use 'sp + 1' since pushes are post decr ops. */ + write_memory (sp + 1, buf, call_length); /* Finally, update the SP register. */ regcache_cooked_write_unsigned (regcache, AVR_SP_REGNUM, avr_convert_saddr_to_raw (sp)); - return sp; + /* Return SP value for the dummy frame, where the return address hasn't been + pushed. */ + return sp + call_length; } /* Initialize the gdbarch structure for the AVR's. */ -- 2.30.2