summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2010-03-26 23:41:30 +0000
committerBill Wendling <isanbard@gmail.com>2010-03-26 23:41:30 +0000
commitd1aa77c37da1eecd05e73cf1d08d78ba7ccee8d6 (patch)
tree5d8f61dc8bd2e6a7b030bf163d7ffa0e1a287023 /clang/lib/CodeGen/CodeGenModule.cpp
parent0785d92cae4bd756d57b260bb39c29f9f0059507 (diff)
downloadbcm5719-llvm-d1aa77c37da1eecd05e73cf1d08d78ba7ccee8d6.tar.gz
bcm5719-llvm-d1aa77c37da1eecd05e73cf1d08d78ba7ccee8d6.zip
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. llvm-svn: 99671
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud