/* Copyright 2011-2012 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/>.  */

/* Reasons why frames could not be further unwound
   SET (name, description)
  
   After this reason name, all reasons should be considered errors;
   i.e.: abnormal stack termination.
   FIRST_ERROR (name)  
   
   First and Last reason defined
   FIRST_ENTRY (name)
   LAST_ENTRY (name)  */

#ifdef SET
/* No particular reason; either we haven't tried unwinding yet, 
   or we didn't fail.  */
SET (UNWIND_NO_REASON, "no reason")

/* The previous frame's analyzer returns an invalid result
   from this_id.

   FIXME drow/2006-08-16: This is how GDB used to indicate end of
   stack.  We should migrate to a model where frames always have a
   valid ID, and this becomes not just an error but an internal
   error.  But that's a project for another day.  */
SET (UNWIND_NULL_ID, "unwinder did not report frame ID")

/* This frame is the outermost.  */
SET (UNWIND_OUTERMOST, "outermost")

/* Can't unwind further, because that would require knowing the
   values of registers or memory that haven't been collected.  */
SET (UNWIND_UNAVAILABLE, \
     "not enough registers or memory available to unwind further")

/* This frame ID looks like it ought to belong to a NEXT frame,
   but we got it for a PREV frame.  Normally, this is a sign of
   unwinder failure.  It could also indicate stack corruption.  */
SET (UNWIND_INNER_ID, "previous frame inner to this frame (corrupt stack?)")

/* This frame has the same ID as the previous one.  That means
   that unwinding further would almost certainly give us another
   frame with exactly the same ID, so break the chain.  Normally,
   this is a sign of unwinder failure.  It could also indicate
   stack corruption.  */
SET (UNWIND_SAME_ID, "previous frame identical to this frame (corrupt stack?)")

/* The frame unwinder didn't find any saved PC, but we needed
   one to unwind further.  */
SET (UNWIND_NO_SAVED_PC, "frame did not save the PC")

#endif /* SET */


#ifdef FIRST_ERROR
FIRST_ERROR (UNWIND_UNAVAILABLE)
#endif

#ifdef FIRST_ENTRY
FIRST_ENTRY (UNWIND_NO_REASON)
#endif

#ifdef LAST_ENTRY
LAST_ENTRY (UNWIND_NO_SAVED_PC)
#endif
