// // 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"); }
// // Not used by C++. // Unwinds stack, calling "stop" function at each frame // Could be used to implement longjmp(). // EXPORT _Unwind_Reason_Code _Unwind_ForcedUnwind(struct _Unwind_Exception* exception_object, _Unwind_Stop_Fn stop, void* stop_parameter) { DEBUG_PRINT_API("_Unwind_ForcedUnwind(ex_obj=%p, stop=%p)\n", exception_object, stop); unw_context_t uc; unw_getcontext(&uc); // mark that this is a forced unwind, so _Unwind_Resume() can do the right thing exception_object->private_1 = (uintptr_t)stop; exception_object->private_2 = (uintptr_t)stop_parameter; // doit return unwind_phase2_forced(&uc, exception_object, stop, stop_parameter); }
/// 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"); }
/// Not used by C++. /// Unwinds stack, calling "stop" function at each frame. /// Could be used to implement longjmp(). _LIBUNWIND_EXPORT _Unwind_Reason_Code _Unwind_ForcedUnwind(_Unwind_Exception *exception_object, _Unwind_Stop_Fn stop, void *stop_parameter) { _LIBUNWIND_TRACE_API("_Unwind_ForcedUnwind(ex_obj=%p, stop=%p)\n", (void *)exception_object, (void *)(uintptr_t)stop); unw_context_t uc; unw_getcontext(&uc); // Mark that this is a forced unwind, so _Unwind_Resume() can do // the right thing. exception_object->private_1 = (uintptr_t) stop; exception_object->private_2 = (uintptr_t) stop_parameter; // do it return unwind_phase2_forced(&uc, exception_object, stop, stop_parameter); }
/// 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"); }