[LLVMdev] Exception handling question
Duncan Sands
baldrick at free.fr
Fri Jan 22 05:20:03 PST 2010
Hi James,
> Thanks but I've also tried calling both a separate C function that then
> calls _Unwind_RaiseException and also a C++ function that throws an
> integer with the same results. I've also just tried running the example
> code posted earlier by Duncan and I find that doesn't reach the landing
> pad either if g() is replaced with a C++ function containing "throw 1".
if all personality functions up the call chain return "cleanup" (i.e. not
_URC_HANDLER_FOUND), then _Unwind_RaiseException returns without doing
anything, i.e. without running any cleanups. I understand that this is
considered to be a feature rather than a bug... If you want to run cleanups
anyway, then you need to do a "forced unwind" when _Unwind_RaiseException
returns like this. Note that this means that the decision to run cleanups is
under the control of whoever is throwing the exception in this case (for example
C++'s throw logic doesn't do this, so cleanups are not run if there are only
cleanups and no handlers - I'm not sure why C++ considers it so important to
have programs exit swiftly that it doesn't bother running potentially vital
cleanups...). Alternatively, have your personality function return
_URC_HANDLER_FOUND when it finds a cleanup [*].
Ciao,
Duncan.
[*] Though since you said your personality function is not called at all,
I guess this won't help solve your problem...
More information about the llvm-dev
mailing list