From 05580c65ad432b4dfab9283a4573bc812835375a Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Fri, 7 Nov 2003 20:44:51 +0000 Subject: [PATCH] 2003-11-07 Andrew Cagney * ppc-linux-tdep.c (ppc_linux_init_abi): When 32-bit GNU/Linux, set "return_value" instead of "use_struct_convention". (ppc_linux_use_struct_convention): Delete function. (ppc_linux_return_value): New function. * ppc-sysv-tdep.c (ppc_sysv_abi_return_value): New function. (ppc_sysv_abi_broken_return_value): New function. (do_ppc_sysv_return_value): Add "gdbarch" parameter. (ppc64_sysv_abi_push_dummy_call): Add "gdbarch" parameter, drop static. (ppc_sysv_abi_extract_return_value): Delete function. (ppc_sysv_abi_broken_extract_return_value): Delete function. (ppc_sysv_abi_store_return_value): Delete function. (ppc_sysv_abi_broken_store_return_value): Delete function. (ppc_sysv_abi_use_struct_convention): Delete function. (ppc64_sysv_abi_use_struct_convention): Delete function. (ppc64_sysv_abi_extract_return_value): Delete function. (ppc64_sysv_abi_store_return_value): Delete function. * ppcnbsd-tdep.c (ppcnbsd_return_value): New function. (ppcnbsd_init_abi): Set "return_value", instead of "use_struct_convention", "extract_return_value", and "store_return_value". (ppcnbsd_use_struct_convention): Delete function. * ppc-tdep.h (ppc64_sysv_abi_return_value): Declare. (ppc_sysv_abi_return_value): Declare. (ppc_sysv_abi_broken_return_value): Declare. (ppc_sysv_abi_use_struct_convention): Delete. (ppc_sysv_abi_store_return_value): Delete. (ppc_sysv_abi_extract_return_value): Delete. (ppc_sysv_abi_broken_store_return_value): Delete. (ppc_sysv_abi_broken_extract_return_value): Delete. (ppc64_sysv_abi_use_struct_convention): Delete. (ppc64_sysv_abi_extract_return_value): Delete. (ppc64_sysv_abi_store_return_value): Delete. * rs6000-tdep.c (rs6000_gdbarch_init): For 32-bit and 64-bit SYSV, set "return_value" instead of "extract_return_value", "store_return_value", and "use_struct_convention". --- gdb/ChangeLog | 39 ++++++++++++++++++ gdb/ppc-linux-tdep.c | 18 +++++---- gdb/ppc-sysv-tdep.c | 94 +++++++++++--------------------------------- gdb/ppc-tdep.h | 36 +++++++---------- gdb/ppcnbsd-tdep.c | 31 ++++++++------- gdb/rs6000-tdep.c | 17 ++------ 6 files changed, 108 insertions(+), 127 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 71b6df2489..adce433df2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,42 @@ +2003-11-07 Andrew Cagney + + * ppc-linux-tdep.c (ppc_linux_init_abi): When 32-bit GNU/Linux, + set "return_value" instead of "use_struct_convention". + (ppc_linux_use_struct_convention): Delete function. + (ppc_linux_return_value): New function. + * ppc-sysv-tdep.c (ppc_sysv_abi_return_value): New function. + (ppc_sysv_abi_broken_return_value): New function. + (do_ppc_sysv_return_value): Add "gdbarch" parameter. + (ppc64_sysv_abi_push_dummy_call): Add "gdbarch" parameter, drop + static. + (ppc_sysv_abi_extract_return_value): Delete function. + (ppc_sysv_abi_broken_extract_return_value): Delete function. + (ppc_sysv_abi_store_return_value): Delete function. + (ppc_sysv_abi_broken_store_return_value): Delete function. + (ppc_sysv_abi_use_struct_convention): Delete function. + (ppc64_sysv_abi_use_struct_convention): Delete function. + (ppc64_sysv_abi_extract_return_value): Delete function. + (ppc64_sysv_abi_store_return_value): Delete function. + * ppcnbsd-tdep.c (ppcnbsd_return_value): New function. + (ppcnbsd_init_abi): Set "return_value", instead of + "use_struct_convention", "extract_return_value", and + "store_return_value". + (ppcnbsd_use_struct_convention): Delete function. + * ppc-tdep.h (ppc64_sysv_abi_return_value): Declare. + (ppc_sysv_abi_return_value): Declare. + (ppc_sysv_abi_broken_return_value): Declare. + (ppc_sysv_abi_use_struct_convention): Delete. + (ppc_sysv_abi_store_return_value): Delete. + (ppc_sysv_abi_extract_return_value): Delete. + (ppc_sysv_abi_broken_store_return_value): Delete. + (ppc_sysv_abi_broken_extract_return_value): Delete. + (ppc64_sysv_abi_use_struct_convention): Delete. + (ppc64_sysv_abi_extract_return_value): Delete. + (ppc64_sysv_abi_store_return_value): Delete. + * rs6000-tdep.c (rs6000_gdbarch_init): For 32-bit and 64-bit SYSV, + set "return_value" instead of "extract_return_value", + "store_return_value", and "use_struct_convention". + 2003-11-07 Mark Kettenis * dwarf2-frame.c (dwarf2_build_frame_info): Wrap comment. diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index 397f61667f..c094efeb18 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -596,13 +596,17 @@ ppc_linux_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache) structures, no matter their size, are put in memory. Vectors, which were added later, do get returned in a register though. */ -static int -ppc_linux_use_struct_convention (int gcc_p, struct type *value_type) +static enum return_value_convention +ppc_linux_return_value (struct gdbarch *gdbarch, struct type *valtype, + struct regcache *regcache, const void *inval, void *outval) { - if ((TYPE_LENGTH (value_type) == 16 || TYPE_LENGTH (value_type) == 8) - && TYPE_VECTOR (value_type)) - return 0; - return 1; + if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT + || TYPE_CODE (valtype) == TYPE_CODE_UNION) + && !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8) + && TYPE_VECTOR (valtype))) + return RETURN_VALUE_STRUCT_CONVENTION; + else + return ppc_sysv_abi_return_value (gdbarch, valtype, regcache, inval, outval); } /* Fetch (and possibly build) an appropriate link_map_offsets @@ -1043,7 +1047,7 @@ ppc_linux_init_abi (struct gdbarch_info info, (well ignoring vectors that is). When this was corrected, it wasn't fixed for GNU/Linux native platform. Use the PowerOpen struct convention. */ - set_gdbarch_use_struct_convention (gdbarch, ppc_linux_use_struct_convention); + set_gdbarch_return_value (gdbarch, ppc_linux_return_value); /* Note: kevinb/2002-04-12: See note in rs6000_gdbarch_init regarding *_push_arguments(). The same remarks hold for the methods below. */ diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c index 02f2ea256d..a1f5282439 100644 --- a/gdb/ppc-sysv-tdep.c +++ b/gdb/ppc-sysv-tdep.c @@ -322,22 +322,22 @@ ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, when returned in general-purpose registers. */ static enum return_value_convention -do_ppc_sysv_return_value (struct type *type, struct regcache *regcache, - const void *inval, void *outval, int broken_gcc) +do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *type, + struct regcache *regcache, const void *inval, + void *outval, int broken_gcc) { - struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); gdb_assert (tdep->wordsize == 4); if (TYPE_CODE (type) == TYPE_CODE_FLT && TYPE_LENGTH (type) <= 8 - && ppc_floating_point_unit_p (current_gdbarch)) + && ppc_floating_point_unit_p (gdbarch)) { if (outval) { /* Floats and doubles stored in "f1". Convert the value to the required type. */ char regval[MAX_REGISTER_SIZE]; - struct type *regtype = register_type (current_gdbarch, - FP0_REGNUM + 1); + struct type *regtype = register_type (gdbarch, FP0_REGNUM + 1); regcache_cooked_read (regcache, FP0_REGNUM + 1, regval); convert_typed_floating (regval, regtype, outval, type); } @@ -346,7 +346,7 @@ do_ppc_sysv_return_value (struct type *type, struct regcache *regcache, /* Floats and doubles stored in "f1". Convert the value to the register's "double" type. */ char regval[MAX_REGISTER_SIZE]; - struct type *regtype = register_type (current_gdbarch, FP0_REGNUM); + struct type *regtype = register_type (gdbarch, FP0_REGNUM); convert_typed_floating (inval, type, regval, regtype); regcache_cooked_write (regcache, FP0_REGNUM + 1, regval); } @@ -510,43 +510,19 @@ do_ppc_sysv_return_value (struct type *type, struct regcache *regcache, return RETURN_VALUE_STRUCT_CONVENTION; } -void -ppc_sysv_abi_extract_return_value (struct type *type, - struct regcache *regcache, void *valbuf) -{ - do_ppc_sysv_return_value (type, regcache, NULL, valbuf, 0); -} - -void -ppc_sysv_abi_broken_extract_return_value (struct type *type, - struct regcache *regcache, - void *valbuf) +enum return_value_convention +ppc_sysv_abi_return_value (struct gdbarch *gdbarch, struct type *valtype, + struct regcache *regcache, const void *inval, void *outval) { - do_ppc_sysv_return_value (type, regcache, NULL, valbuf, 1); + return do_ppc_sysv_return_value (gdbarch, valtype, regcache, inval, outval, 0); } -void -ppc_sysv_abi_store_return_value (struct type *type, struct regcache *regcache, - const void *valbuf) +enum return_value_convention +ppc_sysv_abi_broken_return_value (struct gdbarch *gdbarch, struct type *valtype, + struct regcache *regcache, const void *inval, + void *outval) { - do_ppc_sysv_return_value (type, regcache, valbuf, NULL, 0); -} - -void -ppc_sysv_abi_broken_store_return_value (struct type *type, - struct regcache *regcache, - const void *valbuf) -{ - do_ppc_sysv_return_value (type, regcache, valbuf, NULL, 1); -} - -/* Structures 8 bytes or less long are returned in the r3 & r4 - registers, according to the SYSV ABI. */ -int -ppc_sysv_abi_use_struct_convention (int gcc_p, struct type *value_type) -{ - return (do_ppc_sysv_return_value (value_type, NULL, NULL, NULL, 0) - == RETURN_VALUE_STRUCT_CONVENTION); + return do_ppc_sysv_return_value (gdbarch, valtype, regcache, inval, outval, 1); } /* Pass the arguments in either registers, or in the stack. Using the @@ -849,16 +825,17 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, copy the buffer to the corresponding register return-value location location; when OUTVAL is non-NULL, fill the buffer from the corresponding register return-value location. */ -static enum return_value_convention -ppc64_sysv_abi_return_value (struct type *valtype, struct regcache *regcache, - const void *inval, void *outval) +enum return_value_convention +ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct type *valtype, + struct regcache *regcache, const void *inval, + void *outval) { - struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* Floats and doubles in F1. */ if (TYPE_CODE (valtype) == TYPE_CODE_FLT && TYPE_LENGTH (valtype) <= 8) { char regval[MAX_REGISTER_SIZE]; - struct type *regtype = register_type (current_gdbarch, FP0_REGNUM); + struct type *regtype = register_type (gdbarch, FP0_REGNUM); if (inval != NULL) { convert_typed_floating (inval, valtype, regval, regtype); @@ -907,7 +884,7 @@ ppc64_sysv_abi_return_value (struct type *valtype, struct regcache *regcache, && TYPE_LENGTH (TYPE_TARGET_TYPE (valtype)) == 1) { /* Small character arrays are returned, right justified, in r3. */ - int offset = (register_size (current_gdbarch, tdep->ppc_gp0_regnum + 3) + int offset = (register_size (gdbarch, tdep->ppc_gp0_regnum + 3) - TYPE_LENGTH (valtype)); if (inval != NULL) regcache_cooked_write_part (regcache, tdep->ppc_gp0_regnum + 3, @@ -990,31 +967,6 @@ ppc64_sysv_abi_return_value (struct type *valtype, struct regcache *regcache, return RETURN_VALUE_STRUCT_CONVENTION; } -int -ppc64_sysv_abi_use_struct_convention (int gcc_p, struct type *value_type) -{ - return (ppc64_sysv_abi_return_value (value_type, NULL, NULL, NULL) - == RETURN_VALUE_STRUCT_CONVENTION); -} - -void -ppc64_sysv_abi_extract_return_value (struct type *valtype, - struct regcache *regbuf, void *valbuf) -{ - if (ppc64_sysv_abi_return_value (valtype, regbuf, NULL, valbuf) - != RETURN_VALUE_REGISTER_CONVENTION) - error ("Function return value unknown"); -} - -void -ppc64_sysv_abi_store_return_value (struct type *valtype, - struct regcache *regbuf, - const void *valbuf) -{ - if (!ppc64_sysv_abi_return_value (valtype, regbuf, valbuf, NULL)) - error ("Function return value location unknown"); -} - CORE_ADDR ppc64_sysv_abi_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr) diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h index 346ac8ebc5..7adf579560 100644 --- a/gdb/ppc-tdep.h +++ b/gdb/ppc-tdep.h @@ -34,19 +34,16 @@ void ppc_linux_init_extra_frame_info (int fromleaf, struct frame_info *); int ppc_linux_frameless_function_invocation (struct frame_info *); void ppc_linux_frame_init_saved_regs (struct frame_info *); CORE_ADDR ppc_linux_frame_chain (struct frame_info *); -int ppc_sysv_abi_use_struct_convention (int, struct type *); -void ppc_sysv_abi_store_return_value (struct type *type, - struct regcache *regcache, - const void *valbuf); -void ppc_sysv_abi_extract_return_value (struct type *type, - struct regcache *regcache, - void *valbuf); -void ppc_sysv_abi_broken_store_return_value (struct type *type, - struct regcache *regcache, - const void *valbuf); -void ppc_sysv_abi_broken_extract_return_value (struct type *type, - struct regcache *regcache, - void *valbuf); +enum return_value_convention ppc_sysv_abi_return_value (struct gdbarch *gdbarch, + struct type *valtype, + struct regcache *regcache, + const void *inval, + void *outval); +enum return_value_convention ppc_sysv_abi_broken_return_value (struct gdbarch *gdbarch, + struct type *valtype, + struct regcache *regcache, + const void *inval, + void *outval); CORE_ADDR ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, struct regcache *regcache, @@ -68,14 +65,11 @@ struct link_map_offsets *ppc_linux_svr4_fetch_link_map_offsets (void); void ppc_linux_supply_gregset (char *buf); void ppc_linux_supply_fpregset (char *buf); -int ppc64_sysv_abi_use_struct_convention (int gcc_p, struct type *value_type); -void ppc64_sysv_abi_extract_return_value (struct type *valtype, - struct regcache *regbuf, - void *valbuf); -void ppc64_sysv_abi_store_return_value (struct type *valtype, - struct regcache *regbuf, - const void *valbuf); - +enum return_value_convention ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, + struct type *valtype, + struct regcache *regcache, + const void *inval, + void *outval); /* From rs6000-tdep.c... */ CORE_ADDR rs6000_frame_saved_pc (struct frame_info *fi); diff --git a/gdb/ppcnbsd-tdep.c b/gdb/ppcnbsd-tdep.c index b566f30e4f..ab535c4feb 100644 --- a/gdb/ppcnbsd-tdep.c +++ b/gdb/ppcnbsd-tdep.c @@ -208,17 +208,22 @@ ppcnbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name) convention but, 1.6 switched to the below broken convention. For the moment use the broken convention. Ulgh!. */ -static int -ppcnbsd_use_struct_convention (int gcc_p, struct type *value_type) -{ - if ((TYPE_LENGTH (value_type) == 16 || TYPE_LENGTH (value_type) == 8) - && TYPE_VECTOR (value_type)) - return 0; - - return !(TYPE_LENGTH (value_type) == 1 - || TYPE_LENGTH (value_type) == 2 - || TYPE_LENGTH (value_type) == 4 - || TYPE_LENGTH (value_type) == 8); +static enum return_value_convention +ppcnbsd_return_value (struct gdbarch *gdbarch, struct type *valtype, + struct regcache *regcache, const void *inval, void *outval) +{ + if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT + || TYPE_CODE (valtype) == TYPE_CODE_UNION) + && !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8) + && TYPE_VECTOR (valtype)) + && !(TYPE_LENGTH (valtype) == 1 + || TYPE_LENGTH (valtype) == 2 + || TYPE_LENGTH (valtype) == 4 + || TYPE_LENGTH (valtype) == 8)) + return RETURN_VALUE_STRUCT_CONVENTION; + else + return ppc_sysv_abi_broken_return_value (gdbarch, valtype, regcache, + inval, outval); } static void @@ -228,9 +233,7 @@ ppcnbsd_init_abi (struct gdbarch_info info, set_gdbarch_pc_in_sigtramp (gdbarch, ppcnbsd_pc_in_sigtramp); /* For NetBSD, this is an on again, off again thing. Some systems do use the broken struct convention, and some don't. */ - set_gdbarch_use_struct_convention (gdbarch, ppcnbsd_use_struct_convention); - set_gdbarch_extract_return_value (gdbarch, ppc_sysv_abi_broken_extract_return_value); - set_gdbarch_store_return_value (gdbarch, ppc_sysv_abi_broken_store_return_value); + set_gdbarch_return_value (gdbarch, ppcnbsd_return_value); set_solib_svr4_fetch_link_map_offsets (gdbarch, nbsd_ilp32_solib_svr4_fetch_link_map_offsets); } diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 87ed4dcf9b..bc08fbd365 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -2750,15 +2750,9 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_sp_regnum (gdbarch, 1); set_gdbarch_deprecated_fp_regnum (gdbarch, 1); if (sysv_abi && wordsize == 8) - { - set_gdbarch_extract_return_value (gdbarch, ppc64_sysv_abi_extract_return_value); - set_gdbarch_store_return_value (gdbarch, ppc64_sysv_abi_store_return_value); - } + set_gdbarch_return_value (gdbarch, ppc64_sysv_abi_return_value); else if (sysv_abi && wordsize == 4) - { - set_gdbarch_extract_return_value (gdbarch, ppc_sysv_abi_extract_return_value); - set_gdbarch_store_return_value (gdbarch, ppc_sysv_abi_store_return_value); - } + set_gdbarch_return_value (gdbarch, ppc_sysv_abi_return_value); else { set_gdbarch_deprecated_extract_return_value (gdbarch, rs6000_extract_return_value); @@ -2907,12 +2901,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Not sure on this. FIXMEmgo */ set_gdbarch_frame_args_skip (gdbarch, 8); - if (sysv_abi && wordsize == 4) - set_gdbarch_use_struct_convention (gdbarch, - ppc_sysv_abi_use_struct_convention); - else if (sysv_abi && wordsize == 8) - set_gdbarch_use_struct_convention (gdbarch, ppc64_sysv_abi_use_struct_convention); - else + if (!sysv_abi) set_gdbarch_use_struct_convention (gdbarch, rs6000_use_struct_convention); -- 2.34.1