[llvm-commits] [llvm-gcc-4.2] r80850 - in /llvm-gcc-4.2/tags/Apple/llvmgcc42-2306/gcc: except.c llvm-convert.cpp

Eric Christopher echristo at apple.com
Thu Sep 3 10:18:59 PDT 2009


On Sep 3, 2009, at 10:06 AM, Duncan Sands wrote:

> Hi Eric,
>
>> Yes, this does fail. As I went through just about every test in  
>> llvm and llvm-gcc including the single source tests, and apparently  
>> wasted a bunch of time doing so, why didn't you check this in when  
>> you made this patch originally? :)
>
> because several eh tests in the full llvm testsuite fail due to this,
> as well as several gcc tests in testsuite/g++.dg/eh.  One more test
> seemed pointless.  I can only imagine you made a mistake and tested a
> version of llvm-gcc without your change...
>

I'm never one to discount user error :) I'm just glad I have a  
testcase and...

>> At any rate the existing behavior is quite, quite wrong and the  
>> correct fix will just need to be something more.
>
> Yes, that's true, and in fact I started working on this already.
> What needs to happen is that llvm-gcc should output an "unwind"
> instruction, rather than call _Unwind_Resume.  When the inliner
> inlines code containing an unwind through an invoke callsite,
> the invoke+unwind cancel each other, turning into a jump.  This
> means you don't end up with invoke of _Unwind_Resume like right
> now.  So the eh.selector calls no longer end up in the landing
> pad of the invoke-of-_Unwind_Resume, which is the wrong place as
> far as the unwinder is concerned - see the testcase [*].
>
> Once the inliner has finished, it is safe to turn the "unwind"
> into a call to _Unwind_Resume.  I already taught codegen to
> do this.
>
> It's trivial to teach llvm-gcc to output "unwind" - try it and
> your testcase should be fixed!
>
> Unfortunately, there's a problem.  The invoke+unwind cancellation
> can leave eh.selector calls floating in the middle of nowhere.
> In itself that's ok.  But at codegen time they need to be moved
> to any landing pads from which the eh.selector call is reachable.
> And they need to be placed there in the right order.  This is
> doable, but tricky - I didn't do it yet though.  There was a
> similar but simpler problem for eh.exception calls, but I already
> taught codegen how to handle that one.
>
> Rather than moving around selectors during codegen, another  
> possibility
> is to have the inliner take care of placing the selectors in a good
> place when it cancels an invoke-of-unwind.
>

*nod* All of this makes sense. I'll wait for the other email you were  
going to send as well.  Thanks for everything!

> Finally, a workaround for all this is to not inline through invokes.
> Simple and probably not even that costly in terms of code slowdown.

Aha. This may do nicely as a workaround...

-eric



More information about the llvm-commits mailing list