2003-01-12 Andrew Cagney <ac131313@redhat.com>

* d10v-tdep.c: Include "gdb_assert.h".
	(d10v_store_return_value): Rewrite to match current interface.
	(d10v_extract_struct_value_address): Ditto.
	(d10v_extract_return_value): Ditto.
	(d10v_gdbarch_init): Set store_restore_value,
	extract_struct_value_address and extract_return_value.
This commit is contained in:
Andrew Cagney
2003-01-12 18:59:53 +00:00
parent 68b8d23eb2
commit fa1fd571ea
2 changed files with 65 additions and 31 deletions

View File

@ -1,3 +1,12 @@
2003-01-12 Andrew Cagney <ac131313@redhat.com>
* d10v-tdep.c: Include "gdb_assert.h".
(d10v_store_return_value): Rewrite to match current interface.
(d10v_extract_struct_value_address): Ditto.
(d10v_extract_return_value): Ditto.
(d10v_gdbarch_init): Set store_restore_value,
extract_struct_value_address and extract_return_value.
2003-01-12 J. Brobecker <brobecker@gnat.com> 2003-01-12 J. Brobecker <brobecker@gnat.com>
* hpread.c (set_namestring): New procedure replacing the * hpread.c (set_namestring): New procedure replacing the

View File

@ -42,6 +42,8 @@
#include "gdb/sim-d10v.h" #include "gdb/sim-d10v.h"
#include "sim-regno.h" #include "sim-regno.h"
#include "gdb_assert.h"
struct frame_extra_info struct frame_extra_info
{ {
CORE_ADDR return_pc; CORE_ADDR return_pc;
@ -472,22 +474,36 @@ d10v_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
Things always get returned in RET1_REGNUM, RET2_REGNUM, ... */ Things always get returned in RET1_REGNUM, RET2_REGNUM, ... */
static void static void
d10v_store_return_value (struct type *type, char *valbuf) d10v_store_return_value (struct type *type, struct regcache *regcache,
const void *valbuf)
{ {
char tmp = 0; /* Only char return values need to be shifted right within the first
/* Only char return values need to be shifted right within R0. */ regnum. */
if (TYPE_LENGTH (type) == 1 if (TYPE_LENGTH (type) == 1
&& TYPE_CODE (type) == TYPE_CODE_INT) && TYPE_CODE (type) == TYPE_CODE_INT)
{ {
/* zero the high byte */ bfd_byte tmp[2];
deprecated_write_register_bytes (REGISTER_BYTE (RET1_REGNUM), &tmp, 1); tmp[1] = *(bfd_byte *)valbuf;
/* copy the low byte */ regcache_cooked_write (regcache, RET1_REGNUM, tmp);
deprecated_write_register_bytes (REGISTER_BYTE (RET1_REGNUM) + 1,
valbuf, 1);
} }
else else
deprecated_write_register_bytes (REGISTER_BYTE (RET1_REGNUM), {
valbuf, TYPE_LENGTH (type)); int reg;
/* A structure is never more than 8 bytes long. See
use_struct_convention(). */
gdb_assert (TYPE_LENGTH (type) <= 8);
/* Write out most registers, stop loop before trying to write
out any dangling byte at the end of the buffer. */
for (reg = 0; (reg * 2) + 1 < TYPE_LENGTH (type); reg++)
{
regcache_cooked_write (regcache, RET1_REGNUM + reg,
(bfd_byte *) valbuf + reg * 2);
}
/* Write out any dangling byte at the end of the buffer. */
if ((reg * 2) + 1 == TYPE_LENGTH (type))
regcache_cooked_write_part (regcache, reg, 0, 1,
(bfd_byte *) valbuf + reg * 2);
}
} }
/* Extract from an array REGBUF containing the (raw) register state /* Extract from an array REGBUF containing the (raw) register state
@ -495,11 +511,11 @@ d10v_store_return_value (struct type *type, char *valbuf)
as a CORE_ADDR (or an expression that can be used as one). */ as a CORE_ADDR (or an expression that can be used as one). */
static CORE_ADDR static CORE_ADDR
d10v_extract_struct_value_address (char *regbuf) d10v_extract_struct_value_address (struct regcache *regcache)
{ {
return (extract_address ((regbuf) + REGISTER_BYTE (ARG1_REGNUM), ULONGEST addr;
REGISTER_RAW_SIZE (ARG1_REGNUM)) regcache_cooked_read_unsigned (regcache, ARG1_REGNUM, &addr);
| DMEM_START); return (addr | DMEM_START);
} }
static CORE_ADDR static CORE_ADDR
@ -1149,8 +1165,8 @@ d10v_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
extract and copy its value into `valbuf'. */ extract and copy its value into `valbuf'. */
static void static void
d10v_extract_return_value (struct type *type, char regbuf[REGISTER_BYTES], d10v_extract_return_value (struct type *type, struct regcache *regcache,
char *valbuf) void *valbuf)
{ {
int len; int len;
#if 0 #if 0
@ -1159,25 +1175,34 @@ d10v_extract_return_value (struct type *type, char regbuf[REGISTER_BYTES],
(int) extract_unsigned_integer (regbuf + REGISTER_BYTE(RET1_REGNUM), (int) extract_unsigned_integer (regbuf + REGISTER_BYTE(RET1_REGNUM),
REGISTER_RAW_SIZE (RET1_REGNUM))); REGISTER_RAW_SIZE (RET1_REGNUM)));
#endif #endif
len = TYPE_LENGTH (type); if (TYPE_LENGTH (type) == 1)
if (len == 1)
{ {
unsigned short c; ULONGEST c;
regcache_cooked_read_unsigned (regcache, RET1_REGNUM, &c);
c = extract_unsigned_integer (regbuf + REGISTER_BYTE (RET1_REGNUM),
REGISTER_RAW_SIZE (RET1_REGNUM));
store_unsigned_integer (valbuf, 1, c); store_unsigned_integer (valbuf, 1, c);
} }
else if ((len & 1) == 0)
memcpy (valbuf, regbuf + REGISTER_BYTE (RET1_REGNUM), len);
else else
{ {
/* For return values of odd size, the first byte is in the /* For return values of odd size, the first byte is in the
least significant part of the first register. The least significant part of the first register. The
remaining bytes in remaining registers. Interestingly, remaining bytes in remaining registers. Interestingly, when
when such values are passed in, the last byte is in the such values are passed in, the last byte is in the most
most significant byte of that same register - wierd. */ significant byte of that same register - wierd. */
memcpy (valbuf, regbuf + REGISTER_BYTE (RET1_REGNUM) + 1, len); int reg = RET1_REGNUM;
int off = 0;
if (TYPE_LENGTH (type) & 1)
{
regcache_cooked_read_part (regcache, RET1_REGNUM, 1, 1,
(bfd_byte *)valbuf + off);
off++;
reg++;
}
/* Transfer the remaining registers. */
for (; off < TYPE_LENGTH (type); reg++, off += 2)
{
regcache_cooked_read (regcache, RET1_REGNUM + reg,
(bfd_byte *) valbuf + off);
}
} }
} }
@ -1604,14 +1629,14 @@ d10v_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0); set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy); set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy);
set_gdbarch_deprecated_extract_return_value (gdbarch, d10v_extract_return_value); set_gdbarch_extract_return_value (gdbarch, d10v_extract_return_value);
set_gdbarch_push_arguments (gdbarch, d10v_push_arguments); set_gdbarch_push_arguments (gdbarch, d10v_push_arguments);
set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame); set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame);
set_gdbarch_push_return_address (gdbarch, d10v_push_return_address); set_gdbarch_push_return_address (gdbarch, d10v_push_return_address);
set_gdbarch_store_struct_return (gdbarch, d10v_store_struct_return); set_gdbarch_store_struct_return (gdbarch, d10v_store_struct_return);
set_gdbarch_deprecated_store_return_value (gdbarch, d10v_store_return_value); set_gdbarch_store_return_value (gdbarch, d10v_store_return_value);
set_gdbarch_deprecated_extract_struct_value_address (gdbarch, d10v_extract_struct_value_address); set_gdbarch_extract_struct_value_address (gdbarch, d10v_extract_struct_value_address);
set_gdbarch_use_struct_convention (gdbarch, d10v_use_struct_convention); set_gdbarch_use_struct_convention (gdbarch, d10v_use_struct_convention);
set_gdbarch_frame_init_saved_regs (gdbarch, d10v_frame_init_saved_regs); set_gdbarch_frame_init_saved_regs (gdbarch, d10v_frame_init_saved_regs);