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:
parent
e2a2ebaad5
commit
05580c65ad
6 changed files with 108 additions and 127 deletions
|
@ -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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue