Blame sysdeps/arm/unwind.h

Packit Service 82fcde
/* Header file for the ARM EABI unwinder
Packit Service 82fcde
   Copyright (C) 2003-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   Contributed by Paul Brook
Packit Service 82fcde
Packit Service 82fcde
   This file is free software; you can redistribute it and/or modify it
Packit Service 82fcde
   under the terms of the GNU General Public License as published by the
Packit Service 82fcde
   Free Software Foundation; either version 2, or (at your option) any
Packit Service 82fcde
   later version.
Packit Service 82fcde
Packit Service 82fcde
   In addition to the permissions in the GNU General Public License, the
Packit Service 82fcde
   Free Software Foundation gives you unlimited permission to link the
Packit Service 82fcde
   compiled version of this file into combinations with other programs,
Packit Service 82fcde
   and to distribute those combinations without any restriction coming
Packit Service 82fcde
   from the use of this file.  (The General Public License restrictions
Packit Service 82fcde
   do apply in other respects; for example, they cover modification of
Packit Service 82fcde
   the file, and distribution when not linked into a combine
Packit Service 82fcde
   executable.)
Packit Service 82fcde
Packit Service 82fcde
   This file is distributed in the hope that it will be useful, but
Packit Service 82fcde
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU General Public License
Packit Service 82fcde
   along with this program.  If not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
/* Language-independent unwinder header public defines.  This contains both
Packit Service 82fcde
   ABI defined objects, and GNU support routines.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef UNWIND_ARM_H
Packit Service 82fcde
#define UNWIND_ARM_H
Packit Service 82fcde
Packit Service 82fcde
#define __ARM_EABI_UNWINDER__ 1
Packit Service 82fcde
Packit Service 82fcde
#ifdef __cplusplus
Packit Service 82fcde
extern "C" {
Packit Service 82fcde
#endif
Packit Service 82fcde
  typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
Packit Service 82fcde
  typedef signed _Unwind_Sword __attribute__((__mode__(__word__)));
Packit Service 82fcde
  typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__)));
Packit Service 82fcde
  typedef unsigned _Unwind_Internal_Ptr __attribute__((__mode__(__pointer__)));
Packit Service 82fcde
  typedef _Unwind_Word _uw;
Packit Service 82fcde
  typedef unsigned _uw64 __attribute__((mode(__DI__)));
Packit Service 82fcde
  typedef unsigned _uw16 __attribute__((mode(__HI__)));
Packit Service 82fcde
  typedef unsigned _uw8 __attribute__((mode(__QI__)));
Packit Service 82fcde
Packit Service 82fcde
  typedef enum
Packit Service 82fcde
    {
Packit Service 82fcde
      _URC_OK = 0,       /* operation completed successfully */
Packit Service 82fcde
      _URC_FOREIGN_EXCEPTION_CAUGHT = 1,
Packit Service 82fcde
      _URC_END_OF_STACK = 5,
Packit Service 82fcde
      _URC_HANDLER_FOUND = 6,
Packit Service 82fcde
      _URC_INSTALL_CONTEXT = 7,
Packit Service 82fcde
      _URC_CONTINUE_UNWIND = 8,
Packit Service 82fcde
      _URC_FAILURE = 9   /* unspecified failure of some kind */
Packit Service 82fcde
    }
Packit Service 82fcde
  _Unwind_Reason_Code;
Packit Service 82fcde
Packit Service 82fcde
  typedef enum
Packit Service 82fcde
    {
Packit Service 82fcde
      _US_VIRTUAL_UNWIND_FRAME = 0,
Packit Service 82fcde
      _US_UNWIND_FRAME_STARTING = 1,
Packit Service 82fcde
      _US_UNWIND_FRAME_RESUME = 2,
Packit Service 82fcde
      _US_ACTION_MASK = 3,
Packit Service 82fcde
      _US_FORCE_UNWIND = 8,
Packit Service 82fcde
      _US_END_OF_STACK = 16
Packit Service 82fcde
    }
Packit Service 82fcde
  _Unwind_State;
Packit Service 82fcde
Packit Service 82fcde
  /* Provided only for for compatibility with existing code.  */
