]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/ppc-tdep.h
Update Copyright year range in all files maintained by GDB.
[thirdparty/binutils-gdb.git] / gdb / ppc-tdep.h
index 76fcf9e76ab590fabb1a2dbb93dfd5447de40c98..e6a19b2e0be98c6868357590163c7e4f431bc0bb 100644 (file)
@@ -1,7 +1,6 @@
 /* Target-dependent code for GDB, the GNU debugger.
 
-   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 2000-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -27,13 +26,15 @@ struct value;
 struct regcache;
 struct type;
 
-/* From ppc-linux-tdep.c... */
+/* From ppc-sysv-tdep.c ...  */
 enum return_value_convention ppc_sysv_abi_return_value (struct gdbarch *gdbarch,
+                                                       struct value *function,
                                                        struct type *valtype,
                                                        struct regcache *regcache,
                                                        gdb_byte *readbuf,
                                                        const gdb_byte *writebuf);
 enum return_value_convention ppc_sysv_abi_broken_return_value (struct gdbarch *gdbarch,
+                                                              struct value *function,
                                                               struct type *valtype,
                                                               struct regcache *regcache,
                                                               gdb_byte *readbuf,
@@ -52,27 +53,32 @@ CORE_ADDR ppc64_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_adjust_breakpoint_address (struct gdbarch *gdbarch,
-                                                   CORE_ADDR bpaddr);
-int ppc_linux_memory_remove_breakpoint (struct bp_target_info *bp_tgt);
-struct link_map_offsets *ppc_linux_svr4_fetch_link_map_offsets (void);
-const struct regset *ppc_linux_gregset (int);
-const struct regset *ppc_linux_fpregset (void);
-
 enum return_value_convention ppc64_sysv_abi_return_value (struct gdbarch *gdbarch,
+                                                         struct value *function,
                                                          struct type *valtype,
                                                          struct regcache *regcache,
                                                          gdb_byte *readbuf,
                                                          const gdb_byte *writebuf);
 
-/* From rs6000-tdep.c... */
-int altivec_register_p (int regno);
-int spe_register_p (int regno);
+/* From rs6000-tdep.c...  */
+int altivec_register_p (struct gdbarch *gdbarch, int regno);
+int vsx_register_p (struct gdbarch *gdbarch, int regno);
+int spe_register_p (struct gdbarch *gdbarch, int regno);
 
 /* 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);
 
+/* Return non-zero if the architecture described by GDBARCH has
+   Altivec registers (vr0 --- vr31, vrsave and vscr).  */
+int ppc_altivec_support_p (struct gdbarch *gdbarch);
+
+/* Return non-zero if the architecture described by GDBARCH has
+   VSX registers (vsr0 --- vsr63).  */
+int vsx_support_p (struct gdbarch *gdbarch);
+int ppc_deal_with_atomic_sequence (struct frame_info *frame);
+
+
 /* Register set description.  */
 
 struct ppc_reg_offsets
@@ -100,6 +106,12 @@ struct ppc_reg_offsets
   int vrsave_offset;
 };
 
+extern void ppc_supply_reg (struct regcache *regcache, int regnum,
+                           const gdb_byte *regs, size_t offset, int regsize);
+
+extern void ppc_collect_reg (const struct regcache *regcache, int regnum,
+                            gdb_byte *regs, size_t offset, int regsize);
+
 /* 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.  */
@@ -116,8 +128,24 @@ extern void ppc_supply_fpregset (const struct regset *regset,
                                 struct regcache *regcache,
                                 int regnum, const void *fpregs, size_t len);
 
+/* Supply register REGNUM in the Altivec register set REGSET
+   from the buffer specified by VRREGS and LEN to register cache
+   REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
+
+extern void ppc_supply_vrregset (const struct regset *regset,
+                                struct regcache *regcache,
+                                int regnum, const void *vrregs, size_t len);
+
+/* Supply register REGNUM in the VSX register set REGSET
+   from the buffer specified by VSXREGS and LEN to register cache
+   REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
+
+extern void ppc_supply_vsxregset (const struct regset *regset,
+                                struct regcache *regcache,
+                                int regnum, const void *vsxregs, size_t len);
+
 /* Collect register REGNUM in the general-purpose register set
-   REGSET. from register cache REGCACHE into the buffer specified by
+   REGSET, from register cache REGCACHE into the buffer specified by
    GREGS and LEN.  If REGNUM is -1, do this for all registers in
    REGSET.  */
 
