_Unwind_ForcedUnwind() raises an exception for forced unwinding, passing along the given exception object, which should have its exception_class and exception_cleanup fields set. The exception object has been allocated by the language-specific runtime, and has a language-specific format, except that it shall contain an _Unwind_Exception struct.
Forced unwinding is a single-phase process. stop and stop_parameter control the termination of the unwind process instead of the usual personality routine query. stop is called for each unwind frame, with the parameteres described for the usual personality routine below, plus an additional stop_parameter.
When stop identifies the destination frame, it
transfers control to the user code as appropriate without returning,
normally after calling _Unwind_DeleteException(). If not,
then it should return an
If stop returns any reason code other than
_URC_NO_REASON, then the stack state is indeterminate
from the point of view of the caller of
_Unwind_ForcedUnwind(). Rather than attempt to return,
therefore, the unwind library should use the
exception_cleanup entry in the exception, and then
This is not the destination from. The unwind runtime will call frame's
personality routine with the
_UA_CLEANUP_PHASE flag set in
actions, and then unwind to the next frame
and call the stop() function again.
In order to allow _Unwind_ForcedUnwind() to
perform special processing when it reaches the end of the stack, the
unwind runtime will call it after the last frame is rejected, with a
NULL stack pointer in the context, and the
stop() function shall catch this condition. It may
return this code if it cannot handle end-of-stack.
The stop() function may return this code for other fatal conditions like stack corruption.