2003-11-07 Andrew Cagney <cagney@redhat.com>

* 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".
This commit is contained in:
Andrew Cagney 2003-11-07 20:44:51 +00:00
parent e2a2ebaad5
commit 05580c65ad
6 changed files with 108 additions and 127 deletions

View File

@ -1,3 +1,42 @@
2003-11-07 Andrew Cagney <cagney@redhat.com>
* 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 <kettenis@gnu.org>
* dwarf2-frame.c (dwarf2_build_frame_info): Wrap comment.

View File

@ -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. */

View File

@ -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)
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, 0);
return do_ppc_sysv_return_value (gdbarch, valtype, regcache, inval, outval, 0);
}
void
ppc_sysv_abi_broken_extract_return_value (struct type *type,
struct regcache *regcache,
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, NULL, valbuf, 1);
}
void
ppc_sysv_abi_store_return_value (struct type *type, struct regcache *regcache,
const void *valbuf)
{
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)

View File

@ -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);

View File

@ -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);
}

View File

@ -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);