/* Code dealing with dummy stack frames, for GDB, the GNU debugger.

   Copyright (C) 2002-2016 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 3 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, see <http://www.gnu.org/licenses/>.  */

#if !defined (DUMMY_FRAME_H)
#define DUMMY_FRAME_H 1

#include "frame.h"

struct infcall_suspend_state;
struct frame_unwind;

/* Push the information needed to identify, and unwind from, a dummy
   frame onto the dummy frame stack.  */

/* NOTE: cagney/2004-08-02: In the case of ABIs using push_dummy_code
   containing more than one instruction, this interface many need to
   be expanded so that it knowns the lower/upper extent of the dummy
   frame's code.  */

extern void dummy_frame_push (struct infcall_suspend_state *caller_state,
                              const struct frame_id *dummy_id, ptid_t ptid);

/* Pop the dummy frame DUMMY_ID, restoring program state to that before the
   frame was created.
   On return reinit_frame_cache has been called.
   If the frame isn't found, flag an internal error.

   NOTE: This can only pop the one frame, even if it is in the middle of the
   stack, because the other frames may be for different threads, and there's
   currently no way to tell which stack frame is for which thread.  */

extern void dummy_frame_pop (struct frame_id dummy_id, ptid_t ptid);

extern void dummy_frame_discard (struct frame_id dummy_id, ptid_t ptid);

/* If the PC falls in a dummy frame, return a dummy frame
   unwinder.  */

extern const struct frame_unwind dummy_frame_unwind;

/* Destructor for dummy_frame.  DATA is supplied by registrant.
   REGISTERS_VALID is 1 for dummy_frame_pop, 0 for dummy_frame_discard.  */
typedef void (dummy_frame_dtor_ftype) (void *data, int registers_valid);

/* Call DTOR with DTOR_DATA when DUMMY_ID frame of thread PTID gets discarded.
   Dummy frame with DUMMY_ID must exist.  Multiple destructors may be
   registered, they will be called in the reverse order of registrations
   (LIFO).  */
extern void register_dummy_frame_dtor (struct frame_id dummy_id, ptid_t ptid,
				       dummy_frame_dtor_ftype *dtor,
				       void *dtor_data);

/* Return 1 if there exists any dummy frame with any of its registered
   destructors equal to both DTOR and DTOR_DATA.  Return 0 otherwise.  */
extern int find_dummy_frame_dtor (dummy_frame_dtor_ftype *dtor,
				  void *dtor_data);

#endif /* !defined (DUMMY_FRAME_H)  */
