[LLVMdev] Darwin vs exceptions
sabre at nondot.org
Sat Dec 8 00:00:55 PST 2007
On Dec 7, 2007, at 4:40 PM, Dale Johannesen wrote:
> So I couldn't get exceptions to work on PPC darwin. After much
> digging and confusion, there seem
> to be two separate issues.
> The gcc testsuite is running the version of the unwinding code that
> was built with the local (llvm-)gcc,
> which doesn't work because nobody has implemented
> builtin_return_address for that target.
> So that's one problem.
That's an easy problem. I just implemented __builtin_return_address
on PPC, at least builtin_return_address(0), please let me know if that
> More seriously, the version of the unwinding code installed on the
> system doesn't work either, for a
> different reason (and also doesn't work on x86 Darwin). It turns
> out the installed code has the
> following patch, which is not in the llvm-gcc source (or Apple's gcc
> sources for that matter; libgcc
> lives in a separate repository these days):
> Index: gcc/unwind-dw2.c
> --- gcc/unwind-dw2.c (revision 124749)
> +++ gcc/unwind-dw2.c (working copy)
> @@ -1526,7 +1526,7 @@
> static inline _Unwind_Ptr
> uw_identify_context (struct _Unwind_Context *context)
> - return _Unwind_GetIP (context);
> + return _Unwind_GetCFA (context);
> I'm uncertain of the merit of this patch, but it's in shipping
> Leopard and works with gcc, so we're
> stuck with it.
Right, this is effectively part of the darwin ABI now.
> The effect of this is that llvm's strategy of making every C++
> selector claim that it has a catch-all
> handler at the end, as described here
> does not work in this environment. Claiming that a function has a
> catch-all handler when it does
> not causes the unwinder to go into a loop.
Okay, you're beyond my knowledge here :)
> I tried simply removing the code that does this:
> Index: cp/except.c
> --- cp/except.c (revision 44663)
> +++ cp/except.c (working copy)
> @@ -104,7 +104,7 @@
> lang_eh_runtime_type = build_eh_type_type;
> lang_protect_cleanup_actions = &cp_protect_cleanup_actions;
> /* LLVM local */
> - lang_eh_catch_all = return_null_tree;
> +/* lang_eh_catch_all = return_null_tree;*/
> /* Returns an expression to be executed if an unhandled exception is
> and that works well for me; i.e., the gcc tests that exercise
> exceptions work as well with the
> two patches above (on x86) as they did before.
Ok, cool :) Duncan, Anton, what do you guys think about this?
> Now I need some help:
> - Why was C++ claiming that every selector has a catch-all handler?
> The documentation above just says
> the C++ personality function will terminate the program if it
> detects that unwinding the exception only results in matches with
> Isn't that what's supposed to happen if there's no handler anywhere?
> - What is the right thing for Linux? Is the deletion above safe
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev