Look at the end of the entry block for an invoke.

The invoke could be at the end of the entry block. If it's the only one, then we
won't process all of the landingpad instructions correctly. This code is
currently ugly, but should be made much nicer once the new EH switch is thrown.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138397 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling
2011-08-23 22:20:16 +00:00
parent d8b7dd5252
commit cfcccef926

View File

@ -389,10 +389,23 @@ bool SjLjEHPass::insertSjLjEHSupport(Function &F) {
SmallVector<CallInst*,16> EH_Exceptions; SmallVector<CallInst*,16> EH_Exceptions;
SmallVector<Instruction*,16> JmpbufUpdatePoints; SmallVector<Instruction*,16> JmpbufUpdatePoints;
// Note: Skip the entry block since there's nothing there that interests for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
// us. eh.selector and eh.exception shouldn't ever be there, and we // Note: Skip the entry block since there's nothing there that interests
// want to disregard any allocas that are there. // us. eh.selector and eh.exception shouldn't ever be there, and we
for (Function::iterator BB = F.begin(), E = F.end(); ++BB != E;) { // want to disregard any allocas that are there.
//
// FIXME: This is awkward. The new EH scheme won't need to skip the entry
// block.
if (BB == F.begin()) {
if (InvokeInst *II = dyn_cast<InvokeInst>(F.begin()->getTerminator())) {
// FIXME: This will be always non-NULL in the new EH.
if (LandingPadInst *LPI = II->getUnwindDest()->getLandingPadInst())
if (!PersonalityFn) PersonalityFn = LPI->getPersonalityFn();
}
continue;
}
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) { for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
if (CallInst *CI = dyn_cast<CallInst>(I)) { if (CallInst *CI = dyn_cast<CallInst>(I)) {
if (CI->getCalledFunction() == SelectorFn) { if (CI->getCalledFunction() == SelectorFn) {