mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Remove the eh.exception and eh.selector intrinsics. Also remove a hack to copy
over the catch information. The catch information is now tacked to the invoke instruction. llvm-svn: 149326
This commit is contained in:
parent
a2a758eff6
commit
0b1a8d62d4
@ -481,8 +481,6 @@ LLVMTypeRef LLVMX86MMXType(void);
|
||||
macro(IntrinsicInst) \
|
||||
macro(DbgInfoIntrinsic) \
|
||||
macro(DbgDeclareInst) \
|
||||
macro(EHExceptionInst) \
|
||||
macro(EHSelectorInst) \
|
||||
macro(MemIntrinsic) \
|
||||
macro(MemCpyInst) \
|
||||
macro(MemMoveInst) \
|
||||
|
@ -216,11 +216,6 @@ private:
|
||||
void AddCatchInfo(const CallInst &I,
|
||||
MachineModuleInfo *MMI, MachineBasicBlock *MBB);
|
||||
|
||||
/// CopyCatchInfo - Copy catch information from SuccBB (or one of its
|
||||
/// successors) to LPad.
|
||||
void CopyCatchInfo(const BasicBlock *SuccBB, const BasicBlock *LPad,
|
||||
MachineModuleInfo *MMI, FunctionLoweringInfo &FLI);
|
||||
|
||||
/// AddLandingPadInfo - Extract the exception handling information from the
|
||||
/// landingpad instruction and add them to the specified machine module info.
|
||||
void AddLandingPadInfo(const LandingPadInst &I, MachineModuleInfo &MMI,
|
||||
|
@ -277,34 +277,6 @@ namespace llvm {
|
||||
}
|
||||
};
|
||||
|
||||
/// EHExceptionInst - This represents the llvm.eh.exception instruction.
|
||||
///
|
||||
class EHExceptionInst : public IntrinsicInst {
|
||||
public:
|
||||
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const EHExceptionInst *) { return true; }
|
||||
static inline bool classof(const IntrinsicInst *I) {
|
||||
return I->getIntrinsicID() == Intrinsic::eh_exception;
|
||||
}
|
||||
static inline bool classof(const Value *V) {
|
||||
return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
|
||||
}
|
||||
};
|
||||
|
||||
/// EHSelectorInst - This represents the llvm.eh.selector instruction.
|
||||
///
|
||||
class EHSelectorInst : public IntrinsicInst {
|
||||
public:
|
||||
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const EHSelectorInst *) { return true; }
|
||||
static inline bool classof(const IntrinsicInst *I) {
|
||||
return I->getIntrinsicID() == Intrinsic::eh_selector;
|
||||
}
|
||||
static inline bool classof(const Value *V) {
|
||||
return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -425,34 +425,6 @@ void llvm::AddCatchInfo(const CallInst &I, MachineModuleInfo *MMI,
|
||||
}
|
||||
}
|
||||
|
||||
void llvm::CopyCatchInfo(const BasicBlock *SuccBB, const BasicBlock *LPad,
|
||||
MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) {
|
||||
SmallPtrSet<const BasicBlock*, 4> Visited;
|
||||
|
||||
// The 'eh.selector' call may not be in the direct successor of a basic block,
|
||||
// but could be several successors deeper. If we don't find it, try going one
|
||||
// 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
|
||||
if (!FLI.MBBMap[SuccBB]->isLandingPad())
|
||||
FLI.CatchInfoFound.insert(EHSel);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
const BranchInst *Br = dyn_cast<BranchInst>(SuccBB->getTerminator());
|
||||
if (Br && Br->isUnconditional())
|
||||
SuccBB = Br->getSuccessor(0);
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// AddLandingPadInfo - Extract the exception handling information from the
|
||||
/// landingpad instruction and add them to the specified machine module info.
|
||||
void llvm::AddLandingPadInfo(const LandingPadInst &I, MachineModuleInfo &MMI,
|
||||
|
@ -785,31 +785,6 @@ void SelectionDAGISel::PrepareEHLandingPad() {
|
||||
// Mark exception selector register as live in.
|
||||
Reg = TLI.getExceptionSelectorRegister();
|
||||
if (Reg) MBB->addLiveIn(Reg);
|
||||
|
||||
// FIXME: Hack around an exception handling flaw (PR1508): the personality
|
||||
// function and list of typeids logically belong to the invoke (or, if you
|
||||
// like, the basic block containing the invoke), and need to be associated
|
||||
// with it in the dwarf exception handling tables. Currently however the
|
||||
// information is provided by an intrinsic (eh.selector) that can be moved
|
||||
// to unexpected places by the optimizers: if the unwind edge is critical,
|
||||
// then breaking it can result in the intrinsics being in the successor of
|
||||
// the landing pad, not the landing pad itself. This results
|
||||
// in exceptions not being caught because no typeids are associated with
|
||||
// the invoke. This may not be the only way things can go wrong, but it
|
||||
// is the only way we try to work around for the moment.
|
||||
const BasicBlock *LLVMBB = MBB->getBasicBlock();
|
||||
const BranchInst *Br = dyn_cast<BranchInst>(LLVMBB->getTerminator());
|
||||
|
||||
if (Br && Br->isUnconditional()) { // Critical edge?
|
||||
BasicBlock::const_iterator I, E;
|
||||
for (I = LLVMBB->begin(), E = --LLVMBB->end(); I != E; ++I)
|
||||
if (isa<EHSelectorInst>(I))
|
||||
break;
|
||||
|
||||
if (I == E)
|
||||
// No catch info found - try to extract some from the successor.
|
||||
CopyCatchInfo(Br->getSuccessor(0), LLVMBB, &MF->getMMI(), *FuncInfo);
|
||||
}
|
||||
}
|
||||
|
||||
/// TryToFoldFastISelLoad - We're checking to see if we can fold the specified
|
||||
|
Loading…
x
Reference in New Issue
Block a user