From 9823e921f25c5221847898520b8be124b2ca0bec Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 10 Jul 2006 15:28:02 +0000 Subject: [PATCH] * alpha-tdep.h (struct gdbarch_tdep): Add return_in_memory. * alpha-tdep.c (alpha_register_byte): Remove. (alpha_extract_struct_value_address): Remove. (alpha_return_value): New. (alpha_return_in_memory_always): New. (alpha_gdbarch_init): Set tdep->return_in_memory. Don't call set_gdbarch_deprecated_register_byte. Do call set_gdbarch_return_value instead of set_gdbarch_deprecated_use_struct_convention, set_gdbarch_extract_return_value, set_gdbarch_store_return_value, or set_gdbarch_deprecated_extract_struct_value_address. * alphafbsd-tdep.c (alphafbsd_return_in_memory): Rename from alphafbsd_use_struct_convention, remove gcc_p argument. (alphafbsd_init_abi): Set tdep->return_in_memory instead of set_gdbarch_deprecated_use_struct_convention. --- gdb/ChangeLog | 17 +++++++++++++ gdb/alpha-tdep.c | 60 ++++++++++++++++++++++++++++---------------- gdb/alpha-tdep.h | 3 +++ gdb/alphafbsd-tdep.c | 6 ++--- 4 files changed, 60 insertions(+), 26 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a9aab62f58..5ee097d227 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2006-07-10 Richard Henderson + + * alpha-tdep.h (struct gdbarch_tdep): Add return_in_memory. + * alpha-tdep.c (alpha_register_byte): Remove. + (alpha_extract_struct_value_address): Remove. + (alpha_return_value): New. + (alpha_return_in_memory_always): New. + (alpha_gdbarch_init): Set tdep->return_in_memory. Don't call + set_gdbarch_deprecated_register_byte. Do call set_gdbarch_return_value + instead of set_gdbarch_deprecated_use_struct_convention, + set_gdbarch_extract_return_value, set_gdbarch_store_return_value, + or set_gdbarch_deprecated_extract_struct_value_address. + * alphafbsd-tdep.c (alphafbsd_return_in_memory): Rename from + alphafbsd_use_struct_convention, remove gcc_p argument. + (alphafbsd_init_abi): Set tdep->return_in_memory instead of + set_gdbarch_deprecated_use_struct_convention. + 2006-07-09 Mark Kettenis * alphabsd-tdep.h (alphanbsd_regset_from_core_section): New diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c index 4480b21164..afe1d2fc47 100644 --- a/gdb/alpha-tdep.c +++ b/gdb/alpha-tdep.c @@ -149,12 +149,6 @@ alpha_register_reggroup_p (struct gdbarch *gdbarch, int regnum, return group == general_reggroup; } -static int -alpha_register_byte (int regno) -{ - return (regno * 8); -} - /* The following represents exactly the conversion performed by the LDS instruction. This applies to both single-precision floating point and 32-bit integers. */ @@ -501,17 +495,6 @@ alpha_extract_return_value (struct type *valtype, struct regcache *regcache, } } -/* Extract from REGCACHE the address of a structure about to be returned - from a function. */ - -static CORE_ADDR -alpha_extract_struct_value_address (struct regcache *regcache) -{ - ULONGEST addr; - regcache_cooked_read_unsigned (regcache, ALPHA_V0_REGNUM, &addr); - return addr; -} - /* Insert the given value into REGCACHE as if it was being returned by a function. */ @@ -585,6 +568,41 @@ alpha_store_return_value (struct type *valtype, struct regcache *regcache, } } +static enum return_value_convention +alpha_return_value (struct gdbarch *gdbarch, struct type *type, + struct regcache *regcache, gdb_byte *readbuf, + const gdb_byte *writebuf) +{ + enum type_code code = TYPE_CODE (type); + + if ((code == TYPE_CODE_STRUCT + || code == TYPE_CODE_UNION + || code == TYPE_CODE_ARRAY) + && gdbarch_tdep (gdbarch)->return_in_memory (type)) + { + if (readbuf) + { + ULONGEST addr; + regcache_raw_read_unsigned (regcache, ALPHA_V0_REGNUM, &addr); + read_memory (addr, readbuf, TYPE_LENGTH (type)); + } + + return RETURN_VALUE_ABI_RETURNS_ADDRESS; + } + + if (readbuf) + alpha_extract_return_value (type, regcache, readbuf); + if (writebuf) + alpha_store_return_value (type, regcache, writebuf); + + return RETURN_VALUE_REGISTER_CONVENTION; +} + +static int +alpha_return_in_memory_always (struct type *type) +{ + return 1; +} static const unsigned char * alpha_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr) @@ -1551,6 +1569,8 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->jb_pc = -1; /* longjmp support not enabled by default */ + tdep->return_in_memory = alpha_return_in_memory_always; + /* Type sizes */ set_gdbarch_short_bit (gdbarch, 16); set_gdbarch_int_bit (gdbarch, 32); @@ -1568,7 +1588,6 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_fp0_regnum (gdbarch, ALPHA_FP0_REGNUM); set_gdbarch_register_name (gdbarch, alpha_register_name); - set_gdbarch_deprecated_register_byte (gdbarch, alpha_register_byte); set_gdbarch_register_type (gdbarch, alpha_register_type); set_gdbarch_cannot_fetch_register (gdbarch, alpha_cannot_fetch_register); @@ -1588,10 +1607,7 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Call info. */ - set_gdbarch_deprecated_use_struct_convention (gdbarch, always_use_struct_convention); - set_gdbarch_extract_return_value (gdbarch, alpha_extract_return_value); - set_gdbarch_store_return_value (gdbarch, alpha_store_return_value); - set_gdbarch_deprecated_extract_struct_value_address (gdbarch, alpha_extract_struct_value_address); + set_gdbarch_return_value (gdbarch, alpha_return_value); /* Settings for calling functions in the inferior. */ set_gdbarch_push_dummy_call (gdbarch, alpha_push_dummy_call); diff --git a/gdb/alpha-tdep.h b/gdb/alpha-tdep.h index ab6be39125..9ac564ef57 100644 --- a/gdb/alpha-tdep.h +++ b/gdb/alpha-tdep.h @@ -88,6 +88,9 @@ struct gdbarch_tdep sigtramp unwinders. */ int (*pc_in_sigtramp) (CORE_ADDR pc, char *name); + /* If TYPE will be returned in memory, return true. */ + int (*return_in_memory) (struct type *type); + /* Offset of registers in `struct sigcontext'. */ int sc_pc_offset; int sc_regs_offset; diff --git a/gdb/alphafbsd-tdep.c b/gdb/alphafbsd-tdep.c index 08d38629e1..4ea9625ecc 100644 --- a/gdb/alphafbsd-tdep.c +++ b/gdb/alphafbsd-tdep.c @@ -27,7 +27,7 @@ #include "solib-svr4.h" static int -alphafbsd_use_struct_convention (int gcc_p, struct type *type) +alphafbsd_return_in_memory (struct type *type) { enum type_code code; int i; @@ -104,12 +104,10 @@ alphafbsd_init_abi (struct gdbarch_info info, set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); - set_gdbarch_deprecated_use_struct_convention - (gdbarch, alphafbsd_use_struct_convention); - tdep->dynamic_sigtramp_offset = alphafbsd_sigtramp_offset; tdep->sigcontext_addr = alphafbsd_sigcontext_addr; tdep->pc_in_sigtramp = alphafbsd_pc_in_sigtramp; + tdep->return_in_memory = alphafbsd_return_in_memory; tdep->sc_pc_offset = 288; tdep->sc_regs_offset = 24; tdep->sc_fpregs_offset = 320;