Packit Service 82fcde
  typedef int _Unwind_Action;
Packit Service 82fcde
#define _UA_SEARCH_PHASE	1
Packit Service 82fcde
#define _UA_CLEANUP_PHASE	2
Packit Service 82fcde
#define _UA_HANDLER_FRAME	4
Packit Service 82fcde
#define _UA_FORCE_UNWIND	8
Packit Service 82fcde
#define _UA_END_OF_STACK	16
Packit Service 82fcde
#define _URC_NO_REASON 	_URC_OK
Packit Service 82fcde
Packit Service 82fcde
  typedef struct _Unwind_Control_Block _Unwind_Control_Block;
Packit Service 82fcde
  typedef struct _Unwind_Context _Unwind_Context;
Packit Service 82fcde
  typedef _uw _Unwind_EHT_Header;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
  /* UCB: */
Packit Service 82fcde
Packit Service 82fcde
  struct _Unwind_Control_Block
Packit Service 82fcde
    {
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
      /* For the benefit of code which assumes this is a scalar.  All
Packit Service 82fcde
	 glibc ever does is clear it.  */
Packit Service 82fcde
      _uw64 exception_class;
Packit Service 82fcde
#else
Packit Service 82fcde
      char exception_class[8];
Packit Service 82fcde
#endif
Packit Service 82fcde
      void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *);
Packit Service 82fcde
      /* Unwinder cache, private fields for the unwinder's use */
Packit Service 82fcde
      struct
Packit Service 82fcde
	{
Packit Service 82fcde
	  _uw reserved1;  /* Forced unwind stop fn, 0 if not forced */
Packit Service 82fcde
	  _uw reserved2;  /* Personality routine address */
Packit Service 82fcde
	  _uw reserved3;  /* Saved callsite address */
Packit Service 82fcde
	  _uw reserved4;  /* Forced unwind stop arg */
Packit Service 82fcde
	  _uw reserved5;
Packit Service 82fcde
	}
Packit Service 82fcde
      unwinder_cache;
Packit Service 82fcde
      /* Propagation barrier cache (valid after phase 1): */
Packit Service 82fcde
      struct
Packit Service 82fcde
	{
Packit Service 82fcde
	  _uw sp;
Packit Service 82fcde
	  _uw bitpattern[5];
Packit Service 82fcde
	}
Packit Service 82fcde
      barrier_cache;
Packit Service 82fcde
      /* Cleanup cache (preserved over cleanup): */
Packit Service 82fcde
      struct
Packit Service 82fcde
	{
Packit Service 82fcde
	  _uw bitpattern[4];
Packit Service 82fcde
	}
Packit Service 82fcde
      cleanup_cache;
Packit Service 82fcde
      /* Pr cache (for pr's benefit): */
Packit Service 82fcde
      struct
Packit Service 82fcde
	{
Packit Service 82fcde
	  _uw fnstart;			/* function start address */
Packit Service 82fcde
	  _Unwind_EHT_Header *ehtp;	/* pointer to EHT entry header word */
Packit Service 82fcde
	  _uw additional;		/* additional data */
Packit Service 82fcde
	  _uw reserved1;
Packit Service 82fcde
	}
Packit Service 82fcde
      pr_cache;
Packit Service 82fcde
      long long int :0;	/* Force alignment to 8-byte boundary */
Packit Service 82fcde
    };
Packit Service 82fcde
Packit Service 82fcde
  /* Virtual Register Set*/
Packit Service 82fcde
Packit Service 82fcde
  typedef enum
Packit Service 82fcde
    {
Packit Service 82fcde
      _UVRSC_CORE = 0,      /* integer register */
Packit Service 82fcde
      _UVRSC_VFP = 1,       /* vfp */
Packit Service 82fcde
      _UVRSC_FPA = 2,       /* fpa */
Packit Service 82fcde
      _UVRSC_WMMXD = 3,     /* Intel WMMX data register */
Packit Service 82fcde
      _UVRSC_WMMXC = 4      /* Intel WMMX control register */
Packit Service 82fcde
    }
Packit Service 82fcde
  _Unwind_VRS_RegClass;
Packit Service 82fcde
Packit Service 82fcde
  typedef enum
