mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-27 05:30:49 +00:00
Factor out EH landing pad code into a separate function, and constify
a bunch of stuff to support it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101273 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7f6b8b8891
commit
2520864773
@ -47,7 +47,7 @@ protected:
|
||||
DenseMap<const BasicBlock *, MachineBasicBlock *> &MBBMap;
|
||||
DenseMap<const AllocaInst *, int> &StaticAllocaMap;
|
||||
#ifndef NDEBUG
|
||||
SmallSet<Instruction*, 8> &CatchInfoLost;
|
||||
SmallSet<const Instruction *, 8> &CatchInfoLost;
|
||||
#endif
|
||||
MachineFunction &MF;
|
||||
MachineRegisterInfo &MRI;
|
||||
@ -118,7 +118,7 @@ protected:
|
||||
DenseMap<const BasicBlock *, MachineBasicBlock *> &bm,
|
||||
DenseMap<const AllocaInst *, int> &am
|
||||
#ifndef NDEBUG
|
||||
, SmallSet<Instruction*, 8> &cil
|
||||
, SmallSet<const Instruction *, 8> &cil
|
||||
#endif
|
||||
);
|
||||
|
||||
|
@ -278,6 +278,7 @@ private:
|
||||
SDNode *MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTs,
|
||||
const SDValue *Ops, unsigned NumOps, unsigned EmitNodeInfo);
|
||||
|
||||
void PrepareEHLandingPad(MachineBasicBlock *BB);
|
||||
void SelectAllBasicBlocks(Function &Fn, MachineFunction &MF,
|
||||
const TargetInstrInfo &TII);
|
||||
void FinishBasicBlock();
|
||||
|
@ -1278,7 +1278,7 @@ public:
|
||||
DenseMap<const BasicBlock *, MachineBasicBlock *> &,
|
||||
DenseMap<const AllocaInst *, int> &
|
||||
#ifndef NDEBUG
|
||||
, SmallSet<Instruction*, 8> &CatchInfoLost
|
||||
, SmallSet<const Instruction *, 8> &CatchInfoLost
|
||||
#endif
|
||||
) {
|
||||
return 0;
|
||||
|
@ -739,7 +739,7 @@ FastISel::FastISel(MachineFunction &mf,
|
||||
DenseMap<const BasicBlock *, MachineBasicBlock *> &bm,
|
||||
DenseMap<const AllocaInst *, int> &am
|
||||
#ifndef NDEBUG
|
||||
, SmallSet<Instruction*, 8> &cil
|
||||
, SmallSet<const Instruction *, 8> &cil
|
||||
#endif
|
||||
)
|
||||
: MBB(0),
|
||||
|
@ -305,10 +305,10 @@ GlobalVariable *llvm::ExtractTypeInfo(Value *V) {
|
||||
|
||||
/// AddCatchInfo - Extract the personality and type infos from an eh.selector
|
||||
/// call, and add them to the specified machine basic block.
|
||||
void llvm::AddCatchInfo(CallInst &I, MachineModuleInfo *MMI,
|
||||
void llvm::AddCatchInfo(const CallInst &I, MachineModuleInfo *MMI,
|
||||
MachineBasicBlock *MBB) {
|
||||
// Inform the MachineModuleInfo of the personality for this landing pad.
|
||||
ConstantExpr *CE = cast<ConstantExpr>(I.getOperand(2));
|
||||
const ConstantExpr *CE = cast<ConstantExpr>(I.getOperand(2));
|
||||
assert(CE->getOpcode() == Instruction::BitCast &&
|
||||
isa<Function>(CE->getOperand(0)) &&
|
||||
"Personality should be a function");
|
||||
@ -320,7 +320,7 @@ void llvm::AddCatchInfo(CallInst &I, MachineModuleInfo *MMI,
|
||||
unsigned N = I.getNumOperands();
|
||||
|
||||
for (unsigned i = N - 1; i > 2; --i) {
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand(i))) {
|
||||
if (const ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand(i))) {
|
||||
unsigned FilterLength = CI->getZExtValue();
|
||||
unsigned FirstCatch = i + FilterLength + !FilterLength;
|
||||
assert (FirstCatch <= N && "Invalid filter length");
|
||||
@ -357,10 +357,11 @@ void llvm::AddCatchInfo(CallInst &I, MachineModuleInfo *MMI,
|
||||
}
|
||||
}
|
||||
|
||||
void llvm::CopyCatchInfo(BasicBlock *SrcBB, BasicBlock *DestBB,
|
||||
void llvm::CopyCatchInfo(const BasicBlock *SrcBB, const BasicBlock *DestBB,
|
||||
MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) {
|
||||
for (BasicBlock::iterator I = SrcBB->begin(), E = --SrcBB->end(); I != E; ++I)
|
||||
if (EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) {
|
||||
for (BasicBlock::const_iterator I = SrcBB->begin(), E = --SrcBB->end();
|
||||
I != E; ++I)
|
||||
if (const EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) {
|
||||
// Apply the catch info to DestBB.
|
||||
AddCatchInfo(*EHSel, MMI, FLI.MBBMap[DestBB]);
|
||||
#ifndef NDEBUG
|
||||
|
@ -74,8 +74,8 @@ public:
|
||||
DenseMap<const AllocaInst*, int> StaticAllocaMap;
|
||||
|
||||
#ifndef NDEBUG
|
||||
SmallSet<Instruction*, 8> CatchInfoLost;
|
||||
SmallSet<Instruction*, 8> CatchInfoFound;
|
||||
SmallSet<const Instruction *, 8> CatchInfoLost;
|
||||
SmallSet<const Instruction *, 8> CatchInfoFound;
|
||||
#endif
|
||||
|
||||
struct LiveOutInfo {
|
||||
@ -143,10 +143,11 @@ GlobalVariable *ExtractTypeInfo(Value *V);
|
||||
|
||||
/// AddCatchInfo - Extract the personality and type infos from an eh.selector
|
||||
/// call, and add them to the specified machine basic block.
|
||||
void AddCatchInfo(CallInst &I, MachineModuleInfo *MMI, MachineBasicBlock *MBB);
|
||||
void AddCatchInfo(const CallInst &I,
|
||||
MachineModuleInfo *MMI, MachineBasicBlock *MBB);
|
||||
|
||||
/// CopyCatchInfo - Copy catch information from DestBB to SrcBB.
|
||||
void CopyCatchInfo(BasicBlock *SrcBB, BasicBlock *DestBB,
|
||||
void CopyCatchInfo(const BasicBlock *SrcBB, const BasicBlock *DestBB,
|
||||
MachineModuleInfo *MMI, FunctionLoweringInfo &FLI);
|
||||
|
||||
/// hasInlineAsmMemConstraint - Return true if the inline asm instruction being
|
||||
|
@ -699,6 +699,50 @@ void SelectionDAGISel::DoInstructionSelection() {
|
||||
PostprocessISelDAG();
|
||||
}
|
||||
|
||||
/// PrepareEHLandingPad - Emit an EH_LABEL, set up live-in registers, and
|
||||
/// do other setup for EH landing-pad blocks.
|
||||
void SelectionDAGISel::PrepareEHLandingPad(MachineBasicBlock *BB) {
|
||||
// Add a label to mark the beginning of the landing pad. Deletion of the
|
||||
// landing pad can thus be detected via the MachineModuleInfo.
|
||||
MCSymbol *Label = MF->getMMI().addLandingPad(BB);
|
||||
|
||||
const TargetInstrDesc &II =
|
||||
TLI.getTargetMachine().getInstrInfo()->get(TargetOpcode::EH_LABEL);
|
||||
BuildMI(BB, SDB->getCurDebugLoc(), II).addSym(Label);
|
||||
|
||||
// Mark exception register as live in.
|
||||
unsigned Reg = TLI.getExceptionAddressRegister();
|
||||
if (Reg) BB->addLiveIn(Reg);
|
||||
|
||||
// Mark exception selector register as live in.
|
||||
Reg = TLI.getExceptionSelectorRegister();
|
||||
if (Reg) BB->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 = BB->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);
|
||||
}
|
||||
}
|
||||
|
||||
void SelectionDAGISel::SelectAllBasicBlocks(Function &Fn,
|
||||
MachineFunction &MF,
|
||||
@ -742,47 +786,10 @@ void SelectionDAGISel::SelectAllBasicBlocks(Function &Fn,
|
||||
}
|
||||
}
|
||||
|
||||
if (BB->isLandingPad()) {
|
||||
// Add a label to mark the beginning of the landing pad. Deletion of the
|
||||
// landing pad can thus be detected via the MachineModuleInfo.
|
||||
MCSymbol *Label = MF.getMMI().addLandingPad(BB);
|
||||
|
||||
const TargetInstrDesc &II = TII.get(TargetOpcode::EH_LABEL);
|
||||
BuildMI(BB, SDB->getCurDebugLoc(), II).addSym(Label);
|
||||
|
||||
// Mark exception register as live in.
|
||||
unsigned Reg = TLI.getExceptionAddressRegister();
|
||||
if (Reg) BB->addLiveIn(Reg);
|
||||
|
||||
// Mark exception selector register as live in.
|
||||
Reg = TLI.getExceptionSelectorRegister();
|
||||
if (Reg) BB->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.
|
||||
BranchInst *Br = dyn_cast<BranchInst>(LLVMBB->getTerminator());
|
||||
|
||||
if (Br && Br->isUnconditional()) { // Critical edge?
|
||||
BasicBlock::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);
|
||||
}
|
||||
}
|
||||
|
||||
// Setup an EH landing-pad block.
|
||||
if (BB->isLandingPad())
|
||||
PrepareEHLandingPad(BB);
|
||||
|
||||
// Before doing SelectionDAG ISel, see if FastISel has been requested.
|
||||
if (FastIS && !SuppressFastISel) {
|
||||
// Emit code for any incoming arguments. This must happen before
|
||||
|
@ -58,7 +58,7 @@ public:
|
||||
DenseMap<const BasicBlock *, MachineBasicBlock *> &bm,
|
||||
DenseMap<const AllocaInst *, int> &am
|
||||
#ifndef NDEBUG
|
||||
, SmallSet<Instruction*, 8> &cil
|
||||
, SmallSet<const Instruction *, 8> &cil
|
||||
#endif
|
||||
)
|
||||
: FastISel(mf, vm, bm, am
|
||||
@ -1755,7 +1755,7 @@ namespace llvm {
|
||||
DenseMap<const BasicBlock *, MachineBasicBlock *> &bm,
|
||||
DenseMap<const AllocaInst *, int> &am
|
||||
#ifndef NDEBUG
|
||||
, SmallSet<Instruction*, 8> &cil
|
||||
, SmallSet<const Instruction *, 8> &cil
|
||||
#endif
|
||||
) {
|
||||
return new X86FastISel(mf, vm, bm, am
|
||||
|
@ -2410,7 +2410,7 @@ X86TargetLowering::createFastISel(MachineFunction &mf,
|
||||
DenseMap<const BasicBlock*, MachineBasicBlock*> &bm,
|
||||
DenseMap<const AllocaInst *, int> &am
|
||||
#ifndef NDEBUG
|
||||
, SmallSet<Instruction*, 8> &cil
|
||||
, SmallSet<const Instruction *, 8> &cil
|
||||
#endif
|
||||
) {
|
||||
return X86::createFastISel(mf, vm, bm, am
|
||||
|
@ -581,7 +581,7 @@ namespace llvm {
|
||||
DenseMap<const BasicBlock *, MachineBasicBlock *> &,
|
||||
DenseMap<const AllocaInst *, int> &
|
||||
#ifndef NDEBUG
|
||||
, SmallSet<Instruction*, 8> &
|
||||
, SmallSet<const Instruction *, 8> &
|
||||
#endif
|
||||
);
|
||||
|
||||
@ -821,7 +821,7 @@ namespace llvm {
|
||||
DenseMap<const BasicBlock *, MachineBasicBlock *> &,
|
||||
DenseMap<const AllocaInst *, int> &
|
||||
#ifndef NDEBUG
|
||||
, SmallSet<Instruction*, 8> &
|
||||
, SmallSet<const Instruction*, 8> &
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user