// // When _Unwind_RaiseException() is in phase2, it hands control // to the personality function at each frame. The personality // may force a jump to a landing pad in that function, the landing // pad code may then call _Unwind_Resume() to continue with the // unwinding. Note: the call to _Unwind_Resume() is from compiler // geneated user code. All other _Unwind_* routines are called // by the C++ runtime __cxa_* routines. // // Re-throwing an exception is implemented by having the code call // __cxa_rethrow() which in turn calls _Unwind_Resume_or_Rethrow() // EXPORT void _Unwind_SjLj_Resume(struct _Unwind_Exception* exception_object) { DEBUG_PRINT_API("_Unwind_SjLj_Resume(ex_obj=%p)\n", exception_object); if ( exception_object->private_1 != 0 ) unwind_phase2_forced(exception_object, (_Unwind_Stop_Fn)exception_object->private_1, (void*)exception_object->private_2); else unwind_phase2(exception_object); // clients assume _Unwind_Resume() does not return, so all we can do is abort. ABORT("_Unwind_SjLj_Resume() can't return"); }
/// When _Unwind_RaiseException() is in phase2, it hands control /// to the personality function at each frame. The personality /// may force a jump to a landing pad in that function, the landing /// pad code may then call _Unwind_Resume() to continue with the /// unwinding. Note: the call to _Unwind_Resume() is from compiler /// geneated user code. All other _Unwind_* routines are called /// by the C++ runtime __cxa_* routines. /// /// Note: re-throwing an exception (as opposed to continuing the unwind) /// is implemented by having the code call __cxa_rethrow() which /// in turn calls _Unwind_Resume_or_Rethrow(). _LIBUNWIND_EXPORT void _Unwind_Resume(_Unwind_Exception *exception_object) { _LIBUNWIND_TRACE_API("_Unwind_Resume(ex_obj=%p)\n", exception_object); unw_context_t uc; unw_getcontext(&uc); if (exception_object->private_1 != 0) unwind_phase2_forced(&uc, exception_object, (_Unwind_Stop_Fn) exception_object->private_1, (void *)exception_object->private_2); else unwind_phase2(&uc, exception_object); // Clients assume _Unwind_Resume() does not return, so all we can do is abort. _LIBUNWIND_ABORT("_Unwind_Resume() can't return"); }
// // Called by __cxa_throw. Only returns if there is a fatal error // EXPORT _Unwind_Reason_Code _Unwind_SjLj_RaiseException(struct _Unwind_Exception* exception_object) { DEBUG_PRINT_API("_Unwind_SjLj_RaiseException(ex_obj=%p)\n", exception_object); // mark that this is a non-forced unwind, so _Unwind_Resume() can do the right thing exception_object->private_1 = 0; exception_object->private_2 = 0; // phase 1: the search phase _Unwind_Reason_Code phase1 = unwind_phase1(exception_object); if ( phase1 != _URC_NO_REASON ) return phase1; // phase 2: the clean up phase return unwind_phase2(exception_object); }
/// When _Unwind_RaiseException() is in phase2, it hands control /// to the personality function at each frame. The personality /// may force a jump to a landing pad in that function, the landing /// pad code may then call _Unwind_Resume() to continue with the /// unwinding. Note: the call to _Unwind_Resume() is from compiler /// geneated user code. All other _Unwind_* routines are called /// by the C++ runtime __cxa_* routines. /// /// Note: re-throwing an exception (as opposed to continuing the unwind) /// is implemented by having the code call __cxa_rethrow() which /// in turn calls _Unwind_Resume_or_Rethrow(). _LIBUNWIND_EXPORT void _Unwind_Resume(struct _Unwind_Exception *exception_object) { _LIBUNWIND_TRACE_API("_Unwind_Resume(ex_obj=%p)\n", exception_object); unw_context_t uc; unw_getcontext(&uc); #ifdef __arm__ // TODO(piman): Do we need a "force unwind" mechanism? #else if (exception_object->private_1 != 0) unwind_phase2_forced(&uc, exception_object, (_Unwind_Stop_Fn) exception_object->private_1, (void *)exception_object->private_2); else #endif unwind_phase2(&uc, exception_object, true); // Clients assume _Unwind_Resume() does not return, so all we can do is abort. _LIBUNWIND_ABORT("_Unwind_Resume() can't return"); }
/// Called by __cxa_throw. Only returns if there is a fatal error. _LIBUNWIND_EXPORT _Unwind_Reason_Code _Unwind_RaiseException(_Unwind_Exception *exception_object) { _LIBUNWIND_TRACE_API("_Unwind_RaiseException(ex_obj=%p)\n", exception_object); unw_context_t uc; unw_getcontext(&uc); // Mark that this is a non-forced unwind, so _Unwind_Resume() // can do the right thing. exception_object->private_1 = 0; exception_object->private_2 = 0; // phase 1: the search phase _Unwind_Reason_Code phase1 = unwind_phase1(&uc, exception_object); if (phase1 != _URC_NO_REASON) return phase1; // phase 2: the clean up phase return unwind_phase2(&uc, exception_object); }