diff options
| author | Bill Wendling <isanbard@gmail.com> | 2010-03-26 23:41:30 +0000 |
|---|---|---|
| committer | Bill Wendling <isanbard@gmail.com> | 2010-03-26 23:41:30 +0000 |
| commit | 58abbd9b3d35e908e579b96555f3b81c65f64216 (patch) | |
| tree | 399c92c0420b4d8532e897c429183e5b953b5395 /lib/Support | |
| parent | 633601e00ff4db42bcfed568411852a1bfee5a7b (diff) | |
| download | external_llvm-58abbd9b3d35e908e579b96555f3b81c65f64216.zip external_llvm-58abbd9b3d35e908e579b96555f3b81c65f64216.tar.gz external_llvm-58abbd9b3d35e908e579b96555f3b81c65f64216.tar.bz2 | |
If we mark clean-ups as clean-ups, then it could break when inlining through an
'invoke' instruction. You will get a situation like this:
bb:
%ehptr = eh.exception()
%sel = eh.selector(%ehptr, @per, 0);
...
bb2:
invoke _Unwind_Resume_or_Rethrow(%ehptr) %normal unwind to %lpad
lpad:
...
The unwinder will see the %sel call as a clean-up and, if it doesn't have a
catch further up the call stack, it will skip running it. But there *is* another
catch up the stack -- the catch for the %lpad. However, we can't see that. This
is fixed in code-gen, where we detect this situation, and convert the "clean-up"
selector call into a "catch-all" selector call. This gives us the correct
semantics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99671 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
0 files changed, 0 insertions, 0 deletions