Packit Service 82fcde
    {
Packit Service 82fcde
      _UVRSD_UINT32 = 0,
Packit Service 82fcde
      _UVRSD_VFPX = 1,
Packit Service 82fcde
      _UVRSD_FPAX = 2,
Packit Service 82fcde
      _UVRSD_UINT64 = 3,
Packit Service 82fcde
      _UVRSD_FLOAT = 4,
Packit Service 82fcde
      _UVRSD_DOUBLE = 5
Packit Service 82fcde
    }
Packit Service 82fcde
  _Unwind_VRS_DataRepresentation;
Packit Service 82fcde
Packit Service 82fcde
  typedef enum
Packit Service 82fcde
    {
Packit Service 82fcde
      _UVRSR_OK = 0,
Packit Service 82fcde
      _UVRSR_NOT_IMPLEMENTED = 1,
Packit Service 82fcde
      _UVRSR_FAILED = 2
Packit Service 82fcde
    }
Packit Service 82fcde
  _Unwind_VRS_Result;
Packit Service 82fcde
Packit Service 82fcde
  /* Frame unwinding state.  */
Packit Service 82fcde
  typedef struct
Packit Service 82fcde
    {
Packit Service 82fcde
      /* The current word (bytes packed msb first).  */
Packit Service 82fcde
      _uw data;
Packit Service 82fcde
      /* Pointer to the next word of data.  */
Packit Service 82fcde
      _uw *next;
Packit Service 82fcde
      /* The number of bytes left in this word.  */
Packit Service 82fcde
      _uw8 bytes_left;
Packit Service 82fcde
      /* The number of words pointed to by ptr.  */
Packit Service 82fcde
      _uw8 words_left;
Packit Service 82fcde
    }
Packit Service 82fcde
  __gnu_unwind_state;
Packit Service 82fcde
Packit Service 82fcde
  typedef _Unwind_Reason_Code (*personality_routine) (_Unwind_State,
Packit Service 82fcde
      _Unwind_Control_Block *, _Unwind_Context *);
Packit Service 82fcde
Packit Service 82fcde
  _Unwind_VRS_Result _Unwind_VRS_Set(_Unwind_Context *, _Unwind_VRS_RegClass,
Packit Service 82fcde
                                     _uw, _Unwind_VRS_DataRepresentation,
Packit Service 82fcde
                                     void *);
Packit Service 82fcde
Packit Service 82fcde
  _Unwind_VRS_Result _Unwind_VRS_Get(_Unwind_Context *, _Unwind_VRS_RegClass,
Packit Service 82fcde
                                     _uw, _Unwind_VRS_DataRepresentation,
Packit Service 82fcde
                                     void *);
Packit Service 82fcde
Packit Service 82fcde
  _Unwind_VRS_Result _Unwind_VRS_Pop(_Unwind_Context *, _Unwind_VRS_RegClass,
Packit Service 82fcde
                                     _uw, _Unwind_VRS_DataRepresentation);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
  /* Support functions for the PR.  */
Packit Service 82fcde
#define _Unwind_Exception _Unwind_Control_Block
Packit Service 82fcde
  typedef char _Unwind_Exception_Class[8];
Packit Service 82fcde
Packit Service 82fcde
  void * _Unwind_GetLanguageSpecificData (_Unwind_Context *);
Packit Service 82fcde
  _Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *);
Packit Service 82fcde
Packit Service 82fcde
  /* These two should never be used.  */
Packit Service 82fcde
  _Unwind_Ptr _Unwind_GetDataRelBase (_Unwind_Context *);
Packit Service 82fcde
  _Unwind_Ptr _Unwind_GetTextRelBase (_Unwind_Context *);
Packit Service 82fcde
Packit Service 82fcde
  /* Interface functions: */
Packit Service 82fcde
  _Unwind_Reason_Code _Unwind_RaiseException(_Unwind_Control_Block *ucbp);
Packit Service 82fcde
  void __attribute__((noreturn)) _Unwind_Resume(_Unwind_Control_Block *ucbp);
Packit Service 82fcde
  _Unwind_Reason_Code _Unwind_Resume_or_Rethrow (_Unwind_Control_Block *ucbp);
