/* Header file for the ARM EABI unwinder Copyright (C) 2003-2024 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 . */ /* 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 */