/* Common target dependent code for GDB on Alpha systems.
   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2002, 2003 Free
   Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   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., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.  */

#ifndef ALPHA_TDEP_H
#define ALPHA_TDEP_H

/* Say how long (ordinary) registers are.  This is a piece of bogosity
   used in push_word and a few other places; register_size() is the
   real way to know how big a register is.  */
#define ALPHA_REGISTER_SIZE 8

/* Number of machine registers.  */
#define ALPHA_NUM_REGS 67

/* Total amount of space needed to store our copies of the machine's
   register state.  */
#define ALPHA_REGISTER_BYTES (ALPHA_NUM_REGS * 8)

/* Register numbers of various important registers.  Note that most of
   these values are "real" register numbers, and correspond to the
   general registers of the machine.  */

#define ALPHA_V0_REGNUM	     0  /* Function integer return value */
#define ALPHA_T7_REGNUM	     8  /* Return address register for OSF/1 __add* */
#define ALPHA_S0_REGNUM      9	/* First saved register */
#define ALPHA_GCC_FP_REGNUM 15  /* Used by gcc as frame register */
#define ALPHA_A0_REGNUM     16  /* Loc of first arg during a subr call */
#define ALPHA_T9_REGNUM     23  /* Return address register for OSF/1 __div* */
#define ALPHA_RA_REGNUM     26  /* Contains return address value */
#define ALPHA_T12_REGNUM    27  /* Contains start addr of current proc */
#define ALPHA_GP_REGNUM     29  /* Contains the global pointer */
#define ALPHA_SP_REGNUM     30  /* Contains address of top of stack */
#define ALPHA_ZERO_REGNUM   31  /* Read-only register, always 0 */
#define ALPHA_FP0_REGNUM    32  /* Floating point register 0 */
#define ALPHA_FPA0_REGNUM   48  /* First float arg during a subr call */
#define ALPHA_FPCR_REGNUM   63  /* Floating point control register */
#define ALPHA_PC_REGNUM     64  /* Contains program counter */
#define ALPHA_UNIQUE_REGNUM 66	/* PAL_rduniq value */

/* Instruction size.  */
#define ALPHA_INSN_SIZE	4

/* The alpha has two different virtual pointers for arguments and locals.
   
   The virtual argument pointer is pointing to the bottom of the argument
   transfer area, which is located immediately below the virtual frame
   pointer. Its size is fixed for the native compiler, it is either zero
   (for the no arguments case) or large enough to hold all argument registers.
   gcc uses a variable sized argument transfer area. As it has
   to stay compatible with the native debugging tools it has to use the same
   virtual argument pointer and adjust the argument offsets accordingly.
   
   The virtual local pointer is localoff bytes below the virtual frame
   pointer, the value of localoff is obtained from the PDR.  */
#define ALPHA_NUM_ARG_REGS   6

/* Target-dependent structure in gdbarch.  */
struct gdbarch_tdep
{
  CORE_ADDR vm_min_address;	/* Used by alpha_heuristic_proc_start.  */

  /* If PC is inside a dynamically-generated signal trampoline function
     (i.e. one copied onto the user stack at run-time), return how many
     bytes PC is beyond the start of that function.  Otherwise, return -1.  */
  LONGEST (*dynamic_sigtramp_offset) (CORE_ADDR);

  /* Translate a signal handler stack base address into the address of
     the sigcontext structure for that signal handler.  */
  CORE_ADDR (*sigcontext_addr) (struct frame_info *);

  /* Does the PC fall in a signal trampoline.  */
  /* NOTE: cagney/2004-04-30: Do not copy/clone this code.  Instead
     look at tramp-frame.h and other simplier per-architecture
     sigtramp unwinders.  */
  int (*pc_in_sigtramp) (CORE_ADDR pc, char *name);

  /* If TYPE will be returned in memory, return true.  */
  int (*return_in_memory) (struct type *type);

  /* Offset of registers in `struct sigcontext'.  */
  int sc_pc_offset;
  int sc_regs_offset;
  int sc_fpregs_offset;

  int jb_pc;			/* Offset to PC value in jump buffer.
				   If htis is negative, longjmp support
				   will be disabled.  */
  size_t jb_elt_size;		/* And the size of each entry in the buf. */
};

extern unsigned int alpha_read_insn (CORE_ADDR pc);
extern void alpha_software_single_step (enum target_signal, int);
extern CORE_ADDR alpha_after_prologue (CORE_ADDR pc);

extern void alpha_mdebug_init_abi (struct gdbarch_info, struct gdbarch *);
extern void alpha_dwarf2_init_abi (struct gdbarch_info, struct gdbarch *);

extern void alpha_supply_int_regs (int, const void *, const void *,
				   const void *);
extern void alpha_fill_int_regs (int, void *, void *, void *);
extern void alpha_supply_fp_regs (int, const void *, const void *);
extern void alpha_fill_fp_regs (int, void *, void *);

#endif /* ALPHA_TDEP_H */
