The ARM stuff already calls the Resume function, not the Resume_or_Rethrow. It

turns out that it could cause an infinite loop in some situations. If this code
is triggered and it converts a cleanup into a catchall, but that cleanup was in
already in a cleanup, then the _Unwind_SjLj_Resume could infinite loop. I.e.,
the code doesn't consume the exception object and passes it on to
_Unwind_SjLj_Resume. But _USjLjR expects it to be consumed (since it's landing
at a catchall instead of a cleanup). So it uses the values that are presently
there, which are the values that tell it to jump to the fake landing pad.
<rdar://problem/9508402>

llvm-svn: 132381
This commit is contained in:
Bill Wendling 2011-06-01 01:49:35 +00:00
parent 9978c4f730
commit 48581a6454
1 changed files with 1 additions and 4 deletions

View File

@ -252,10 +252,7 @@ bool DwarfEHPrepare::HandleURoRInvokes() {
if (!URoR) {
URoR = F->getParent()->getFunction("_Unwind_Resume_or_Rethrow");
if (!URoR) {
URoR = F->getParent()->getFunction("_Unwind_SjLj_Resume");
if (!URoR) return CleanupSelectors(CatchAllSels);
}
if (!URoR) return CleanupSelectors(CatchAllSels);
}
SmallPtrSet<InvokeInst*, 32> URoRInvokes;