* arch-utils.h (legacy_register_to_value): Declare.
(legacy_value_to_register): Declare. (legacy_convert_register_p): Declare. * arch-utils.c (legacy_register_to_value): New function. (legacy_value_to_register): New function. (legacy_convert_register_p): New function. * gdbarch.sh (REGISTER_TO_VALUE): Define. (VALUE_TO_REGISTER): Define. (CONVERT_REGISTER_P): Define. * gdbarch.h, gdbarch.c: Regenerate. * valops.c (value_assign): Use CONVERT_REGISTER_P and VALUE_TO_REGISTER. * findvar.c (value_from_register): Use REGISTER_TO_VALUE and CONVERT_REGISTER_P. * gdbint.texinfo (Target Architecture Definition): Document REGISTER_TO_VALUE and VALUE_TO_REGISTER and CONVERT_REGISTER_P. (Target Architecture Definition): Revise section `Using Different Register and Memory Data Representations'. Add section `Raw and Virtual Register Representations'.
This commit is contained in:
parent
4a1970e4a4
commit
13d0122493
10 changed files with 344 additions and 27 deletions
108
gdb/gdbarch.c
108
gdb/gdbarch.c
|
@ -200,6 +200,9 @@ struct gdbarch
|
|||
gdbarch_register_convertible_ftype *register_convertible;
|
||||
gdbarch_register_convert_to_virtual_ftype *register_convert_to_virtual;
|
||||
gdbarch_register_convert_to_raw_ftype *register_convert_to_raw;
|
||||
gdbarch_convert_register_p_ftype *convert_register_p;
|
||||
gdbarch_register_to_value_ftype *register_to_value;
|
||||
gdbarch_value_to_register_ftype *value_to_register;
|
||||
gdbarch_fetch_pseudo_register_ftype *fetch_pseudo_register;
|
||||
gdbarch_store_pseudo_register_ftype *store_pseudo_register;
|
||||
gdbarch_pointer_to_address_ftype *pointer_to_address;
|
||||
|
@ -399,6 +402,9 @@ struct gdbarch startup_gdbarch =
|
|||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
generic_in_function_epilogue_p,
|
||||
construct_inferior_arguments,
|
||||
0,
|
||||
|
@ -501,6 +507,9 @@ gdbarch_alloc (const struct gdbarch_info *info,
|
|||
current_gdbarch->init_frame_pc = init_frame_pc_default;
|
||||
current_gdbarch->coerce_float_to_double = default_coerce_float_to_double;
|
||||
current_gdbarch->register_convertible = generic_register_convertible_not;
|
||||
current_gdbarch->convert_register_p = legacy_convert_register_p;
|
||||
current_gdbarch->register_to_value = legacy_register_to_value;
|
||||
current_gdbarch->value_to_register = legacy_value_to_register;
|
||||
current_gdbarch->pointer_to_address = unsigned_pointer_to_address;
|
||||
current_gdbarch->address_to_pointer = unsigned_address_to_pointer;
|
||||
current_gdbarch->return_value_on_stack = generic_return_value_on_stack_not;
|
||||
|
@ -682,6 +691,9 @@ verify_gdbarch (struct gdbarch *gdbarch)
|
|||
/* Skip verify of register_convertible, invalid_p == 0 */
|
||||
/* Skip verify of register_convert_to_virtual, invalid_p == 0 */
|
||||
/* Skip verify of register_convert_to_raw, invalid_p == 0 */
|
||||
/* Skip verify of convert_register_p, invalid_p == 0 */
|
||||
/* Skip verify of register_to_value, invalid_p == 0 */
|
||||
/* Skip verify of value_to_register, invalid_p == 0 */
|
||||
/* Skip verify of fetch_pseudo_register, has predicate */
|
||||
/* Skip verify of store_pseudo_register, has predicate */
|
||||
/* Skip verify of pointer_to_address, invalid_p == 0 */
|
||||
|
@ -1011,6 +1023,17 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
|
|||
(long) current_gdbarch->convert_from_func_ptr_addr
|
||||
/*CONVERT_FROM_FUNC_PTR_ADDR ()*/);
|
||||
#endif
|
||||
#ifdef CONVERT_REGISTER_P
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: %s # %s\n",
|
||||
"CONVERT_REGISTER_P(regnum)",
|
||||
XSTRING (CONVERT_REGISTER_P (regnum)));
|
||||
if (GDB_MULTI_ARCH)
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: CONVERT_REGISTER_P = 0x%08lx\n",
|
||||
(long) current_gdbarch->convert_register_p
|
||||
/*CONVERT_REGISTER_P ()*/);
|
||||
#endif
|
||||
#ifdef DECR_PC_AFTER_BREAK
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: DECR_PC_AFTER_BREAK # %s\n",
|
||||
|
@ -1701,6 +1724,20 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
|
|||
"gdbarch_dump: REGISTER_SIZE = %d\n",
|
||||
REGISTER_SIZE);
|
||||
#endif
|
||||
#ifdef REGISTER_TO_VALUE
|
||||
#if GDB_MULTI_ARCH
|
||||
/* Macro might contain `[{}]' when not multi-arch */
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: %s # %s\n",
|
||||
"REGISTER_TO_VALUE(regnum, type, from, to)",
|
||||
XSTRING (REGISTER_TO_VALUE (regnum, type, from, to)));
|
||||
#endif
|
||||
if (GDB_MULTI_ARCH)
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: REGISTER_TO_VALUE = 0x%08lx\n",
|
||||
(long) current_gdbarch->register_to_value
|
||||
/*REGISTER_TO_VALUE ()*/);
|
||||
#endif
|
||||
#ifdef REGISTER_VIRTUAL_SIZE
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: %s # %s\n",
|
||||
|
@ -2155,6 +2192,20 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
|
|||
"gdbarch_dump: USE_STRUCT_CONVENTION = 0x%08lx\n",
|
||||
(long) current_gdbarch->use_struct_convention
|
||||
/*USE_STRUCT_CONVENTION ()*/);
|
||||
#endif
|
||||
#ifdef VALUE_TO_REGISTER
|
||||
#if GDB_MULTI_ARCH
|
||||
/* Macro might contain `[{}]' when not multi-arch */
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: %s # %s\n",
|
||||
"VALUE_TO_REGISTER(type, regnum, from, to)",
|
||||
XSTRING (VALUE_TO_REGISTER (type, regnum, from, to)));
|
||||
#endif
|
||||
if (GDB_MULTI_ARCH)
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: VALUE_TO_REGISTER = 0x%08lx\n",
|
||||
(long) current_gdbarch->value_to_register
|
||||
/*VALUE_TO_REGISTER ()*/);
|
||||
#endif
|
||||
if (current_gdbarch->dump_tdep != NULL)
|
||||
current_gdbarch->dump_tdep (current_gdbarch, file);
|
||||
|
@ -3539,6 +3590,63 @@ set_gdbarch_register_convert_to_raw (struct gdbarch *gdbarch,
|
|||
gdbarch->register_convert_to_raw = register_convert_to_raw;
|
||||
}
|
||||
|
||||
int
|
||||
gdbarch_convert_register_p (struct gdbarch *gdbarch, int regnum)
|
||||
{
|
||||
gdb_assert (gdbarch != NULL);
|
||||
if (gdbarch->convert_register_p == 0)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"gdbarch: gdbarch_convert_register_p invalid");
|
||||
if (gdbarch_debug >= 2)
|
||||
fprintf_unfiltered (gdb_stdlog, "gdbarch_convert_register_p called\n");
|
||||
return gdbarch->convert_register_p (regnum);
|
||||
}
|
||||
|
||||
void
|
||||
set_gdbarch_convert_register_p (struct gdbarch *gdbarch,
|
||||
gdbarch_convert_register_p_ftype convert_register_p)
|
||||
{
|
||||
gdbarch->convert_register_p = convert_register_p;
|
||||
}
|
||||
|
||||
void
|
||||
gdbarch_register_to_value (struct gdbarch *gdbarch, int regnum, struct type *type, char *from, char *to)
|
||||
{
|
||||
gdb_assert (gdbarch != NULL);
|
||||
if (gdbarch->register_to_value == 0)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"gdbarch: gdbarch_register_to_value invalid");
|
||||
if (gdbarch_debug >= 2)
|
||||
fprintf_unfiltered (gdb_stdlog, "gdbarch_register_to_value called\n");
|
||||
gdbarch->register_to_value (regnum, type, from, to);
|
||||
}
|
||||
|
||||
void
|
||||
set_gdbarch_register_to_value (struct gdbarch *gdbarch,
|
||||
gdbarch_register_to_value_ftype register_to_value)
|
||||
{
|
||||
gdbarch->register_to_value = register_to_value;
|
||||
}
|
||||
|
||||
void
|
||||
gdbarch_value_to_register (struct gdbarch *gdbarch, struct type *type, int regnum, char *from, char *to)
|
||||
{
|
||||
gdb_assert (gdbarch != NULL);
|
||||
if (gdbarch->value_to_register == 0)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"gdbarch: gdbarch_value_to_register invalid");
|
||||
if (gdbarch_debug >= 2)
|
||||
fprintf_unfiltered (gdb_stdlog, "gdbarch_value_to_register called\n");
|
||||
gdbarch->value_to_register (type, regnum, from, to);
|
||||
}
|
||||
|
||||
void
|
||||
set_gdbarch_value_to_register (struct gdbarch *gdbarch,
|
||||
gdbarch_value_to_register_ftype value_to_register)
|
||||
{
|
||||
gdbarch->value_to_register = value_to_register;
|
||||
}
|
||||
|
||||
int
|
||||
gdbarch_fetch_pseudo_register_p (struct gdbarch *gdbarch)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue