]>
Commit | Line | Data |
---|---|---|
2a75c0b6 | 1 | /* Header file for the ARM EABI unwinder |
5624e564 | 2 | Copyright (C) 2003-2015 Free Software Foundation, Inc. |
2a75c0b6 PB |
3 | Contributed by Paul Brook |
4 | ||
5 | This file is free software; you can redistribute it and/or modify it | |
6 | under the terms of the GNU General Public License as published by the | |
748086b7 | 7 | Free Software Foundation; either version 3, or (at your option) any |
2a75c0b6 PB |
8 | later version. |
9 | ||
2a75c0b6 PB |
10 | This file is distributed in the hope that it will be useful, but |
11 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | General Public License for more details. | |
14 | ||
748086b7 JJ |
15 | Under Section 7 of GPL version 3, you are granted additional |
16 | permissions described in the GCC Runtime Library Exception, version | |
17 | 3.1, as published by the Free Software Foundation. | |
18 | ||
19 | You should have received a copy of the GNU General Public License and | |
20 | a copy of the GCC Runtime Library Exception along with this program; | |
21 | see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
22 | <http://www.gnu.org/licenses/>. */ | |
2a75c0b6 | 23 | |
619519c8 KH |
24 | /* Language-independent unwinder header public defines. This contains both |
25 | ABI defined objects, and GNU support routines. */ | |
2a75c0b6 PB |
26 | |
27 | #ifndef UNWIND_ARM_H | |
28 | #define UNWIND_ARM_H | |
29 | ||
1e874273 PB |
30 | #include "unwind-arm-common.h" |
31 | ||
32 | #define UNWIND_STACK_REG 13 | |
33 | /* Use IP as a scratch register within the personality routine. */ | |
34 | #define UNWIND_POINTER_REG 12 | |
2a75c0b6 PB |
35 | |
36 | #ifdef __cplusplus | |
37 | extern "C" { | |
38 | #endif | |
2a75c0b6 PB |
39 | /* Decode an R_ARM_TARGET2 relocation. */ |
40 | static inline _Unwind_Word | |
acb72498 MK |
41 | _Unwind_decode_typeinfo_ptr (_Unwind_Word base __attribute__ ((unused)), |
42 | _Unwind_Word ptr) | |
2a75c0b6 PB |
43 | { |
44 | _Unwind_Word tmp; | |
45 | ||
46 | tmp = *(_Unwind_Word *) ptr; | |
47 | /* Zero values are always NULL. */ | |
48 | if (!tmp) | |
49 | return 0; | |
50 | ||
82a19768 AT |
51 | #if (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \ |
52 | || defined(__FreeBSD__) | |
2a75c0b6 | 53 | /* Pc-relative indirect. */ |
1e874273 | 54 | #define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_pcrel | DW_EH_PE_indirect) |
2a75c0b6 PB |
55 | tmp += ptr; |
56 | tmp = *(_Unwind_Word *) tmp; | |
433d52fd | 57 | #elif defined(__symbian__) || defined(__uClinux__) |
1e874273 | 58 | #define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_absptr) |
619519c8 | 59 | /* Absolute pointer. Nothing more to do. */ |
2a75c0b6 | 60 | #else |
1e874273 | 61 | #define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_pcrel) |
2a75c0b6 PB |
62 | /* Pc-relative pointer. */ |
63 | tmp += ptr; | |
64 | #endif | |
65 | return tmp; | |
66 | } | |
67 | ||
1e874273 | 68 | static inline _Unwind_Reason_Code |
acb72498 | 69 | __gnu_unwind_24bit (_Unwind_Context * context __attribute__ ((unused)), |
7c9bc875 | 70 | _uw data __attribute__ ((unused)), |
acb72498 | 71 | int compact __attribute__ ((unused))) |
2a75c0b6 | 72 | { |
1e874273 | 73 | return _URC_FAILURE; |
2a75c0b6 | 74 | } |
2a75c0b6 PB |
75 | /* Return the address of the instruction, not the actual IP value. */ |
76 | #define _Unwind_GetIP(context) \ | |
77 | (_Unwind_GetGR (context, 15) & ~(_Unwind_Word)1) | |
78 | ||
2a75c0b6 PB |
79 | #define _Unwind_SetIP(context, val) \ |
80 | _Unwind_SetGR (context, 15, val | (_Unwind_GetGR (context, 15) & 1)) | |
81 | ||
2a75c0b6 PB |
82 | #ifdef __cplusplus |
83 | } /* extern "C" */ | |
84 | #endif | |
85 | ||
86 | #endif /* defined UNWIND_ARM_H */ |