/* Signal trampoline unwinder, for GDB the GNU Debugger.

   Copyright 2004 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., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

#ifndef TRAMP_FRAME_H
#define TRAMP_FRAME_H

struct trad_frame;
struct frame_info;
struct trad_frame_cache;

/* A trampoline consists of a small sequence of instructions placed at
   an unspecified location in the inferior's address space.  The only
   identifying attribute of the trampoline's address is that it does
   not fall inside an object file's section.

   The only way to identify a trampoline is to perform a brute force
   examination of the instructions at and around the PC.

   This module provides a convent interface for performing that
   operation.  */

/* A trampoline descriptor.  */

/* Magic instruction that to mark the end of the signal trampoline
   instruction sequence.  */
#define TRAMP_SENTINEL_INSN ((LONGEST) -1)

struct tramp_frame
{
  /* The trampoline's entire instruction sequence.  Search for this in
     the inferior at or around the frame's PC.  It is assumed that the
     PC is INSN_SIZE aligned, and that each element of TRAMP contains
     one INSN_SIZE instruction.  It is also assumed that TRAMP[0]
     contains the first instruction of the trampoline and hence the
     address of the instruction matching TRAMP[0] is the trampoline's
     "func" address.  The instruction sequence shall be terminated by
     TRAMP_SENTINEL_INSN.  */
  int insn_size;
  ULONGEST insn[8];
  /* Initialize a trad-frame cache corresponding to the tramp-frame.
     FUNC is the address of the instruction TRAMP[0] in memory.  */
  void (*init) (const struct tramp_frame *self,
		struct frame_info *next_frame,
		struct trad_frame_cache *this_cache,
		CORE_ADDR func);
};

void tramp_frame_append (struct gdbarch *gdbarch,
			 const struct tramp_frame *tramp);

#endif
