merge from gcc
[deliverable/binutils-gdb.git] / gdb / hppa-tdep.h
index 48ea35378331c55662d061e04cd9ca9cb05102fa..4dbeaf53d4a8785a6eff220327f96e6271844627 100644 (file)
@@ -1,5 +1,6 @@
-/* Common target dependent code for GDB on HPPA systems.
-   Copyright 2003 Free Software Foundation, Inc.
+/* Target-dependent code for the HP PA-RISC architecture.
+
+   Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #ifndef HPPA_TDEP_H
 #define HPPA_TDEP_H
 
-enum { HPPA_INSTRUCTION_SIZE = 4 };
+struct trad_frame_saved_reg;
+struct objfile;
+struct so_list;
+
+/* Register numbers of various important registers.
+   Note that some of these values are "real" register numbers,
+   and correspond to the general registers of the machine,
+   and some are "phony" register numbers which are too large
+   to be actual register numbers as far as the user is concerned
+   but do serve to get the desired values when passed to read_register.  */
+
+enum hppa_regnum
+{
+  HPPA_R0_REGNUM = 0,          /* Doesn't actually exist, used as base for
+                                  other r registers.  */
+  HPPA_R1_REGNUM = 1,
+  HPPA_FLAGS_REGNUM = 0,       /* Various status flags */
+  HPPA_RP_REGNUM = 2,          /* return pointer */
+  HPPA_FP_REGNUM = 3,          /* The ABI's frame pointer, when used */
+  HPPA_DP_REGNUM = 27,
+  HPPA_RET0_REGNUM = 28,
+  HPPA_RET1_REGNUM = 29,
+  HPPA_SP_REGNUM = 30,         /* Stack pointer.  */
+  HPPA_R31_REGNUM = 31,
+  HPPA_SAR_REGNUM = 32,                /* Shift Amount Register */
+  HPPA_IPSW_REGNUM = 41,       /* Interrupt Processor Status Word */
+  HPPA_PCOQ_HEAD_REGNUM = 33,  /* instruction offset queue head */
+  HPPA_PCSQ_HEAD_REGNUM = 34,  /* instruction space queue head */
+  HPPA_PCOQ_TAIL_REGNUM = 35,  /* instruction offset queue tail */
+  HPPA_PCSQ_TAIL_REGNUM = 36,  /* instruction space queue tail */
+  HPPA_EIEM_REGNUM = 37,       /* External Interrupt Enable Mask */
+  HPPA_IIR_REGNUM = 38,                /* Interrupt Instruction Register */
+  HPPA_ISR_REGNUM = 39,                /* Interrupt Space Register */
+  HPPA_IOR_REGNUM = 40,                /* Interrupt Offset Register */
+  HPPA_SR4_REGNUM = 43,                /* space register 4 */
+  HPPA_RCR_REGNUM = 51,                /* Recover Counter (also known as cr0) */
+  HPPA_PID0_REGNUM = 52,       /* Protection ID */
+  HPPA_PID1_REGNUM = 53,       /* Protection ID */
+  HPPA_PID2_REGNUM = 55,       /* Protection ID */
+  HPPA_PID3_REGNUM = 56,       /* Protection ID */
+  HPPA_CCR_REGNUM = 54,                /* Coprocessor Configuration Register */
+  HPPA_TR0_REGNUM = 57,                /* Temporary Registers (cr24 -> cr31) */
+  HPPA_CR27_REGNUM = 60,       /* Base register for thread-local storage, cr27 */
+  HPPA_FP0_REGNUM = 64,                /* First floating-point.  */
+  HPPA_FP4_REGNUM = 72,
+  HPPA64_FP4_REGNUM = 68,
+  HPPA_FP31R_REGNUM = 127,     /* Last floating-point.  */
+
+  HPPA_ARG0_REGNUM = 26,       /* The first argument of a callee. */
+  HPPA_ARG1_REGNUM = 25,       /* The second argument of a callee. */
+  HPPA_ARG2_REGNUM = 24,       /* The third argument of a callee. */
+  HPPA_ARG3_REGNUM = 23                /* The fourth argument of a callee. */
+};
+
+/* Instruction size.  */
+#define HPPA_INSN_SIZE 4
 
 /* Target-dependent structure in gdbarch.  */
 struct gdbarch_tdep
