mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +00:00
First, do no harm -- even if we can't find a selector for an enclosing
landing pad, forward llvm.eh.resume calls to it instead of turning them invalidly into invokes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132382 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -214,13 +214,24 @@ BasicBlock *InvokeInliningInfo::getInnerUnwindDest() {
|
||||
/// at the end of the given block, as a branch to the inner unwind
|
||||
/// block. Returns true if the call was forwarded.
|
||||
bool InvokeInliningInfo::forwardEHResume(CallInst *call, BasicBlock *src) {
|
||||
// First, check whether this is a call to the intrinsic.
|
||||
Function *fn = dyn_cast<Function>(call->getCalledValue());
|
||||
if (!fn || fn->getName() != "llvm.eh.resume")
|
||||
return false;
|
||||
|
||||
// At this point, we need to return true on all paths, because
|
||||
// otherwise we'll construct an invoke of the intrinsic, which is
|
||||
// not well-formed.
|
||||
|
||||
// If this fails, maybe it should be a fatal error.
|
||||
// Try to find or make an inner unwind dest, which will fail if we
|
||||
// can't find a selector call for the outer unwind dest.
|
||||
BasicBlock *dest = getInnerUnwindDest();
|
||||
if (!dest) return false;
|
||||
bool hasSelector = (dest != 0);
|
||||
|
||||
// If we failed, just use the outer unwind dest, dropping the
|
||||
// exception and selector on the floor.
|
||||
if (!hasSelector)
|
||||
dest = OuterUnwindDest;
|
||||
|
||||
// Make a branch.
|
||||
BranchInst::Create(dest, src);
|
||||
@ -228,8 +239,11 @@ bool InvokeInliningInfo::forwardEHResume(CallInst *call, BasicBlock *src) {
|
||||
// Update the phis in the destination. They were inserted in an
|
||||
// order which makes this work.
|
||||
addIncomingPHIValuesForInto(src, dest);
|
||||
InnerExceptionPHI->addIncoming(call->getArgOperand(0), src);
|
||||
InnerSelectorPHI->addIncoming(call->getArgOperand(1), src);
|
||||
|
||||
if (hasSelector) {
|
||||
InnerExceptionPHI->addIncoming(call->getArgOperand(0), src);
|
||||
InnerSelectorPHI->addIncoming(call->getArgOperand(1), src);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user