mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-25 13:35:10 +00:00
There are times when the landing pad won't have a call to 'eh.selector' in
it. It's been assumed up til now that it would be in its immediate successor. However, this isn't necessarily the case. It could be in one of its successor's successors. Modify the code to more thoroughly check for an 'eh.selector' call in successors. It only looks at a successor if we get there as a result of an unconditional branch. Testcase ObjC/exceptions-4.m in r126968. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126969 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
58f04fd22a
commit
e7147dba73
@ -214,8 +214,9 @@ private:
|
|||||||
void AddCatchInfo(const CallInst &I,
|
void AddCatchInfo(const CallInst &I,
|
||||||
MachineModuleInfo *MMI, MachineBasicBlock *MBB);
|
MachineModuleInfo *MMI, MachineBasicBlock *MBB);
|
||||||
|
|
||||||
/// CopyCatchInfo - Copy catch information from DestBB to SrcBB.
|
/// CopyCatchInfo - Copy catch information from SuccBB (or one of its
|
||||||
void CopyCatchInfo(const BasicBlock *SrcBB, const BasicBlock *DestBB,
|
/// successors) to LPad.
|
||||||
|
void CopyCatchInfo(const BasicBlock *SuccBB, const BasicBlock *LPad,
|
||||||
MachineModuleInfo *MMI, FunctionLoweringInfo &FLI);
|
MachineModuleInfo *MMI, FunctionLoweringInfo &FLI);
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
@ -448,16 +448,30 @@ void llvm::AddCatchInfo(const CallInst &I, MachineModuleInfo *MMI,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void llvm::CopyCatchInfo(const BasicBlock *SrcBB, const BasicBlock *DestBB,
|
void llvm::CopyCatchInfo(const BasicBlock *SuccBB, const BasicBlock *LPad,
|
||||||
MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) {
|
MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) {
|
||||||
for (BasicBlock::const_iterator I = SrcBB->begin(), E = --SrcBB->end();
|
SmallPtrSet<const BasicBlock*, 4> Visited;
|
||||||
I != E; ++I)
|
|
||||||
if (const EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) {
|
// The 'eh.selector' call may not be in the direct successor of a basic block,
|
||||||
// Apply the catch info to DestBB.
|
// but could be several successors deeper. If we don't find it, try going one
|
||||||
AddCatchInfo(*EHSel, MMI, FLI.MBBMap[DestBB]);
|
// level further. <rdar://problem/8824861>
|
||||||
|
while (Visited.insert(SuccBB)) {
|
||||||
|
for (BasicBlock::const_iterator I = SuccBB->begin(), E = --SuccBB->end();
|
||||||
|
I != E; ++I)
|
||||||
|
if (const EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) {
|
||||||
|
// Apply the catch info to LPad.
|
||||||
|
AddCatchInfo(*EHSel, MMI, FLI.MBBMap[LPad]);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if (!FLI.MBBMap[SrcBB]->isLandingPad())
|
if (!FLI.MBBMap[SuccBB]->isLandingPad())
|
||||||
FLI.CatchInfoFound.insert(EHSel);
|
FLI.CatchInfoFound.insert(EHSel);
|
||||||
#endif
|
#endif
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const BranchInst *Br = dyn_cast<BranchInst>(SuccBB->getTerminator());
|
||||||
|
if (Br && Br->isUnconditional())
|
||||||
|
SuccBB = Br->getSuccessor(0);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user