Packit Service 82fcde
Packit Service 82fcde
  typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)
Packit Service 82fcde
       (int, _Unwind_Action, _Unwind_Exception_Class,
Packit Service 82fcde
	_Unwind_Control_Block *, struct _Unwind_Context *, void *);
Packit Service 82fcde
  _Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Control_Block *,
Packit Service 82fcde
					    _Unwind_Stop_Fn, void *);
Packit Service 82fcde
  _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *);
Packit Service 82fcde
  void _Unwind_Complete(_Unwind_Control_Block *ucbp);
Packit Service 82fcde
  void _Unwind_DeleteException (_Unwind_Exception *);
Packit Service 82fcde
Packit Service 82fcde
  _Unwind_Reason_Code __gnu_unwind_frame (_Unwind_Control_Block *,
Packit Service 82fcde
					  _Unwind_Context *);
Packit Service 82fcde
  _Unwind_Reason_Code __gnu_unwind_execute (_Unwind_Context *,
Packit Service 82fcde
					    __gnu_unwind_state *);
Packit Service 82fcde
Packit Service 82fcde
  /* Decode an R_ARM_TARGET2 relocation.  */
Packit Service 82fcde
  static inline _Unwind_Word
Packit Service 82fcde
  _Unwind_decode_target2 (_Unwind_Word ptr)
Packit Service 82fcde
    {
Packit Service 82fcde
      _Unwind_Word tmp;
Packit Service 82fcde
Packit Service 82fcde
      tmp = *(_Unwind_Word *) ptr;
Packit Service 82fcde
      /* Zero values are always NULL.  */
Packit Service 82fcde
      if (!tmp)
Packit Service 82fcde
	return 0;
Packit Service 82fcde
Packit Service 82fcde
#if defined(linux) || defined(__NetBSD__)
Packit Service 82fcde
      /* Pc-relative indirect.  */
Packit Service 82fcde
      tmp += ptr;
Packit Service 82fcde
      tmp = *(_Unwind_Word *) tmp;
Packit Service 82fcde
#elif defined(__symbian__)
Packit Service 82fcde
      /* Absolute pointer.  Nothing more to do.  */
Packit Service 82fcde
#else
Packit Service 82fcde
      /* Pc-relative pointer.  */
Packit Service 82fcde
      tmp += ptr;
Packit Service 82fcde
#endif
Packit Service 82fcde
      return tmp;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  static inline _Unwind_Word
Packit Service 82fcde
  _Unwind_GetGR (_Unwind_Context *context, int regno)
Packit Service 82fcde
    {
Packit Service 82fcde
      _uw val;
Packit Service 82fcde
      _Unwind_VRS_Get (context, _UVRSC_CORE, regno, _UVRSD_UINT32, &val;;
Packit Service 82fcde
      return val;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Return the address of the instruction, not the actual IP value.  */
Packit Service 82fcde
#define _Unwind_GetIP(context) \
Packit Service 82fcde
  (_Unwind_GetGR (context, 15) & ~(_Unwind_Word)1)
Packit Service 82fcde
Packit Service 82fcde
  static inline void
Packit Service 82fcde
  _Unwind_SetGR (_Unwind_Context *context, int regno, _Unwind_Word val)
Packit Service 82fcde
    {
Packit Service 82fcde
      _Unwind_VRS_Set (context, _UVRSC_CORE, regno, _UVRSD_UINT32, &val;;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* The dwarf unwinder doesn't understand arm/thumb state.  We assume the
Packit Service 82fcde
     landing pad uses the same instruction set as the call site.  */
Packit Service 82fcde
#define _Unwind_SetIP(context, val) \
Packit Service 82fcde
  _Unwind_SetGR (context, 15, val | (_Unwind_GetGR (context, 15) & 1))
Packit Service 82fcde
Packit Service 82fcde
typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)
Packit Service 82fcde
     (struct _Unwind_Context *, void *);
Packit Service 82fcde
Packit Service 82fcde
extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *);
Packit Service 82fcde
Packit Service 82fcde
#ifdef __cplusplus
Packit Service 82fcde
}   /* extern "C" */
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#endif /* defined UNWIND_ARM_H */