]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/unwind-arm-common.inc
jit: fix __builtin_unreachable [PR 95426]
[thirdparty/gcc.git] / libgcc / unwind-arm-common.inc
CommitLineData
1e874273 1/* Common unwinding code for ARM EABI and C6X.
8d9254fc 2 Copyright (C) 2004-2020 Free Software Foundation, Inc.
1e874273
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
7 Free Software Foundation; either version 3, or (at your option) any
8 later version.
9
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
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/>. */
23
69048898
SDJ
24#include "tconfig.h"
25#include "tsystem.h"
1e874273
PB
26#include "unwind.h"
27
69048898
SDJ
28/* Used for SystemTap unwinder probe. */
29#ifdef HAVE_SYS_SDT_H
30#include <sys/sdt.h>
31#endif
32
ae1152e5
CL
33#if __FDPIC__
34/* Load r7 with rt_sigreturn value. */
35#define ARM_SET_R7_RT_SIGRETURN 0xe3a070ad /* mov r7, #0xad */
36#define THUMB2_SET_R7_RT_SIGRETURN 0x07adf04f /* mov.w r7, #0xad */
37
38/* FDPIC jump to restorer sequence. */
39#define FDPIC_LDR_R12_WITH_FUNCDESC 0xe59fc004 /* ldr r12, [pc, #4] */
40#define FDPIC_LDR_R9_WITH_GOT 0xe59c9004 /* ldr r9, [r12, #4] */
41#define FDPIC_LDR_PC_WITH_RESTORER 0xe59cf000 /* ldr pc, [r12] */
42#define FDPIC_T2_LDR_R12_WITH_FUNCDESC 0xc008f8df /* ldr.w r12, [pc, #8] */
43#define FDPIC_T2_LDR_R9_WITH_GOT 0x9004f8dc /* ldr.w r9, [r12, #4] */
44#define FDPIC_T2_LDR_PC_WITH_RESTORER 0xf000f8dc /* ldr.w pc, [r12] */
45#define FDPIC_FUNCDESC_OFFSET 12
46
47/* Signal frame offsets. */
48#define ARM_NEW_RT_SIGFRAME_UCONTEXT 0x80
49#define ARM_UCONTEXT_SIGCONTEXT 0x14
50#define ARM_SIGCONTEXT_R0 0xc
51#endif
52
1e874273
PB
53/* We add a prototype for abort here to avoid creating a dependency on
54 target headers. */
55extern void abort (void);
56
57/* Definitions for C++ runtime support routines. We make these weak
58 declarations to avoid pulling in libsupc++ unnecessarily. */
59typedef unsigned char bool;
60
61typedef struct _ZSt9type_info type_info; /* This names C++ type_info type */
62enum __cxa_type_match_result
63 {
64 ctm_failed = 0,
65 ctm_succeeded = 1,
66 ctm_succeeded_with_ptr_to_base = 2
67 };
68
69void __attribute__((weak)) __cxa_call_unexpected(_Unwind_Control_Block *ucbp);
70bool __attribute__((weak)) __cxa_begin_cleanup(_Unwind_Control_Block *ucbp);
71enum __cxa_type_match_result __attribute__((weak)) __cxa_type_match
72 (_Unwind_Control_Block *ucbp, const type_info *rttip,
73 bool is_reference, void **matched_object);
74
75_Unwind_Ptr __attribute__((weak))
76__gnu_Unwind_Find_exidx (_Unwind_Ptr, int *);
77
78#define EXIDX_CANTUNWIND 1
79#define uint32_highbit (((_uw) 1) << 31)
80
81#define UCB_FORCED_STOP_FN(ucbp) ((ucbp)->unwinder_cache.reserved1)
82#define UCB_PR_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved2)
83#define UCB_SAVED_CALLSITE_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved3)
84#define UCB_FORCED_STOP_ARG(ucbp) ((ucbp)->unwinder_cache.reserved4)
5d727a4b 85#define UCB_PR_GOT(ucbp) ((ucbp)->unwinder_cache.reserved5)
1e874273
PB
86
87/* Unwind descriptors. */
88
89typedef struct
90{
91 _uw16 length;
92 _uw16 offset;
93} EHT16;
94
95typedef struct
96{
97 _uw length;
98 _uw offset;
99} EHT32;
100
101/* An exception index table entry. */
102
103typedef struct __EIT_entry
104{
105 _uw fnoffset;
106 _uw content;
107} __EIT_entry;
108
5d727a4b
CL
109#ifdef __FDPIC__
110
111/* Only used in FDPIC case. */
112struct funcdesc_t
113{
114 unsigned int ptr;
115 unsigned int got;
116};
117#endif
118
1e874273
PB
119/* Assembly helper functions. */
120
121/* Restore core register state. Never returns. */
122void __attribute__((noreturn)) restore_core_regs (struct core_regs *);
123
124
125/* Restore coprocessor state after phase1 unwinding. */
126static void restore_non_core_regs (phase1_vrs * vrs);
127
128/* A better way to do this would probably be to compare the absolute address
129 with a segment relative relocation of the same symbol. */
130
131extern int __text_start;
132extern int __data_start;
133
134/* The exception index table location. */
135extern __EIT_entry __exidx_start;
136extern __EIT_entry __exidx_end;
137
138/* Core unwinding functions. */
139
140/* Calculate the address encoded by a 31-bit self-relative offset at address
141 P. */
142static inline _uw selfrel_offset31 (const _uw *p);
143
144static _uw __gnu_unwind_get_pr_addr (int idx);
145
69048898
SDJ
146static void _Unwind_DebugHook (void *, void *)
147 __attribute__ ((__noinline__, __used__, __noclone__));
148
149/* This function is called during unwinding. It is intended as a hook
150 for a debugger to intercept exceptions. CFA is the CFA of the
151 target frame. HANDLER is the PC to which control will be
152 transferred. */
153
154static void
155_Unwind_DebugHook (void *cfa __attribute__ ((__unused__)),
156 void *handler __attribute__ ((__unused__)))
157{
158 /* We only want to use stap probes starting with v3. Earlier
159 versions added too much startup cost. */
160#if defined (HAVE_SYS_SDT_H) && defined (STAP_PROBE2) && _SDT_NOTE_TYPE >= 3
161 STAP_PROBE2 (libgcc, unwind, cfa, handler);
162#else
163 asm ("");
164#endif
165}
166
167/* This is a wrapper to be called when we need to restore core registers.
168 It will call `_Unwind_DebugHook' before restoring the registers, thus
169 making it possible to intercept and debug exceptions.
170
171 When calling `_Unwind_DebugHook', the first argument (the CFA) is zero
172 because we are not interested in it. However, it must be there (even
173 being zero) because GDB expects to find it when using the probe. */
174
175#define uw_restore_core_regs(TARGET, CORE) \
176 do \
177 { \
178 void *handler = __builtin_frob_return_addr ((void *) VRS_PC (TARGET)); \
179 _Unwind_DebugHook (0, handler); \
180 restore_core_regs (CORE); \
181 } \
182 while (0)
183
1e874273
PB
184/* Perform a binary search for RETURN_ADDRESS in TABLE. The table contains
185 NREC entries. */
186
187static const __EIT_entry *
188search_EIT_table (const __EIT_entry * table, int nrec, _uw return_address)
189{
190 _uw next_fn;
191 _uw this_fn;
192 int n, left, right;
193
194 if (nrec == 0)
195 return (__EIT_entry *) 0;
196
197 left = 0;
198 right = nrec - 1;
199
200 while (1)
201 {
202 n = (left + right) / 2;
203 this_fn = selfrel_offset31 (&table[n].fnoffset);
204 if (n != nrec - 1)
205 next_fn = selfrel_offset31 (&table[n + 1].fnoffset) - 1;
206 else
207 next_fn = (_uw)0 - 1;
208
209 if (return_address < this_fn)
210 {
211 if (n == left)
212 return (__EIT_entry *) 0;
213 right = n - 1;
214 }
215 else if (return_address <= next_fn)
216 return &table[n];
217 else
218 left = n + 1;
219 }
220}
221
ae1152e5
CL
222#if __FDPIC__
223/* VFP is not restored, but this is sufficient to allow unwinding. */
224static _Unwind_Reason_Code
225__gnu_personality_sigframe_fdpic (_Unwind_State state,
226 _Unwind_Control_Block *ucbp,
227 _Unwind_Context *context)
228{
229 unsigned int sp;
230 unsigned int pc;
231 unsigned int funcdesc;
232 unsigned int handler;
233 unsigned int first_handler_instruction;
234 int i;
235
236 _Unwind_VRS_Get (context, _UVRSC_CORE, R_SP, _UVRSD_UINT32, &sp);
237 _Unwind_VRS_Get (context, _UVRSC_CORE, R_PC, _UVRSD_UINT32, &pc);
238
239 funcdesc = *(unsigned int *)((pc & ~1) + FDPIC_FUNCDESC_OFFSET);
240 handler = *(unsigned int *)(funcdesc);
241 first_handler_instruction = *(unsigned int *)(handler & ~1);
242
243 /* Adjust SP to point to the start of registers according to
244 signal type. */
245 if (first_handler_instruction == ARM_SET_R7_RT_SIGRETURN
246 || first_handler_instruction == THUMB2_SET_R7_RT_SIGRETURN)
247 sp += ARM_NEW_RT_SIGFRAME_UCONTEXT
248 + ARM_UCONTEXT_SIGCONTEXT
249 + ARM_SIGCONTEXT_R0;
250 else
251 sp += ARM_UCONTEXT_SIGCONTEXT
252 + ARM_SIGCONTEXT_R0;
253 /* Restore regs saved on stack by the kernel. */
254 for (i = 0; i < 16; i++)
255 _Unwind_VRS_Set (context, _UVRSC_CORE, i, _UVRSD_UINT32, sp + 4 * i);
256
257 return _URC_CONTINUE_UNWIND;
258}
259#endif
260
1e874273
PB
261/* Find the exception index table eintry for the given address.
262 Fill in the relevant fields of the UCB.
263 Returns _URC_FAILURE if an error occurred, _URC_OK on success. */
264
265static _Unwind_Reason_Code
266get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
267{
268 const __EIT_entry * eitp;
269 int nrec;
270
271 /* The return address is the address of the instruction following the
272 call instruction (plus one in thumb mode). If this was the last
273 instruction in the function the address will lie in the following
274 function. Subtract 2 from the address so that it points within the call
275 instruction itself. */
276 return_address -= 2;
277
278 if (__gnu_Unwind_Find_exidx)
279 {
280 eitp = (const __EIT_entry *) __gnu_Unwind_Find_exidx (return_address,
281 &nrec);
282 if (!eitp)
283 {
ae1152e5
CL
284#if __FDPIC__
285 /* If we are unwinding a signal handler then perhaps we have
286 reached a trampoline. Try to detect jump to restorer
287 sequence. */
288 _uw *pc = (_uw *)((return_address+2) & ~1);
289 if ((pc[0] == FDPIC_LDR_R12_WITH_FUNCDESC
290 && pc[1] == FDPIC_LDR_R9_WITH_GOT
291 && pc[2] == FDPIC_LDR_PC_WITH_RESTORER)
292 || (pc[0] == FDPIC_T2_LDR_R12_WITH_FUNCDESC
293 && pc[1] == FDPIC_T2_LDR_R9_WITH_GOT
294 && pc[2] == FDPIC_T2_LDR_PC_WITH_RESTORER))
295 {
296 struct funcdesc_t *funcdesc
297 = (struct funcdesc_t *) &__gnu_personality_sigframe_fdpic;
298
299 UCB_PR_ADDR (ucbp) = funcdesc->ptr;
300 UCB_PR_GOT (ucbp) = funcdesc->got;
301
302 return _URC_OK;
303 }
304#endif
1e874273
PB
305 UCB_PR_ADDR (ucbp) = 0;
306 return _URC_FAILURE;
307 }
308 }
309 else
310 {
311 eitp = &__exidx_start;
312 nrec = &__exidx_end - &__exidx_start;
313 }
314
315 eitp = search_EIT_table (eitp, nrec, return_address);
316
317 if (!eitp)
318 {
ae1152e5
CL
319#if __FDPIC__
320 /* If we are unwinding a signal handler then perhaps we have
321 reached a trampoline. Try to detect jump to restorer
322 sequence. */
323 _uw *pc = (_uw *)((return_address+2) & ~1);
324 if ((pc[0] == FDPIC_LDR_R12_WITH_FUNCDESC
325 && pc[1] == FDPIC_LDR_R9_WITH_GOT
326 && pc[2] == FDPIC_LDR_PC_WITH_RESTORER)
327 || (pc[0] == FDPIC_T2_LDR_R12_WITH_FUNCDESC
328 && pc[1] == FDPIC_T2_LDR_R9_WITH_GOT
329 && pc[2] == FDPIC_T2_LDR_PC_WITH_RESTORER))
330 {
331 struct funcdesc_t *funcdesc
332 = (struct funcdesc_t *) &__gnu_personality_sigframe_fdpic;
333
334 UCB_PR_ADDR (ucbp) = funcdesc->ptr;
335 UCB_PR_GOT (ucbp) = funcdesc->got;
336
337 return _URC_OK;
338 }
339#endif
1e874273
PB
340 UCB_PR_ADDR (ucbp) = 0;
341 return _URC_FAILURE;
342 }
343 ucbp->pr_cache.fnstart = selfrel_offset31 (&eitp->fnoffset);
344
345 /* Can this frame be unwound at all? */
346 if (eitp->content == EXIDX_CANTUNWIND)
347 {
ae1152e5
CL
348#if __FDPIC__
349 /* If we are unwinding a signal handler then perhaps we have
350 reached a trampoline. Try to detect jump to restorer
351 sequence. */
352 _uw *pc = (_uw *)((return_address+2) & ~1);
353 if ((pc[0] == FDPIC_LDR_R12_WITH_FUNCDESC
354 && pc[1] == FDPIC_LDR_R9_WITH_GOT
355 && pc[2] == FDPIC_LDR_PC_WITH_RESTORER)
356 || (pc[0] == FDPIC_T2_LDR_R12_WITH_FUNCDESC
357 && pc[1] == FDPIC_T2_LDR_R9_WITH_GOT
358 && pc[2] == FDPIC_T2_LDR_PC_WITH_RESTORER))
359 {
360 struct funcdesc_t *funcdesc
361 = (struct funcdesc_t *) &__gnu_personality_sigframe_fdpic;
362
363 UCB_PR_ADDR (ucbp) = funcdesc->ptr;
364 UCB_PR_GOT (ucbp) = funcdesc->got;
365
366 return _URC_OK;
367 }
368#endif
1e874273
PB
369 UCB_PR_ADDR (ucbp) = 0;
370 return _URC_END_OF_STACK;
371 }
372
373 /* Obtain the address of the "real" __EHT_Header word. */
374
375 if (eitp->content & uint32_highbit)
376 {
377 /* It is immediate data. */
378 ucbp->pr_cache.ehtp = (_Unwind_EHT_Header *)&eitp->content;
379 ucbp->pr_cache.additional = 1;
380 }
381 else
382 {
383 /* The low 31 bits of the content field are a self-relative
384 offset to an _Unwind_EHT_Entry structure. */
385 ucbp->pr_cache.ehtp =
386 (_Unwind_EHT_Header *) selfrel_offset31 (&eitp->content);
387 ucbp->pr_cache.additional = 0;
388 }
389
390 /* Discover the personality routine address. */
391 if (*ucbp->pr_cache.ehtp & (1u << 31))
392 {
393 /* One of the predefined standard routines. */
394 _uw idx = (*(_uw *) ucbp->pr_cache.ehtp >> 24) & 0xf;
5d727a4b
CL
395#if __FDPIC__
396 {
397 struct funcdesc_t *funcdesc
398 = (struct funcdesc_t *) __gnu_unwind_get_pr_addr (idx);
399 if (funcdesc)
400 {
401 UCB_PR_ADDR (ucbp) = funcdesc->ptr;
402 UCB_PR_GOT (ucbp) = funcdesc->got;
403 }
404 else
405 UCB_PR_ADDR (ucbp) = 0;
406 }
407#else
1e874273 408 UCB_PR_ADDR (ucbp) = __gnu_unwind_get_pr_addr (idx);
5d727a4b 409#endif
1e874273
PB
410 if (UCB_PR_ADDR (ucbp) == 0)
411 {
412 /* Failed */
413 return _URC_FAILURE;
414 }
415 }
416 else
417 {
418 /* Execute region offset to PR */
419 UCB_PR_ADDR (ucbp) = selfrel_offset31 (ucbp->pr_cache.ehtp);
5d727a4b
CL
420#if __FDPIC__
421 UCB_PR_GOT (ucbp)
5602b48b 422 = (unsigned int) _Unwind_gnu_Find_got ((_Unwind_Ptr) UCB_PR_ADDR (ucbp));
5d727a4b 423#endif
1e874273
PB
424 }
425 return _URC_OK;
426}
427
428
429/* Perform phase2 unwinding. VRS is the initial virtual register state. */
430
431static void __attribute__((noreturn))
432unwind_phase2 (_Unwind_Control_Block * ucbp, phase2_vrs * vrs)
433{
434 _Unwind_Reason_Code pr_result;
435
436 do
437 {
438 /* Find the entry for this routine. */
439 if (get_eit_entry (ucbp, VRS_PC(vrs)) != _URC_OK)
440 abort ();
441
442 UCB_SAVED_CALLSITE_ADDR (ucbp) = VRS_PC(vrs);
443
444 /* Call the pr to decide what to do. */
5d727a4b
CL
445#if __FDPIC__
446 {
447 volatile struct funcdesc_t funcdesc;
448 funcdesc.ptr = UCB_PR_ADDR (ucbp);
449 funcdesc.got = UCB_PR_GOT (ucbp);
450 pr_result = ((personality_routine) &funcdesc)
451 (_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
452 }
453#else
1e874273
PB
454 pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
455 (_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
5d727a4b 456#endif
1e874273
PB
457 }
458 while (pr_result == _URC_CONTINUE_UNWIND);
459
460 if (pr_result != _URC_INSTALL_CONTEXT)
461 abort();
69048898 462
5d727a4b
CL
463#if __FDPIC__
464 /* r9 could have been lost due to PLT jump. Restore correct value. */
5602b48b 465 vrs->core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC (vrs));
5d727a4b
CL
466#endif
467
69048898 468 uw_restore_core_regs (vrs, &vrs->core);
1e874273
PB
469}
470
471/* Perform phase2 forced unwinding. */
472
473static _Unwind_Reason_Code
474unwind_phase2_forced (_Unwind_Control_Block *ucbp, phase2_vrs *entry_vrs,
475 int resuming)
476{
477 _Unwind_Stop_Fn stop_fn = (_Unwind_Stop_Fn) UCB_FORCED_STOP_FN (ucbp);
478 void *stop_arg = (void *)UCB_FORCED_STOP_ARG (ucbp);
479 _Unwind_Reason_Code pr_result = 0;
480 /* We use phase1_vrs here even though we do not demand save, for the
481 prev_sp field. */
482 phase1_vrs saved_vrs, next_vrs;
483
484 /* Save the core registers. */
485 saved_vrs.core = entry_vrs->core;
486 /* We don't need to demand-save the non-core registers, because we
487 unwind in a single pass. */
488 saved_vrs.demand_save_flags = 0;
489
490 /* Unwind until we reach a propagation barrier. */
491 do
492 {
493 _Unwind_State action;
494 _Unwind_Reason_Code entry_code;
495 _Unwind_Reason_Code stop_code;
496
497 /* Find the entry for this routine. */
498 entry_code = get_eit_entry (ucbp, VRS_PC (&saved_vrs));
499
500 if (resuming)
501 {
502 action = _US_UNWIND_FRAME_RESUME | _US_FORCE_UNWIND;
503 resuming = 0;
504 }
505 else
506 action = _US_UNWIND_FRAME_STARTING | _US_FORCE_UNWIND;
507
508 if (entry_code == _URC_OK)
509 {
510 UCB_SAVED_CALLSITE_ADDR (ucbp) = VRS_PC (&saved_vrs);
511
512 next_vrs = saved_vrs;
513
514 /* Call the pr to decide what to do. */
5d727a4b
CL
515#if __FDPIC__
516 {
517 volatile struct funcdesc_t funcdesc;
518 funcdesc.ptr = UCB_PR_ADDR (ucbp);
519 funcdesc.got = UCB_PR_GOT (ucbp);
520 pr_result = ((personality_routine) &funcdesc)
521 (action, ucbp, (void *) &next_vrs);
522 }
523#else
1e874273
PB
524 pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
525 (action, ucbp, (void *) &next_vrs);
5d727a4b 526#endif
1e874273
PB
527
528 saved_vrs.prev_sp = VRS_SP (&next_vrs);
529 }
530 else
531 {
532 /* Treat any failure as the end of unwinding, to cope more
533 gracefully with missing EH information. Mixed EH and
534 non-EH within one object will usually result in failure,
535 because the .ARM.exidx tables do not indicate the end
536 of the code to which they apply; but mixed EH and non-EH
537 shared objects should return an unwind failure at the
538 entry of a non-EH shared object. */
539 action |= _US_END_OF_STACK;
540
541 saved_vrs.prev_sp = VRS_SP (&saved_vrs);
542 }
543
544 stop_code = stop_fn (1, action, ucbp->exception_class, ucbp,
545 (void *)&saved_vrs, stop_arg);
546 if (stop_code != _URC_NO_REASON)
547 return _URC_FAILURE;
548
549 if (entry_code != _URC_OK)
550 return entry_code;
551
552 saved_vrs = next_vrs;
553 }
554 while (pr_result == _URC_CONTINUE_UNWIND);
555
556 if (pr_result != _URC_INSTALL_CONTEXT)
557 {
558 /* Some sort of failure has occurred in the pr and probably the
559 pr returned _URC_FAILURE. */
560 return _URC_FAILURE;
561 }
562
5d727a4b
CL
563#if __FDPIC__
564 /* r9 could have been lost due to PLT jump. Restore correct value. */
5602b48b 565 saved_vrs.core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC (&saved_vrs));
5d727a4b
CL
566#endif
567
69048898 568 uw_restore_core_regs (&saved_vrs, &saved_vrs.core);
1e874273
PB
569}
570
571/* This is a very limited implementation of _Unwind_GetCFA. It returns
572 the stack pointer as it is about to be unwound, and is only valid
573 while calling the stop function during forced unwinding. If the
574 current personality routine result is going to run a cleanup, this
575 will not be the CFA; but when the frame is really unwound, it will
576 be. */
577
578_Unwind_Word
579_Unwind_GetCFA (_Unwind_Context *context)
580{
581 return ((phase1_vrs *) context)->prev_sp;
582}
583
584/* Perform phase1 unwinding. UCBP is the exception being thrown, and
585 entry_VRS is the register state on entry to _Unwind_RaiseException. */
586
587_Unwind_Reason_Code
588__gnu_Unwind_RaiseException (_Unwind_Control_Block *, phase2_vrs *);
589
590_Unwind_Reason_Code
591__gnu_Unwind_RaiseException (_Unwind_Control_Block * ucbp,
592 phase2_vrs * entry_vrs)
593{
594 phase1_vrs saved_vrs;
595 _Unwind_Reason_Code pr_result;
596
597 /* Set the pc to the call site. */
598 VRS_PC (entry_vrs) = VRS_RETURN(entry_vrs);
599
600 /* Save the core registers. */
601 saved_vrs.core = entry_vrs->core;
602 /* Set demand-save flags. */
603 saved_vrs.demand_save_flags = ~(_uw) 0;
604
605 /* Unwind until we reach a propagation barrier. */
606 do
607 {
608 /* Find the entry for this routine. */
609 if (get_eit_entry (ucbp, VRS_PC (&saved_vrs)) != _URC_OK)
610 return _URC_FAILURE;
611
612 /* Call the pr to decide what to do. */
5d727a4b
CL
613#if __FDPIC__
614 {
615 volatile struct funcdesc_t funcdesc;
616 funcdesc.ptr = UCB_PR_ADDR (ucbp);
617 funcdesc.got = UCB_PR_GOT (ucbp);
618 pr_result = ((personality_routine) &funcdesc)
619 (_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
620 }
621#else
1e874273
PB
622 pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
623 (_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
5d727a4b 624#endif
1e874273
PB
625 }
626 while (pr_result == _URC_CONTINUE_UNWIND);
627
628 /* We've unwound as far as we want to go, so restore the original
629 register state. */
630 restore_non_core_regs (&saved_vrs);
631 if (pr_result != _URC_HANDLER_FOUND)
632 {
633 /* Some sort of failure has occurred in the pr and probably the
634 pr returned _URC_FAILURE. */
635 return _URC_FAILURE;
636 }
637
638 unwind_phase2 (ucbp, entry_vrs);
639}
640
641/* Resume unwinding after a cleanup has been run. UCBP is the exception
642 being thrown and ENTRY_VRS is the register state on entry to
643 _Unwind_Resume. */
644_Unwind_Reason_Code
645__gnu_Unwind_ForcedUnwind (_Unwind_Control_Block *,
646 _Unwind_Stop_Fn, void *, phase2_vrs *);
647
648_Unwind_Reason_Code
649__gnu_Unwind_ForcedUnwind (_Unwind_Control_Block *ucbp,
650 _Unwind_Stop_Fn stop_fn, void *stop_arg,
651 phase2_vrs *entry_vrs)
652{
653 UCB_FORCED_STOP_FN (ucbp) = (_uw) stop_fn;
654 UCB_FORCED_STOP_ARG (ucbp) = (_uw) stop_arg;
655
656 /* Set the pc to the call site. */
657 VRS_PC (entry_vrs) = VRS_RETURN(entry_vrs);
658
659 return unwind_phase2_forced (ucbp, entry_vrs, 0);
660}
661
662_Unwind_Reason_Code
663__gnu_Unwind_Resume (_Unwind_Control_Block *, phase2_vrs *);
664
665_Unwind_Reason_Code
666__gnu_Unwind_Resume (_Unwind_Control_Block * ucbp, phase2_vrs * entry_vrs)
667{
668 _Unwind_Reason_Code pr_result;
669
670 /* Recover the saved address. */
671 VRS_PC (entry_vrs) = UCB_SAVED_CALLSITE_ADDR (ucbp);
672
673 if (UCB_FORCED_STOP_FN (ucbp))
674 {
675 unwind_phase2_forced (ucbp, entry_vrs, 1);
676
677 /* We can't return failure at this point. */
678 abort ();
679 }
680
681 /* Call the cached PR. */
5d727a4b
CL
682#if __FDPIC__
683 {
684 volatile struct funcdesc_t funcdesc;
685 funcdesc.ptr = UCB_PR_ADDR (ucbp);
686 funcdesc.got = UCB_PR_GOT (ucbp);
687 pr_result = ((personality_routine) &funcdesc)
688 (_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
689 }
690#else
1e874273
PB
691 pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
692 (_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
5d727a4b 693#endif
1e874273
PB
694
695 switch (pr_result)
696 {
697 case _URC_INSTALL_CONTEXT:
698 /* Upload the registers to enter the landing pad. */
5d727a4b
CL
699#if __FDPIC__
700 /* r9 could have been lost due to PLT jump. Restore correct value. */
5602b48b 701 entry_vrs->core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC (entry_vrs));
5d727a4b 702#endif
69048898 703 uw_restore_core_regs (entry_vrs, &entry_vrs->core);
1e874273
PB
704
705 case _URC_CONTINUE_UNWIND:
706 /* Continue unwinding the next frame. */
707 unwind_phase2 (ucbp, entry_vrs);
708
709 default:
710 abort ();
711 }
712}
713
714_Unwind_Reason_Code
715__gnu_Unwind_Resume_or_Rethrow (_Unwind_Control_Block *, phase2_vrs *);
716
717_Unwind_Reason_Code
718__gnu_Unwind_Resume_or_Rethrow (_Unwind_Control_Block * ucbp,
719 phase2_vrs * entry_vrs)
720{
721 if (!UCB_FORCED_STOP_FN (ucbp))
722 return __gnu_Unwind_RaiseException (ucbp, entry_vrs);
723
724 /* Set the pc to the call site. */
725 VRS_PC (entry_vrs) = VRS_RETURN (entry_vrs);
726 /* Continue unwinding the next frame. */
727 return unwind_phase2_forced (ucbp, entry_vrs, 0);
728}
729
730/* Clean up an exception object when unwinding is complete. */
731void
732_Unwind_Complete (_Unwind_Control_Block * ucbp __attribute__((unused)))
733{
734}
735
736
737/* Free an exception. */
738
739void
740_Unwind_DeleteException (_Unwind_Exception * exc)
741{
742 if (exc->exception_cleanup)
743 (*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc);
744}
745
746
747/* Perform stack backtrace through unwind data. */
748_Unwind_Reason_Code
749__gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
750 phase2_vrs * entry_vrs);
751_Unwind_Reason_Code
752__gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
753 phase2_vrs * entry_vrs)
754{
755 phase1_vrs saved_vrs;
756 _Unwind_Reason_Code code;
757
758 _Unwind_Control_Block ucb;
759 _Unwind_Control_Block *ucbp = &ucb;
760
761 /* Set the pc to the call site. */
762 VRS_PC (entry_vrs) = VRS_RETURN (entry_vrs);
763
764 /* Save the core registers. */
765 saved_vrs.core = entry_vrs->core;
766 /* Set demand-save flags. */
767 saved_vrs.demand_save_flags = ~(_uw) 0;
768
769 do
770 {
771 /* Find the entry for this routine. */
772 if (get_eit_entry (ucbp, VRS_PC (&saved_vrs)) != _URC_OK)
773 {
774 code = _URC_FAILURE;
775 break;
776 }
777
778 /* The dwarf unwinder assumes the context structure holds things
779 like the function and LSDA pointers. The ARM implementation
780 caches these in the exception header (UCB). To avoid
781 rewriting everything we make the virtual IP register point at
782 the UCB. */
783 _Unwind_SetGR((_Unwind_Context *)&saved_vrs, UNWIND_POINTER_REG, (_Unwind_Ptr) ucbp);
784
785 /* Call trace function. */
786 if ((*trace) ((_Unwind_Context *) &saved_vrs, trace_argument)
787 != _URC_NO_REASON)
788 {
789 code = _URC_FAILURE;
790 break;
791 }
792
793 /* Call the pr to decide what to do. */
5d727a4b
CL
794#if __FDPIC__
795 {
796 volatile struct funcdesc_t funcdesc;
797 funcdesc.ptr = UCB_PR_ADDR (ucbp);
798 funcdesc.got = UCB_PR_GOT (ucbp);
799 code = ((personality_routine) &funcdesc)
800 (_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND,
801 ucbp, (void *) &saved_vrs);
802 }
803#else
1e874273
PB
804 code = ((personality_routine) UCB_PR_ADDR (ucbp))
805 (_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND,
806 ucbp, (void *) &saved_vrs);
5d727a4b 807#endif
1e874273
PB
808 }
809 while (code != _URC_END_OF_STACK
810 && code != _URC_FAILURE);
811
812 restore_non_core_regs (&saved_vrs);
813 return code;
814}
815
816
817/* Common implementation for ARM ABI defined personality routines.
818 ID is the index of the personality routine, other arguments are as defined
819 by __aeabi_unwind_cpp_pr{0,1,2}. */
820
821static _Unwind_Reason_Code
822__gnu_unwind_pr_common (_Unwind_State state,
823 _Unwind_Control_Block *ucbp,
824 _Unwind_Context *context,
825 int id)
826{
827 __gnu_unwind_state uws;
828 _uw *data;
829 _uw offset;
830 _uw len;
831 _uw rtti_count;
832 int phase2_call_unexpected_after_unwind = 0;
833 int in_range = 0;
834 int forced_unwind = state & _US_FORCE_UNWIND;
835
836 state &= _US_ACTION_MASK;
837
838 data = (_uw *) ucbp->pr_cache.ehtp;
839 uws.data = *(data++);
840 uws.next = data;
841 if (id == 0)
842 {
843 uws.data <<= 8;
844 uws.words_left = 0;
845 uws.bytes_left = 3;
846 }
56dc349e 847 else if (id < 3)
1e874273
PB
848 {
849 uws.words_left = (uws.data >> 16) & 0xff;
850 uws.data <<= 16;
851 uws.bytes_left = 2;
852 data += uws.words_left;
853 }
854
855 /* Restore the saved pointer. */
856 if (state == _US_UNWIND_FRAME_RESUME)
857 data = (_uw *) ucbp->cleanup_cache.bitpattern[0];
858
859 if ((ucbp->pr_cache.additional & 1) == 0)
860 {
861 /* Process descriptors. */
862 while (*data)
863 {
864 _uw addr;
865 _uw fnstart;
866
867 if (id == 2)
868 {
869 len = ((EHT32 *) data)->length;
870 offset = ((EHT32 *) data)->offset;
871 data += 2;
872 }
873 else
874 {
875 len = ((EHT16 *) data)->length;
876 offset = ((EHT16 *) data)->offset;
877 data++;
878 }
879
880 fnstart = ucbp->pr_cache.fnstart + (offset & ~1);
881 addr = _Unwind_GetGR (context, R_PC);
882 in_range = (fnstart <= addr && addr < fnstart + (len & ~1));
883
884 switch (((offset & 1) << 1) | (len & 1))
885 {
886 case 0:
887 /* Cleanup. */
888 if (state != _US_VIRTUAL_UNWIND_FRAME
889 && in_range)
890 {
891 /* Cleanup in range, and we are running cleanups. */
892 _uw lp;
893
894 /* Landing pad address is 31-bit pc-relative offset. */
895 lp = selfrel_offset31 (data);
896 data++;
897 /* Save the exception data pointer. */
898 ucbp->cleanup_cache.bitpattern[0] = (_uw) data;
899 if (!__cxa_begin_cleanup (ucbp))
900 return _URC_FAILURE;
901 /* Setup the VRS to enter the landing pad. */
902 _Unwind_SetGR (context, R_PC, lp);
903 return _URC_INSTALL_CONTEXT;
904 }
905 /* Cleanup not in range, or we are in stage 1. */
906 data++;
907 break;
908
909 case 1:
910 /* Catch handler. */
911 if (state == _US_VIRTUAL_UNWIND_FRAME)
912 {
913 if (in_range)
914 {
915 /* Check for a barrier. */
916 _uw rtti;
917 bool is_reference = (data[0] & uint32_highbit) != 0;
918 void *matched;
919 enum __cxa_type_match_result match_type;
920
921 /* Check for no-throw areas. */
922 if (data[1] == (_uw) -2)
923 return _URC_FAILURE;
924
925 /* The thrown object immediately follows the ECB. */
926 matched = (void *)(ucbp + 1);
927 if (data[1] != (_uw) -1)
928 {
929 /* Match a catch specification. */
930 rtti = _Unwind_decode_typeinfo_ptr (0,
931 (_uw) &data[1]);
932 match_type = __cxa_type_match (ucbp,
933 (type_info *) rtti,
934 is_reference,
935 &matched);
936 }
937 else
938 match_type = ctm_succeeded;
939
940 if (match_type)
941 {
942 ucbp->barrier_cache.sp =
943 _Unwind_GetGR (context, R_SP);
944 // ctm_succeeded_with_ptr_to_base really
945 // means _c_t_m indirected the pointer
946 // object. We have to reconstruct the
947 // additional pointer layer by using a temporary.
948 if (match_type == ctm_succeeded_with_ptr_to_base)
949 {
950 ucbp->barrier_cache.bitpattern[2]
951 = (_uw) matched;
952 ucbp->barrier_cache.bitpattern[0]
953 = (_uw) &ucbp->barrier_cache.bitpattern[2];
954 }
955 else
956 ucbp->barrier_cache.bitpattern[0] = (_uw) matched;
957 ucbp->barrier_cache.bitpattern[1] = (_uw) data;
958 return _URC_HANDLER_FOUND;
959 }
960 }
961 /* Handler out of range, or not matched. */
962 }
963 else if (ucbp->barrier_cache.sp == _Unwind_GetGR (context, R_SP)
964 && ucbp->barrier_cache.bitpattern[1] == (_uw) data)
965 {
966 /* Matched a previous propagation barrier. */
967 _uw lp;
968
969 /* Setup for entry to the handler. */
970 lp = selfrel_offset31 (data);
971 _Unwind_SetGR (context, R_PC, lp);
972 _Unwind_SetGR (context, 0, (_uw) ucbp);
973 return _URC_INSTALL_CONTEXT;
974 }
975 /* Catch handler not matched. Advance to the next descriptor. */
976 data += 2;
977 break;
978
979 case 2:
980 rtti_count = data[0] & 0x7fffffff;
981 /* Exception specification. */
982 if (state == _US_VIRTUAL_UNWIND_FRAME)
983 {
984 if (in_range && (!forced_unwind || !rtti_count))
985 {
986 /* Match against the exception specification. */
987 _uw i;
988 _uw rtti;
989 void *matched;
990
991 for (i = 0; i < rtti_count; i++)
992 {
993 matched = (void *)(ucbp + 1);
994 rtti = _Unwind_decode_typeinfo_ptr (0,
995 (_uw) &data[i + 1]);
996 if (__cxa_type_match (ucbp, (type_info *) rtti, 0,
997 &matched))
998 break;
999 }
1000
1001 if (i == rtti_count)
1002 {
1003 /* Exception does not match the spec. */
1004 ucbp->barrier_cache.sp =
1005 _Unwind_GetGR (context, R_SP);
1006 ucbp->barrier_cache.bitpattern[0] = (_uw) matched;
1007 ucbp->barrier_cache.bitpattern[1] = (_uw) data;
1008 return _URC_HANDLER_FOUND;
1009 }
1010 }
1011 /* Handler out of range, or exception is permitted. */
1012 }
1013 else if (ucbp->barrier_cache.sp == _Unwind_GetGR (context, R_SP)
1014 && ucbp->barrier_cache.bitpattern[1] == (_uw) data)
1015 {
1016 /* Matched a previous propagation barrier. */
1017 _uw lp;
1018 /* Record the RTTI list for __cxa_call_unexpected. */
1019 ucbp->barrier_cache.bitpattern[1] = rtti_count;
1020 ucbp->barrier_cache.bitpattern[2] = 0;
1021 ucbp->barrier_cache.bitpattern[3] = 4;
1022 ucbp->barrier_cache.bitpattern[4] = (_uw) &data[1];
1023
1024 if (data[0] & uint32_highbit)
1025 {
1026 data += rtti_count + 1;
1027 /* Setup for entry to the handler. */
1028 lp = selfrel_offset31 (data);
1029 data++;
1030 _Unwind_SetGR (context, R_PC, lp);
1031 _Unwind_SetGR (context, 0, (_uw) ucbp);
1032 return _URC_INSTALL_CONTEXT;
1033 }
1034 else
1035 phase2_call_unexpected_after_unwind = 1;
1036 }
1037 if (data[0] & uint32_highbit)
1038 data++;
1039 data += rtti_count + 1;
1040 break;
1041
1042 default:
1043 /* Should never happen. */
1044 return _URC_FAILURE;
1045 }
1046 /* Finished processing this descriptor. */
1047 }
1048 }
1049
1050 if (id >= 3)
1051 {
1052 /* 24-bit ecoding */
1053 if (__gnu_unwind_24bit (context, uws.data, id == 4) != _URC_OK)
1054 return _URC_FAILURE;
1055 }
1056 else
1057 {
1058 if (__gnu_unwind_execute (context, &uws) != _URC_OK)
1059 return _URC_FAILURE;
1060 }
1061
1062 if (phase2_call_unexpected_after_unwind)
1063 {
1064 /* Enter __cxa_unexpected as if called from the call site. */
1065 _Unwind_SetGR (context, R_LR, _Unwind_GetGR (context, R_PC));
1066 _Unwind_SetGR (context, R_PC, (_uw) &__cxa_call_unexpected);
1067 return _URC_INSTALL_CONTEXT;
1068 }
1069
1070 return _URC_CONTINUE_UNWIND;
1071}