@@ -126,7 +154,7 @@ extern void ppc_collect_gregset (const struct regset *regset,
                                 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
+   REGSET, from register cache REGCACHE into the buffer specified by
    FPREGS and LEN.  If REGNUM is -1, do this for all registers in
    REGSET.  */
 
@@ -134,11 +162,44 @@ 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. */
+/* Collect register REGNUM in the Altivec register set
+   REGSET from register cache REGCACHE into the buffer specified by
+   VRREGS and LEN.  If REGNUM is -1, do this for all registers in
+   REGSET.  */
+
+extern void ppc_collect_vrregset (const struct regset *regset,
+                                 const struct regcache *regcache,
+                                 int regnum, void *vrregs, size_t len);
+
+/* Collect register REGNUM in the VSX register set
+   REGSET from register cache REGCACHE into the buffer specified by
+   VSXREGS and LEN.  If REGNUM is -1, do this for all registers in
+   REGSET.  */
+
+extern void ppc_collect_vsxregset (const struct regset *regset,
+                                 const struct regcache *regcache,
+                                 int regnum, void *vsxregs, size_t len);
+
+/* Private data that this module attaches to struct gdbarch.  */
+
+/* Vector ABI used by the inferior.  */
+enum powerpc_vector_abi
+{
+  POWERPC_VEC_AUTO,
+  POWERPC_VEC_GENERIC,
+  POWERPC_VEC_ALTIVEC,
+  POWERPC_VEC_SPE,
+  POWERPC_VEC_LAST
+};
 
 struct gdbarch_tdep
   {
-    int wordsize;              /* size in bytes of fixed-point word */
+    int wordsize;              /* Size in bytes of fixed-point word.  */
+    int soft_float;            /* Avoid FP registers for arguments?  */
+
+    /* How to pass vector arguments.  Never set to AUTO or LAST.  */
+    enum powerpc_vector_abi vector_abi;
+
     int ppc_gp0_regnum;                /* GPR register 0 */
     int ppc_toc_regnum;                /* TOC register */
     int ppc_ps_regnum;         /* Processor (or machine) status (%msr) */
@@ -152,22 +213,29 @@ struct gdbarch_tdep
        is not present in this variant.  */
 
     /* Floating-point registers.  */
-    int ppc_fp0_regnum;         /* floating-point register 0 */
-    int ppc_fpscr_regnum;      /* fp status and condition register */
+    int ppc_fp0_regnum;         /* Floating-point register 0.  */
+    int ppc_fpscr_regnum;      /* fp status and condition register */
 
     /* Multiplier-Quotient Register (older POWER architectures only).  */
     int ppc_mq_regnum;
 
+    /* POWER7 VSX registers.  */
+    int ppc_vsr0_regnum;       /* First VSX register.  */
+    int ppc_vsr0_upper_regnum;  /* First right most dword vsx register.  */
+    int ppc_efpr0_regnum;      /* First Extended FP register.  */
+
     /* Altivec registers.  */
-    int ppc_vr0_regnum;                /* First AltiVec register */
-    int ppc_vrsave_regnum;     /* Last AltiVec register */
+    int ppc_vr0_regnum;                /* First AltiVec register */
+    int ppc_vrsave_regnum;     /* Last AltiVec register */
 
     /* SPE registers.  */
-    int ppc_ev0_upper_regnum;   /* First GPR upper half 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 ppc_ev0_upper_regnum;   /* First GPR upper half register.  */
+    int ppc_ev0_regnum;         /* First ev register.  */
+    int ppc_acc_regnum;         /* SPE 'acc' register.  */
+    int ppc_spefscr_regnum;     /* SPE 'spefscr' register.  */
+
+    /* Decimal 128 registers.  */
+    int ppc_dl0_regnum;                /* First Decimal128 argument register pair.  */
 
     /* Offset to ABI specific location where link register is saved.  */
     int lr_frame_offset;       
@@ -177,21 +245,22 @@ struct gdbarch_tdep
        simulator does not implement that register.  */
     int *sim_regno;
 
-    /* Minimum possible text address.  */
-    CORE_ADDR text_segment_base;
-
     /* ISA-specific types.  */
     struct type *ppc_builtin_type_vec64;
+    struct type *ppc_builtin_type_vec128;
 };
 
 
 /* Constants for register set sizes.  */
 enum
   {
-    ppc_num_gprs = 32,          /* 32 general-purpose registers */
-    ppc_num_fprs = 32,          /* 32 floating-point registers */
-    ppc_num_srs = 16,           /* 16 segment registers */
-    ppc_num_vrs = 32            /* 32 Altivec vector registers */
+    ppc_num_gprs = 32,         /* 32 general-purpose registers.  */
+    ppc_num_fprs = 32,         /* 32 floating-point registers.  */
+    ppc_num_srs = 16,          /* 16 segment registers.  */
+    ppc_num_vrs = 32,          /* 32 Altivec vector registers.  */
+    ppc_num_vshrs = 32,                /* 32 doublewords (dword 1 of vs0~vs31).  */
+    ppc_num_vsrs = 64,         /* 64 VSX vector registers.  */
+    ppc_num_efprs = 32         /* 32 Extended FP registers.  */
   };
 
 
@@ -217,9 +286,26 @@ enum {
   PPC_VR0_REGNUM = 106,
   PPC_VSCR_REGNUM = 138,
   PPC_VRSAVE_REGNUM = 139,
+  PPC_VSR0_UPPER_REGNUM = 140,
+  PPC_VSR31_UPPER_REGNUM = 171,
   PPC_NUM_REGS
 };
 
+/* An instruction to match.  */
+
+struct ppc_insn_pattern
+{
+  unsigned int mask;            /* mask the insn with this...  */
+  unsigned int data;            /* ...and see if it matches this.  */
+  int optional;                 /* If non-zero, this insn may be absent.  */
+};
+
+extern int ppc_insns_match_pattern (struct frame_info *frame, CORE_ADDR pc,
+                                   struct ppc_insn_pattern *pattern,
+                                   unsigned int *insns);
+extern CORE_ADDR ppc_insn_d_field (unsigned int insn);
+
+extern CORE_ADDR ppc_insn_ds_field (unsigned int insn);
 
 /* Instruction size.  */
 #define PPC_INSN_SIZE 4