[LLVMdev] Darwin vs exceptions
Dale Johannesen
dalej at apple.com
Sat Dec 8 10:00:18 PST 2007
On Dec 8, 2007, at 12:51 AM, Duncan Sands wrote:
> Hi Chris,
>
>> ... Claiming that a function has a
>>> catch-all handler when it does
>>> not causes the unwinder to go into a loop.
>
> this is the bit I don't understand. Why does it go
> into a loop? How can the unwinder possibly know that
> the original code did not have a catch-all, since we
> tell it which catches there are and we say: there is
> a catch-all!
The unwinder works by doing a stack crawl to find a handler. Since
we're telling it every eh-selector is a catch-all handler, it finds
one immediately (that is not there) and caches where it thinks it
is. That code (cleanup or whatever) is executed and ends by reaching
Unwind_Resume, which tries to resume at where it thinks the handler
is. Which is back at the same code from which we reached
Unwind_Resume. This worked OK when we were caching the IP because
the IP of the throw and Unwind_Resume call were different, but when
caching the CFA they are the same, which confuses Unwind_Resume.
(This is darwin's unwinder but I think the patch I quoted is the only
relevant change to generic gcc code.
Could be wrong.)
>>> - lang_eh_catch_all = return_null_tree;
>>> +/* lang_eh_catch_all = return_null_tree;*/
>
>> Ok, cool :) Duncan, Anton, what do you guys think about this?
>
> This is wrong - it breaks the semantics of invoke and causes
> eh to not work properly in some cases (see my email to Dale).
Well, it works a lot better on Darwin than what's there now. I
believe telling the unwinder there is a cleanup is sufficient to get
control always transferred to the secondary label on the invoke.
Could you point me to an example that should fail?
More information about the llvm-dev
mailing list