X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fppc-tdep.h;h=68919b4f9d7602502762177a0832a275c6d8f456;hb=867e2dc5ace860a0f3ed7abfd17331877976926d;hp=dd84fd13078263c8f0a3ea44776b73835428e243;hpb=4a4b3fedfec42967926860950ee4fae2f01af98e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h index dd84fd1307..68919b4f9d 100644 --- a/gdb/ppc-tdep.h +++ b/gdb/ppc-tdep.h @@ -1,6 +1,7 @@ /* Target-dependent code for GDB, the GNU debugger. - Copyright 2000, 2001, 2002, 2003 - Free Software Foundation, Inc. + + Copyright 2000, 2001, 2002, 2003, 2004 Free Software Foundation, + Inc. This file is part of GDB. @@ -26,15 +27,19 @@ struct gdbarch; struct frame_info; struct value; struct regcache; +struct type; /* From ppc-linux-tdep.c... */ -CORE_ADDR ppc_linux_frame_saved_pc (struct frame_info *fi); -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 *); -int ppc_sysv_abi_broken_use_struct_convention (int, struct type *); +enum return_value_convention ppc_sysv_abi_return_value (struct gdbarch *gdbarch, + struct type *valtype, + struct regcache *regcache, + void *readbuf, + const void *writebuf); +enum return_value_convention ppc_sysv_abi_broken_return_value (struct gdbarch *gdbarch, + struct type *valtype, + struct regcache *regcache, + void *readbuf, + const void *writebuf); CORE_ADDR ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, struct regcache *regcache, @@ -42,25 +47,96 @@ CORE_ADDR ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr); +CORE_ADDR ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, + CORE_ADDR func_addr, + struct regcache *regcache, + CORE_ADDR bp_addr, int nargs, + struct value **args, CORE_ADDR sp, + int struct_return, + CORE_ADDR struct_addr); +CORE_ADDR ppc64_sysv_abi_adjust_breakpoint_address (struct gdbarch *gdbarch, + CORE_ADDR bpaddr); int ppc_linux_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache); 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); +void ppc_linux_supply_gregset (struct regcache *regcache, + int regnum, const void *gregs, size_t size, + int wordsize); +void ppc_linux_supply_fpregset (const struct regset *regset, + struct regcache *regcache, + int regnum, const void *gregs, size_t size); +enum return_value_convention ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, + struct type *valtype, + struct regcache *regcache, + void *readbuf, + const void *writebuf); /* From rs6000-tdep.c... */ -CORE_ADDR rs6000_frame_saved_pc (struct frame_info *fi); -void rs6000_init_extra_frame_info (int fromleaf, struct frame_info *); -int rs6000_frameless_function_invocation (struct frame_info *); -void rs6000_frame_init_saved_regs (struct frame_info *); -CORE_ADDR rs6000_frame_chain (struct frame_info *); int altivec_register_p (int regno); +int spe_register_p (int regno); - -/* Return non-zero when the architecture has an FPU (or at least when - the ABI is using the FPU). */ +/* Return non-zero if the architecture described by GDBARCH has + floating-point registers (f0 --- f31 and fpscr). */ int ppc_floating_point_unit_p (struct gdbarch *gdbarch); +/* Register set description. */ + +struct ppc_reg_offsets +{ + /* General-purpose registers. */ + int r0_offset; + int pc_offset; + int ps_offset; + int cr_offset; + int lr_offset; + int ctr_offset; + int xer_offset; + int mq_offset; + + /* Floating-point registers. */ + int f0_offset; + int fpscr_offset; + + /* AltiVec registers. */ + int vr0_offset; + int vscr_offset; + int vrsave_offset; +}; + +/* Supply register REGNUM in the general-purpose register set REGSET + from the buffer specified by GREGS and LEN to register cache + REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */ + +extern void ppc_supply_gregset (const struct regset *regset, + struct regcache *regcache, + int regnum, const void *gregs, size_t len); + +/* Supply register REGNUM in the floating-point register set REGSET + from the buffer specified by FPREGS and LEN to register cache + REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */ + +extern void ppc_supply_fpregset (const struct regset *regset, + struct regcache *regcache, + int regnum, const void *fpregs, size_t len); + +/* Collect register REGNUM in the general-purpose register set + REGSET. from register cache REGCACHE into the buffer specified by + GREGS and LEN. If REGNUM is -1, do this for all registers in + REGSET. */ + +extern void ppc_collect_gregset (const struct regset *regset, + const struct regcache *regcache, + int regnum, void *gregs, size_t len); + +/* Collect register REGNUM in the floating-point register set + REGSET. from register cache REGCACHE into the buffer specified by + FPREGS and LEN. If REGNUM is -1, do this for all registers in + REGSET. */ + +extern void ppc_collect_fpregset (const struct regset *regset, + const struct regcache *regcache, + int regnum, void *fpregs, size_t len); + /* Private data that this module attaches to struct gdbarch. */ struct gdbarch_tdep @@ -69,22 +145,36 @@ struct gdbarch_tdep int *regoff; /* byte offsets in register arrays */ const struct reg *regs; /* from current variant */ int ppc_gp0_regnum; /* GPR register 0 */ - int ppc_gplast_regnum; /* GPR register 31 */ int ppc_toc_regnum; /* TOC register */ int ppc_ps_regnum; /* Processor (or machine) status (%msr) */ int ppc_cr_regnum; /* Condition register */ int ppc_lr_regnum; /* Link register */ int ppc_ctr_regnum; /* Count register */ int ppc_xer_regnum; /* Integer exception register */ + + /* On PPC and RS6000 variants that have no floating-point + registers, the next two members will be -1. */ + int ppc_fp0_regnum; /* floating-point register 0 */ int ppc_fpscr_regnum; /* Floating point status and condition register */ + int ppc_mq_regnum; /* Multiply/Divide extension register */ int ppc_vr0_regnum; /* First AltiVec register */ int ppc_vrsave_regnum; /* Last AltiVec register */ int ppc_ev0_regnum; /* First ev register */ int ppc_ev31_regnum; /* Last ev register */ + int ppc_acc_regnum; /* SPE 'acc' register */ + int ppc_spefscr_regnum; /* SPE 'spefscr' register */ int lr_frame_offset; /* Offset to ABI specific location where link register is saved. */ }; + +/* Constants for register set sizes. */ +enum + { + ppc_num_gprs = 32, /* 32 general-purpose registers */ + ppc_num_fprs = 32 /* 32 floating-point registers */ + }; + #endif