/* 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.  */

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.  */
  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
