diff options
author | Andrew Cagney <cagney@redhat.com> | 2002-05-12 03:09:12 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2002-05-12 03:09:12 +0000 |
commit | 13d0122493ff8353509896837bd61fdb571fdb09 (patch) | |
tree | bf0d3e8d96a2fa84d8c384be4072eed4294b9dc7 /gdb/gdbarch.c | |
parent | 4a1970e4a429204b221938e52804b9a2a5ec1001 (diff) | |
download | fsf-binutils-gdb-13d0122493ff8353509896837bd61fdb571fdb09.zip fsf-binutils-gdb-13d0122493ff8353509896837bd61fdb571fdb09.tar.gz fsf-binutils-gdb-13d0122493ff8353509896837bd61fdb571fdb09.tar.bz2 |
* 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'.
Diffstat (limited to 'gdb/gdbarch.c')
-rw-r--r-- | gdb/gdbarch.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 38c8843..52cc959 100644 --- a/gdb/gdbarch.c +++ b/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", @@ -2156,6 +2193,20 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) (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); } @@ -3540,6 +3591,63 @@ set_gdbarch_register_convert_to_raw (struct gdbarch *gdbarch, } 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) { gdb_assert (gdbarch != NULL); |