/* Header file for the ARM EABI unwinder
   Copyright (C) 2003-2023 Free Software Foundation, Inc.
   Contributed by Paul Brook

   This file 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, or (at your option) any
   later version.

   This file 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.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* Language-independent unwinder header public defines.  This contains both
   ABI defined objects, and GNU support routines.  */

#ifndef UNWIND_ARM_H
#define UNWIND_ARM_H

#include "unwind-arm-common.h"

#define UNWIND_STACK_REG 13
/* Use IP as a scratch register within the personality routine.  */
#define UNWIND_POINTER_REG 12

#define FDPIC_REGNUM 9

#define STR(x) #x
#define XSTR(x) STR(x)

#ifdef __cplusplus
extern "C" {
#endif
_Unwind_Ptr __attribute__((weak)) __gnu_Unwind_Find_got (_Unwind_Ptr);

static inline _Unwind_Ptr _Unwind_gnu_Find_got (_Unwind_Ptr ptr)
{
    _Unwind_Ptr res;

    if (__gnu_Unwind_Find_got)
	res = __gnu_Unwind_Find_got (ptr);
    else
	__asm volatile ("mov %[result], r" XSTR(FDPIC_REGNUM)
			: [result] "=r" (res));

    return res;
}

  /* Decode an R_ARM_TARGET2 relocation.  */
  static inline _Unwind_Word
  _Unwind_decode_typeinfo_ptr (_Unwind_Word base __attribute__ ((unused)),
                               _Unwind_Word ptr)
    {
      _Unwind_Word tmp;

      tmp = *(_Unwind_Word *) ptr;
      /* Zero values are always NULL.  */
      if (!tmp)
	return 0;

#if __FDPIC__
      /* For FDPIC, we store the offset of the GOT entry.  */
      /* So, first get GOT from dynamic linker and then use indirect access.  */
      tmp += _Unwind_gnu_Find_got (ptr);
      tmp = *(_Unwind_Word *) tmp;
#elif (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \
    || defined(__FreeBSD__) || defined(__fuchsia__)
      /* Pc-relative indirect.  */
#define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_pcrel | DW_EH_PE_indirect)
      tmp += ptr;
      tmp = *(_Unwind_Word *) tmp;
#elif defined(__symbian__) || defined(__uClinux__)
#define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_absptr)
      /* Absolute pointer.  Nothing more to do.  */
#else
#define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_pcrel)
      /* Pc-relative pointer.  */
      tmp += ptr;
#endif
      return tmp;
    }

  static inline _Unwind_Reason_Code
  __gnu_unwind_24bit (_Unwind_Context * context __attribute__ ((unused)),
                      _uw data __attribute__ ((unused)),
                      int compact __attribute__ ((unused)))
    {
      return _URC_FAILURE;
    }
#ifndef __FreeBSD__
  /* Return the address of the instruction, not the actual IP value.  */
#define _Unwind_GetIP(context) \
  (_Unwind_GetGR (context, 15) & ~(_Unwind_Word)1)

#define _Unwind_SetIP(context, val) \
  _Unwind_SetGR (context, 15, val | (_Unwind_GetGR (context, 15) & 1))
#else
  #undef _Unwind_GetIPInfo
  _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *);
  _Unwind_Ptr _Unwind_GetIPInfo (struct _Unwind_Context *, int *);
  void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr);
#endif

#ifdef __cplusplus
}   /* extern "C" */
#endif

#endif /* defined UNWIND_ARM_H */
