1 /* Common unwinding code for ARM EABI and C6X.
2 Copyright (C) 2004-2016 Free Software Foundation, Inc.
3 Contributed by Paul Brook
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
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.
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.
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/>. */
28 /* Used for SystemTap unwinder probe. */
33 /* We add a prototype for abort here to avoid creating a dependency on
35 extern void abort (void);
37 /* Definitions for C++ runtime support routines. We make these weak
38 declarations to avoid pulling in libsupc++ unnecessarily. */
39 typedef unsigned char bool;
41 typedef struct _ZSt9type_info type_info; /* This names C++ type_info type */
42 enum __cxa_type_match_result
46 ctm_succeeded_with_ptr_to_base = 2
49 void __attribute__((weak)) __cxa_call_unexpected(_Unwind_Control_Block *ucbp);
50 bool __attribute__((weak)) __cxa_begin_cleanup(_Unwind_Control_Block *ucbp);
51 enum __cxa_type_match_result __attribute__((weak)) __cxa_type_match
52 (_Unwind_Control_Block *ucbp, const type_info *rttip,
53 bool is_reference, void **matched_object);
55 _Unwind_Ptr __attribute__((weak))
56 __gnu_Unwind_Find_exidx (_Unwind_Ptr, int *);
58 #define EXIDX_CANTUNWIND 1
59 #define uint32_highbit (((_uw) 1) << 31)
61 #define UCB_FORCED_STOP_FN(ucbp) ((ucbp)->unwinder_cache.reserved1)
62 #define UCB_PR_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved2)
63 #define UCB_SAVED_CALLSITE_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved3)
64 #define UCB_FORCED_STOP_ARG(ucbp) ((ucbp)->unwinder_cache.reserved4)
66 /* Unwind descriptors. */
80 /* An exception index table entry. */
82 typedef struct __EIT_entry
88 /* Assembly helper functions. */
90 /* Restore core register state. Never returns. */
91 void __attribute__((noreturn)) restore_core_regs (struct core_regs *);
94 /* Restore coprocessor state after phase1 unwinding. */
95 static void restore_non_core_regs (phase1_vrs * vrs);
97 /* A better way to do this would probably be to compare the absolute address
98 with a segment relative relocation of the same symbol. */
100 extern int __text_start;
101 extern int __data_start;
103 /* The exception index table location. */
104 extern __EIT_entry __exidx_start;
105 extern __EIT_entry __exidx_end;
107 /* Core unwinding functions. */
109 /* Calculate the address encoded by a 31-bit self-relative offset at address
111 static inline _uw selfrel_offset31 (const _uw *p);
113 static _uw __gnu_unwind_get_pr_addr (int idx);
115 static void _Unwind_DebugHook (void *, void *)
116 __attribute__ ((__noinline__, __used__, __noclone__));
118 /* This function is called during unwinding. It is intended as a hook
119 for a debugger to intercept exceptions. CFA is the CFA of the
120 target frame. HANDLER is the PC to which control will be
124 _Unwind_DebugHook (void *cfa __attribute__ ((__unused__)),
125 void *handler __attribute__ ((__unused__)))
127 /* We only want to use stap probes starting with v3. Earlier
128 versions added too much startup cost. */
129 #if defined (HAVE_SYS_SDT_H) && defined (STAP_PROBE2) && _SDT_NOTE_TYPE >= 3
130 STAP_PROBE2 (libgcc, unwind, cfa, handler);
136 /* This is a wrapper to be called when we need to restore core registers.
137 It will call `_Unwind_DebugHook' before restoring the registers, thus
138 making it possible to intercept and debug exceptions.
140 When calling `_Unwind_DebugHook', the first argument (the CFA) is zero
141 because we are not interested in it. However, it must be there (even
142 being zero) because GDB expects to find it when using the probe. */
144 #define uw_restore_core_regs(TARGET, CORE) \
147 void *handler = __builtin_frob_return_addr ((void *) VRS_PC (TARGET)); \
148 _Unwind_DebugHook (0, handler); \
149 restore_core_regs (CORE); \
153 /* Perform a binary search for RETURN_ADDRESS in TABLE. The table contains
156 static const __EIT_entry *
157 search_EIT_table (const __EIT_entry * table, int nrec, _uw return_address)
164 return (__EIT_entry *) 0;
171 n = (left + right) / 2;
172 this_fn = selfrel_offset31 (&table[n].fnoffset);
174 next_fn = selfrel_offset31 (&table[n + 1].fnoffset) - 1;
176 next_fn = (_uw)0 - 1;
178 if (return_address < this_fn)
181 return (__EIT_entry *) 0;
184 else if (return_address <= next_fn)
191 /* Find the exception index table eintry for the given address.
192 Fill in the relevant fields of the UCB.
193 Returns _URC_FAILURE if an error occurred, _URC_OK on success. */
195 static _Unwind_Reason_Code
196 get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
198 const __EIT_entry * eitp;
201 /* The return address is the address of the instruction following the
202 call instruction (plus one in thumb mode). If this was the last
203 instruction in the function the address will lie in the following
204 function. Subtract 2 from the address so that it points within the call
205 instruction itself. */
208 if (__gnu_Unwind_Find_exidx)
210 eitp = (const __EIT_entry *) __gnu_Unwind_Find_exidx (return_address,
214 UCB_PR_ADDR (ucbp) = 0;
220 eitp = &__exidx_start;
221 nrec = &__exidx_end - &__exidx_start;
224 eitp = search_EIT_table (eitp, nrec, return_address);
228 UCB_PR_ADDR (ucbp) = 0;
231 ucbp->pr_cache.fnstart = selfrel_offset31 (&eitp->fnoffset);
233 /* Can this frame be unwound at all? */
234 if (eitp->content == EXIDX_CANTUNWIND)
236 UCB_PR_ADDR (ucbp) = 0;
237 return _URC_END_OF_STACK;
240 /* Obtain the address of the "real" __EHT_Header word. */
242 if (eitp->content & uint32_highbit)
244 /* It is immediate data. */
245 ucbp->pr_cache.ehtp = (_Unwind_EHT_Header *)&eitp->content;
246 ucbp->pr_cache.additional = 1;
250 /* The low 31 bits of the content field are a self-relative
251 offset to an _Unwind_EHT_Entry structure. */
252 ucbp->pr_cache.ehtp =
253 (_Unwind_EHT_Header *) selfrel_offset31 (&eitp->content);
254 ucbp->pr_cache.additional = 0;
257 /* Discover the personality routine address. */
258 if (*ucbp->pr_cache.ehtp & (1u << 31))
260 /* One of the predefined standard routines. */
261 _uw idx = (*(_uw *) ucbp->pr_cache.ehtp >> 24) & 0xf;
262 UCB_PR_ADDR (ucbp) = __gnu_unwind_get_pr_addr (idx);
263 if (UCB_PR_ADDR (ucbp) == 0)
271 /* Execute region offset to PR */
272 UCB_PR_ADDR (ucbp) = selfrel_offset31 (ucbp->pr_cache.ehtp);
278 /* Perform phase2 unwinding. VRS is the initial virtual register state. */
280 static void __attribute__((noreturn))
281 unwind_phase2 (_Unwind_Control_Block * ucbp, phase2_vrs * vrs)
283 _Unwind_Reason_Code pr_result;
287 /* Find the entry for this routine. */
288 if (get_eit_entry (ucbp, VRS_PC(vrs)) != _URC_OK)
291 UCB_SAVED_CALLSITE_ADDR (ucbp) = VRS_PC(vrs);
293 /* Call the pr to decide what to do. */
294 pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
295 (_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
297 while (pr_result == _URC_CONTINUE_UNWIND);
299 if (pr_result != _URC_INSTALL_CONTEXT)
302 uw_restore_core_regs (vrs, &vrs->core);
305 /* Perform phase2 forced unwinding. */
307 static _Unwind_Reason_Code
308 unwind_phase2_forced (_Unwind_Control_Block *ucbp, phase2_vrs *entry_vrs,
311 _Unwind_Stop_Fn stop_fn = (_Unwind_Stop_Fn) UCB_FORCED_STOP_FN (ucbp);
312 void *stop_arg = (void *)UCB_FORCED_STOP_ARG (ucbp);
313 _Unwind_Reason_Code pr_result = 0;
314 /* We use phase1_vrs here even though we do not demand save, for the
316 phase1_vrs saved_vrs, next_vrs;
318 /* Save the core registers. */
319 saved_vrs.core = entry_vrs->core;
320 /* We don't need to demand-save the non-core registers, because we
321 unwind in a single pass. */
322 saved_vrs.demand_save_flags = 0;
324 /* Unwind until we reach a propagation barrier. */
327 _Unwind_State action;
328 _Unwind_Reason_Code entry_code;
329 _Unwind_Reason_Code stop_code;
331 /* Find the entry for this routine. */
332 entry_code = get_eit_entry (ucbp, VRS_PC (&saved_vrs));
336 action = _US_UNWIND_FRAME_RESUME | _US_FORCE_UNWIND;
340 action = _US_UNWIND_FRAME_STARTING | _US_FORCE_UNWIND;
342 if (entry_code == _URC_OK)
344 UCB_SAVED_CALLSITE_ADDR (ucbp) = VRS_PC (&saved_vrs);
346 next_vrs = saved_vrs;
348 /* Call the pr to decide what to do. */
349 pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
350 (action, ucbp, (void *) &next_vrs);
352 saved_vrs.prev_sp = VRS_SP (&next_vrs);
356 /* Treat any failure as the end of unwinding, to cope more
357 gracefully with missing EH information. Mixed EH and
358 non-EH within one object will usually result in failure,
359 because the .ARM.exidx tables do not indicate the end
360 of the code to which they apply; but mixed EH and non-EH
361 shared objects should return an unwind failure at the
362 entry of a non-EH shared object. */
363 action |= _US_END_OF_STACK;
365 saved_vrs.prev_sp = VRS_SP (&saved_vrs);
368 stop_code = stop_fn (1, action, ucbp->exception_class, ucbp,
369 (void *)&saved_vrs, stop_arg);
370 if (stop_code != _URC_NO_REASON)
373 if (entry_code != _URC_OK)
376 saved_vrs = next_vrs;
378 while (pr_result == _URC_CONTINUE_UNWIND);
380 if (pr_result != _URC_INSTALL_CONTEXT)
382 /* Some sort of failure has occurred in the pr and probably the
383 pr returned _URC_FAILURE. */
387 uw_restore_core_regs (&saved_vrs, &saved_vrs.core);
390 /* This is a very limited implementation of _Unwind_GetCFA. It returns
391 the stack pointer as it is about to be unwound, and is only valid
392 while calling the stop function during forced unwinding. If the
393 current personality routine result is going to run a cleanup, this
394 will not be the CFA; but when the frame is really unwound, it will
398 _Unwind_GetCFA (_Unwind_Context *context)
400 return ((phase1_vrs *) context)->prev_sp;
403 /* Perform phase1 unwinding. UCBP is the exception being thrown, and
404 entry_VRS is the register state on entry to _Unwind_RaiseException. */
407 __gnu_Unwind_RaiseException (_Unwind_Control_Block *, phase2_vrs *);
410 __gnu_Unwind_RaiseException (_Unwind_Control_Block * ucbp,
411 phase2_vrs * entry_vrs)
413 phase1_vrs saved_vrs;
414 _Unwind_Reason_Code pr_result;
416 /* Set the pc to the call site. */
417 VRS_PC (entry_vrs) = VRS_RETURN(entry_vrs);
419 /* Save the core registers. */
420 saved_vrs.core = entry_vrs->core;
421 /* Set demand-save flags. */
422 saved_vrs.demand_save_flags = ~(_uw) 0;
424 /* Unwind until we reach a propagation barrier. */
427 /* Find the entry for this routine. */
428 if (get_eit_entry (ucbp, VRS_PC (&saved_vrs)) != _URC_OK)
431 /* Call the pr to decide what to do. */
432 pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
433 (_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
435 while (pr_result == _URC_CONTINUE_UNWIND);
437 /* We've unwound as far as we want to go, so restore the original
439 restore_non_core_regs (&saved_vrs);
440 if (pr_result != _URC_HANDLER_FOUND)
442 /* Some sort of failure has occurred in the pr and probably the
443 pr returned _URC_FAILURE. */
447 unwind_phase2 (ucbp, entry_vrs);
450 /* Resume unwinding after a cleanup has been run. UCBP is the exception
451 being thrown and ENTRY_VRS is the register state on entry to
454 __gnu_Unwind_ForcedUnwind (_Unwind_Control_Block *,
455 _Unwind_Stop_Fn, void *, phase2_vrs *);
458 __gnu_Unwind_ForcedUnwind (_Unwind_Control_Block *ucbp,
459 _Unwind_Stop_Fn stop_fn, void *stop_arg,
460 phase2_vrs *entry_vrs)
462 UCB_FORCED_STOP_FN (ucbp) = (_uw) stop_fn;
463 UCB_FORCED_STOP_ARG (ucbp) = (_uw) stop_arg;
465 /* Set the pc to the call site. */
466 VRS_PC (entry_vrs) = VRS_RETURN(entry_vrs);
468 return unwind_phase2_forced (ucbp, entry_vrs, 0);
472 __gnu_Unwind_Resume (_Unwind_Control_Block *, phase2_vrs *);
475 __gnu_Unwind_Resume (_Unwind_Control_Block * ucbp, phase2_vrs * entry_vrs)
477 _Unwind_Reason_Code pr_result;
479 /* Recover the saved address. */
480 VRS_PC (entry_vrs) = UCB_SAVED_CALLSITE_ADDR (ucbp);
482 if (UCB_FORCED_STOP_FN (ucbp))
484 unwind_phase2_forced (ucbp, entry_vrs, 1);
486 /* We can't return failure at this point. */
490 /* Call the cached PR. */
491 pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
492 (_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
496 case _URC_INSTALL_CONTEXT:
497 /* Upload the registers to enter the landing pad. */
498 uw_restore_core_regs (entry_vrs, &entry_vrs->core);
500 case _URC_CONTINUE_UNWIND:
501 /* Continue unwinding the next frame. */
502 unwind_phase2 (ucbp, entry_vrs);
510 __gnu_Unwind_Resume_or_Rethrow (_Unwind_Control_Block *, phase2_vrs *);
513 __gnu_Unwind_Resume_or_Rethrow (_Unwind_Control_Block * ucbp,
514 phase2_vrs * entry_vrs)
516 if (!UCB_FORCED_STOP_FN (ucbp))
517 return __gnu_Unwind_RaiseException (ucbp, entry_vrs);
519 /* Set the pc to the call site. */
520 VRS_PC (entry_vrs) = VRS_RETURN (entry_vrs);
521 /* Continue unwinding the next frame. */
522 return unwind_phase2_forced (ucbp, entry_vrs, 0);
525 /* Clean up an exception object when unwinding is complete. */
527 _Unwind_Complete (_Unwind_Control_Block * ucbp __attribute__((unused)))
532 /* Free an exception. */
535 _Unwind_DeleteException (_Unwind_Exception * exc)
537 if (exc->exception_cleanup)
538 (*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc);
542 /* Perform stack backtrace through unwind data. */
544 __gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
545 phase2_vrs * entry_vrs);
547 __gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
548 phase2_vrs * entry_vrs)
550 phase1_vrs saved_vrs;
551 _Unwind_Reason_Code code;
553 _Unwind_Control_Block ucb;
554 _Unwind_Control_Block *ucbp = &ucb;
556 /* Set the pc to the call site. */
557 VRS_PC (entry_vrs) = VRS_RETURN (entry_vrs);
559 /* Save the core registers. */
560 saved_vrs.core = entry_vrs->core;
561 /* Set demand-save flags. */
562 saved_vrs.demand_save_flags = ~(_uw) 0;
566 /* Find the entry for this routine. */
567 if (get_eit_entry (ucbp, VRS_PC (&saved_vrs)) != _URC_OK)
573 /* The dwarf unwinder assumes the context structure holds things
574 like the function and LSDA pointers. The ARM implementation
575 caches these in the exception header (UCB). To avoid
576 rewriting everything we make the virtual IP register point at
578 _Unwind_SetGR((_Unwind_Context *)&saved_vrs, UNWIND_POINTER_REG, (_Unwind_Ptr) ucbp);
580 /* Call trace function. */
581 if ((*trace) ((_Unwind_Context *) &saved_vrs, trace_argument)
588 /* Call the pr to decide what to do. */
589 code = ((personality_routine) UCB_PR_ADDR (ucbp))
590 (_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND,
591 ucbp, (void *) &saved_vrs);
593 while (code != _URC_END_OF_STACK
594 && code != _URC_FAILURE);
596 restore_non_core_regs (&saved_vrs);
601 /* Common implementation for ARM ABI defined personality routines.
602 ID is the index of the personality routine, other arguments are as defined
603 by __aeabi_unwind_cpp_pr{0,1,2}. */
605 static _Unwind_Reason_Code
606 __gnu_unwind_pr_common (_Unwind_State state,
607 _Unwind_Control_Block *ucbp,
608 _Unwind_Context *context,
611 __gnu_unwind_state uws;
616 int phase2_call_unexpected_after_unwind = 0;
618 int forced_unwind = state & _US_FORCE_UNWIND;
620 state &= _US_ACTION_MASK;
622 data = (_uw *) ucbp->pr_cache.ehtp;
623 uws.data = *(data++);
633 uws.words_left = (uws.data >> 16) & 0xff;
636 data += uws.words_left;
639 /* Restore the saved pointer. */
640 if (state == _US_UNWIND_FRAME_RESUME)
641 data = (_uw *) ucbp->cleanup_cache.bitpattern[0];
643 if ((ucbp->pr_cache.additional & 1) == 0)
645 /* Process descriptors. */
653 len = ((EHT32 *) data)->length;
654 offset = ((EHT32 *) data)->offset;
659 len = ((EHT16 *) data)->length;
660 offset = ((EHT16 *) data)->offset;
664 fnstart = ucbp->pr_cache.fnstart + (offset & ~1);
665 addr = _Unwind_GetGR (context, R_PC);
666 in_range = (fnstart <= addr && addr < fnstart + (len & ~1));
668 switch (((offset & 1) << 1) | (len & 1))
672 if (state != _US_VIRTUAL_UNWIND_FRAME
675 /* Cleanup in range, and we are running cleanups. */
678 /* Landing pad address is 31-bit pc-relative offset. */
679 lp = selfrel_offset31 (data);
681 /* Save the exception data pointer. */
682 ucbp->cleanup_cache.bitpattern[0] = (_uw) data;
683 if (!__cxa_begin_cleanup (ucbp))
685 /* Setup the VRS to enter the landing pad. */
686 _Unwind_SetGR (context, R_PC, lp);
687 return _URC_INSTALL_CONTEXT;
689 /* Cleanup not in range, or we are in stage 1. */
695 if (state == _US_VIRTUAL_UNWIND_FRAME)
699 /* Check for a barrier. */
701 bool is_reference = (data[0] & uint32_highbit) != 0;
703 enum __cxa_type_match_result match_type;
705 /* Check for no-throw areas. */
706 if (data[1] == (_uw) -2)
709 /* The thrown object immediately follows the ECB. */
710 matched = (void *)(ucbp + 1);
711 if (data[1] != (_uw) -1)
713 /* Match a catch specification. */
714 rtti = _Unwind_decode_typeinfo_ptr (0,
716 match_type = __cxa_type_match (ucbp,
722 match_type = ctm_succeeded;
726 ucbp->barrier_cache.sp =
727 _Unwind_GetGR (context, R_SP);
728 // ctm_succeeded_with_ptr_to_base really
729 // means _c_t_m indirected the pointer
730 // object. We have to reconstruct the
731 // additional pointer layer by using a temporary.
732 if (match_type == ctm_succeeded_with_ptr_to_base)
734 ucbp->barrier_cache.bitpattern[2]
736 ucbp->barrier_cache.bitpattern[0]
737 = (_uw) &ucbp->barrier_cache.bitpattern[2];
740 ucbp->barrier_cache.bitpattern[0] = (_uw) matched;
741 ucbp->barrier_cache.bitpattern[1] = (_uw) data;
742 return _URC_HANDLER_FOUND;
745 /* Handler out of range, or not matched. */
747 else if (ucbp->barrier_cache.sp == _Unwind_GetGR (context, R_SP)
748 && ucbp->barrier_cache.bitpattern[1] == (_uw) data)
750 /* Matched a previous propagation barrier. */
753 /* Setup for entry to the handler. */
754 lp = selfrel_offset31 (data);
755 _Unwind_SetGR (context, R_PC, lp);
756 _Unwind_SetGR (context, 0, (_uw) ucbp);
757 return _URC_INSTALL_CONTEXT;
759 /* Catch handler not matched. Advance to the next descriptor. */
764 rtti_count = data[0] & 0x7fffffff;
765 /* Exception specification. */
766 if (state == _US_VIRTUAL_UNWIND_FRAME)
768 if (in_range && (!forced_unwind || !rtti_count))
770 /* Match against the exception specification. */
775 for (i = 0; i < rtti_count; i++)
777 matched = (void *)(ucbp + 1);
778 rtti = _Unwind_decode_typeinfo_ptr (0,
780 if (__cxa_type_match (ucbp, (type_info *) rtti, 0,
787 /* Exception does not match the spec. */
788 ucbp->barrier_cache.sp =
789 _Unwind_GetGR (context, R_SP);
790 ucbp->barrier_cache.bitpattern[0] = (_uw) matched;
791 ucbp->barrier_cache.bitpattern[1] = (_uw) data;
792 return _URC_HANDLER_FOUND;
795 /* Handler out of range, or exception is permitted. */
797 else if (ucbp->barrier_cache.sp == _Unwind_GetGR (context, R_SP)
798 && ucbp->barrier_cache.bitpattern[1] == (_uw) data)
800 /* Matched a previous propagation barrier. */
802 /* Record the RTTI list for __cxa_call_unexpected. */
803 ucbp->barrier_cache.bitpattern[1] = rtti_count;
804 ucbp->barrier_cache.bitpattern[2] = 0;
805 ucbp->barrier_cache.bitpattern[3] = 4;
806 ucbp->barrier_cache.bitpattern[4] = (_uw) &data[1];
808 if (data[0] & uint32_highbit)
810 data += rtti_count + 1;
811 /* Setup for entry to the handler. */
812 lp = selfrel_offset31 (data);
814 _Unwind_SetGR (context, R_PC, lp);
815 _Unwind_SetGR (context, 0, (_uw) ucbp);
816 return _URC_INSTALL_CONTEXT;
819 phase2_call_unexpected_after_unwind = 1;
821 if (data[0] & uint32_highbit)
823 data += rtti_count + 1;
827 /* Should never happen. */
830 /* Finished processing this descriptor. */
837 if (__gnu_unwind_24bit (context, uws.data, id == 4) != _URC_OK)
842 if (__gnu_unwind_execute (context, &uws) != _URC_OK)
846 if (phase2_call_unexpected_after_unwind)
848 /* Enter __cxa_unexpected as if called from the call site. */
849 _Unwind_SetGR (context, R_LR, _Unwind_GetGR (context, R_PC));
850 _Unwind_SetGR (context, R_PC, (_uw) &__cxa_call_unexpected);
851 return _URC_INSTALL_CONTEXT;
854 return _URC_CONTINUE_UNWIND;