[LLVMdev] How to code catch-all in the new exception handling scheme?

Duncan Sands baldrick at free.fr
Wed Sep 28 00:33:13 PDT 2011

Hi Garrison,

>>    The unwinder delegates the decision of whether to stop in a call frame to
>>    that call frame's language-specific personality function. Not all personality
>>    functions guarantee that they will stop to perform cleanups.
>> This is incorrect: it is not the personality function that makes the decision,
>> it is who-ever is doing the unwinding.  For example if you use the Ada "throw"
>> method it will always run all C++ cleanups, even if that's all there is to do.
>> While if you use the C++ throw method it won't bother running Ada cleanups if
>> that is all there is to do.  All personality functions that I am familiar with
>> treat cleanups in the same way.
> How does one incorporate their own LLVM backend unwinding mechanism?
> I'm assuming that you have an Ada backend. Does your backend not call
> _Unwind_RaiseException for example?

it does, and follows that call with a call to _Unwind_ForcedUnwind.  If only
cleanups are seen up the call stack then the call to _Unwind_RaiseException
returns.  The call to _Unwind_ForcedUnwind then runs the cleanups.  When (if)
it returns then the program is terminated.  C++ skips the call to
_Unwind_ForcedUnwind and just terminates the program at once if
_Unwind_RaiseException returns.

Ciao, Duncan.

More information about the llvm-dev mailing list