@@ -33,6 +89,31 @@ struct gdbarch_tdep
   /* Is this an ELF target? This can be 64-bit HP-UX, or a 32/64-bit GNU/Linux
      system.  */
   int is_elf;
+
+  /* Given a function address, try to find the global pointer for the 
+     corresponding shared object.  */
+  CORE_ADDR (*find_global_pointer) (struct value *);
+
+  /* For shared libraries, each call goes through a small piece of
+     trampoline code in the ".plt", or equivalent, section.
+     IN_SOLIB_CALL_TRAMPOLINE evaluates to nonzero if we are currently
+     stopped in one of these.  */
+  int (*in_solib_call_trampoline) (CORE_ADDR pc, char *name);
+
+  /* For targets that support multiple spaces, we may have additional stubs
+     in the return path.  These stubs are internal to the ABI, and users are
+     not interested in them.  If we detect that we are returning to a stub,
+     adjust the pc to the real caller.  This improves the behavior of commands
+     that traverse frames such as "up" and "finish".  */
+  void (*unwind_adjust_stub) (struct frame_info *next_frame, CORE_ADDR base,
+                             struct trad_frame_saved_reg *saved_regs);
+
+  /* These are solib-dependent methods.  They are really HPUX only, but
+     we don't have a HPUX-specific tdep vector at the moment.  */
+  CORE_ADDR (*solib_thread_start_addr) (struct so_list *so);
+  CORE_ADDR (*solib_get_got_by_pc) (CORE_ADDR addr);
+  CORE_ADDR (*solib_get_solib_by_pc) (CORE_ADDR addr);
+  CORE_ADDR (*solib_get_text_base) (struct objfile *objfile);
 };
 
 /*
@@ -132,6 +213,9 @@ struct hppa_objfile_private
     struct hppa_unwind_info *unwind_info;      /* a pointer */
     struct so_list *so_info;   /* a pointer  */
     CORE_ADDR dp;
+
+    int dummy_call_sequence_reg;
+    CORE_ADDR dummy_call_sequence_addr;
   };
 
 extern const struct objfile_data *hppa_objfile_priv_data;
@@ -145,5 +229,28 @@ int hppa_extract_21 (unsigned);
 int hppa_extract_14 (unsigned);
 int hppa_low_sign_extend (unsigned int, unsigned int);
 int hppa_sign_extend (unsigned int, unsigned int);
+CORE_ADDR hppa_symbol_address(const char *sym);
+
+extern void
+  hppa_frame_prev_register_helper (struct frame_info *next_frame,
+                                  struct trad_frame_saved_reg *saved_regs,
+                                  int regnum, int *optimizedp,
+                                  enum lval_type *lvalp, CORE_ADDR *addrp,
+                                  int *realnump, gdb_byte *valuep);
+
+extern CORE_ADDR hppa_read_pc (ptid_t ptid);
+extern void hppa_write_pc (CORE_ADDR pc, ptid_t ptid);
+extern CORE_ADDR hppa_unwind_pc (struct gdbarch *gdbarch,
+                                struct frame_info *next_frame);
+
+extern struct minimal_symbol *
+  hppa_lookup_stub_minimal_symbol (const char *name,
+                                   enum unwind_stub_types stub_type);
+
+extern struct hppa_objfile_private *
+hppa_init_objfile_priv_data (struct objfile *objfile);
+
+extern int hppa_in_solib_call_trampoline (CORE_ADDR pc, char *name);
+extern CORE_ADDR hppa_skip_trampoline_code (CORE_ADDR pc);
 
-#endif  /* HPPA_TDEP_H */
+#endif  /* hppa-tdep.h */
This page took 0.025427 seconds and 4 git commands to generate.