mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 17:18:55 +00:00
Clean up the D10V port so that GDB and the target program no
longer disagree on how big pointers are. * findvar.c (value_from_register): Remove special case code for D10V. * printcmd.c (print_frame_args): Same. * valops.c (value_at, value_fetch_lazy): Same. * values.c (unpack_long): Same. * gdbarch.sh: Changes to effect the following: * gdbarch.h (GDB_TARGET_IS_D10V, D10V_MAKE_DADDR, gdbarch_d10v_make_daddr_ftype, gdbarch_d10v_make_daddr, set_gdbarch_d10v_make_daddr, D10V_MAKE_IADDR, gdbarch_d10v_make_iaddr_ftype, gdbarch_d10v_make_iaddr, set_gdbarch_d10v_make_iaddr, D10V_DADDR_P, gdbarch_d10v_daddr_p_ftype, gdbarch_d10v_daddr_p, set_gdbarch_d10v_daddr_p, D10V_IADDR_P, gdbarch_d10v_iaddr_p_ftype, gdbarch_d10v_iaddr_p, set_gdbarch_d10v_iaddr_p, D10V_CONVERT_DADDR_TO_RAW, gdbarch_d10v_convert_daddr_to_raw_ftype, gdbarch_d10v_convert_daddr_to_raw, set_gdbarch_d10v_convert_daddr_to_raw, D10V_CONVERT_IADDR_TO_RAW, gdbarch_d10v_convert_iaddr_to_raw_ftype, gdbarch_d10v_convert_iaddr_to_raw, set_gdbarch_d10v_convert_iaddr_to_raw): Delete declarations. * gdbarch.c: Delete the corresponding definitions. (struct gdbarch): Delete members d10v_make_daddr, d10v_make_iaddr, d10v_daddr_p, d10v_iaddr_p, d10v_convert_daddr_to_raw, and d10v_convert_iaddr_to_raw. (startup_gdbarch): Remove initializers for the above. (verify_gdbarch, gdbarch_dump): Don't verify or dump them any more. * d10v-tdep.c (d10v_register_virtual_type): Rather that claiming the stack pointer and PC are 32 bits long (which they aren't), say that the stack pointer is an int16_t, and the program counter is a function pointer. This allows the rest of GDB to make the appropriate conversions between the code pointer format and real addresses. (d10v_register_convertible, d10v_register_convert_to_virtual, d10v_register_convert_to_raw): Delete function; no registers are convertible now, so we use generic_register_convertible_not instead. (d10v_address_to_pointer, d10v_pointer_to_address): New gdbarch methods. (d10v_push_arguments, d10v_extract_return_value): Remove special cases for code and data pointers. (d10v_gdbarch_init): Set gdbarch_ptr_bit to 16, so that GDB and the target agree on how large pointers are. Say that addresses are 32 bits long. Register the address_to_pointer and pointer_to_address conversion functions. Since no registers are convertible now, register generic_register_convertible_not as the gdbarch_register_convertible method instead of d10v_register_convertible. Remove registrations for d10v_register_convert_to_virtual, d10v_register_convert_to_raw, gdbarch_d10v_make_daddr, gdbarch_d10v_make_iaddr, gdbarch_d10v_daddr_p, gdbarch_d10v_iaddr_p, gdbarch_d10v_convert_daddr_to_raw, and gdbarch_d10v_convert_iaddr_to_raw.
This commit is contained in:
49
gdb/valops.c
49
gdb/valops.c
@@ -474,30 +474,7 @@ value_at (struct type *type, CORE_ADDR addr, asection *sect)
|
||||
|
||||
val = allocate_value (type);
|
||||
|
||||
if (GDB_TARGET_IS_D10V
|
||||
&& TYPE_CODE (type) == TYPE_CODE_PTR
|
||||
&& TYPE_TARGET_TYPE (type)
|
||||
&& (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC))
|
||||
{
|
||||
/* pointer to function */
|
||||
unsigned long num;
|
||||
unsigned short snum;
|
||||
snum = read_memory_unsigned_integer (addr, 2);
|
||||
num = D10V_MAKE_IADDR (snum);
|
||||
store_address (VALUE_CONTENTS_RAW (val), 4, num);
|
||||
}
|
||||
else if (GDB_TARGET_IS_D10V
|
||||
&& TYPE_CODE (type) == TYPE_CODE_PTR)
|
||||
{
|
||||
/* pointer to data */
|
||||
unsigned long num;
|
||||
unsigned short snum;
|
||||
snum = read_memory_unsigned_integer (addr, 2);
|
||||
num = D10V_MAKE_DADDR (snum);
|
||||
store_address (VALUE_CONTENTS_RAW (val), 4, num);
|
||||
}
|
||||
else
|
||||
read_memory (addr, VALUE_CONTENTS_ALL_RAW (val), TYPE_LENGTH (type));
|
||||
read_memory (addr, VALUE_CONTENTS_ALL_RAW (val), TYPE_LENGTH (type));
|
||||
|
||||
VALUE_LVAL (val) = lval_memory;
|
||||
VALUE_ADDRESS (val) = addr;
|
||||
@@ -545,29 +522,7 @@ value_fetch_lazy (register value_ptr val)
|
||||
int length = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (val));
|
||||
|
||||
struct type *type = VALUE_TYPE (val);
|
||||
if (GDB_TARGET_IS_D10V
|
||||
&& TYPE_CODE (type) == TYPE_CODE_PTR
|
||||
&& TYPE_TARGET_TYPE (type)
|
||||
&& (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC))
|
||||
{
|
||||
/* pointer to function */
|
||||
unsigned long num;
|
||||
unsigned short snum;
|
||||
snum = read_memory_unsigned_integer (addr, 2);
|
||||
num = D10V_MAKE_IADDR (snum);
|
||||
store_address (VALUE_CONTENTS_RAW (val), 4, num);
|
||||
}
|
||||
else if (GDB_TARGET_IS_D10V
|
||||
&& TYPE_CODE (type) == TYPE_CODE_PTR)
|
||||
{
|
||||
/* pointer to data */
|
||||
unsigned long num;
|
||||
unsigned short snum;
|
||||
snum = read_memory_unsigned_integer (addr, 2);
|
||||
num = D10V_MAKE_DADDR (snum);
|
||||
store_address (VALUE_CONTENTS_RAW (val), 4, num);
|
||||
}
|
||||
else if (length)
|
||||
if (length)
|
||||
read_memory (addr, VALUE_CONTENTS_ALL_RAW (val), length);
|
||||
|
||||
VALUE_LAZY (val) = 0;
|
||||
|
||||
Reference in New Issue
Block a user