Fix argument passing for call

When calling function with argument of size more than 8 bytes fails with
an error "That operation is not available on integers of more than 8 bytes.".
avr-gdb considers only 8 bytes (sizeof(long long)) in case of passing the
argument in registers. When the argument is of size more than 8 byte
then the utility function to extract bytes failed with the above error.

    gdb/
	* avr-tdep.c (AVR_LAST_ARG_REGNUM): Define.
        (avr_push_dummy_call): Correct last needed argument register.
        Write MSB of argument into register and subsequent bytes into
        other registers in decreasing order.
This commit is contained in:
Denis Chertykov 2016-03-05 15:17:15 +03:00
parent 57f9b1448f
commit cb86f3880e
2 changed files with 16 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2016-03-05 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
* avr-tdep.c (AVR_LAST_ARG_REGNUM): Define.
(avr_push_dummy_call): Correct last needed argument register.
Write MSB of argument into register and subsequent bytes into
other registers in decreasing order.
2016-03-04 Yao Qi <yao.qi@linaro.org>
* arm-tdep.c (arm_record_vdata_transfer_insn): Simplify the

View File

@ -111,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 */
@ -1298,23 +1299,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