diff options
author | Reid Kleckner <rnk@google.com> | 2015-08-27 23:27:47 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2015-08-27 23:27:47 +0000 |
commit | 0e2882345daead6cd9368eda4107e860d9141e35 (patch) | |
tree | be2bbccebdc6d0f2648fe9612ff4338b1f8b4f2f /llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | |
parent | 67bc8d6b3f69f83e6f2688d960b8a273cee57a20 (diff) | |
download | bcm5719-llvm-0e2882345daead6cd9368eda4107e860d9141e35.tar.gz bcm5719-llvm-0e2882345daead6cd9368eda4107e860d9141e35.zip |
[WinEH] Add some support for code generating catchpad
We can now run 32-bit programs with empty catch bodies. The next step
is to change PEI so that we get funclet prologues and epilogues.
llvm-svn: 246235
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 48811bdea59..63328200f8d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1158,30 +1158,56 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) { llvm_unreachable("Can't get register for value!"); } -void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) { - report_fatal_error("visitCleanupRet not yet implemented!"); -} +void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) { + // Update machine-CFG edges. + MachineBasicBlock *PadMBB = FuncInfo.MBB; + MachineBasicBlock *CatchingMBB = FuncInfo.MBBMap[I.getNormalDest()]; + MachineBasicBlock *UnwindMBB = FuncInfo.MBBMap[I.getUnwindDest()]; + PadMBB->addSuccessor(CatchingMBB); + PadMBB->addSuccessor(UnwindMBB); -void SelectionDAGBuilder::visitCatchEndPad(const CatchEndPadInst &I) { - report_fatal_error("visitCatchEndPad not yet implemented!"); + CatchingMBB->setIsEHFuncletEntry(); + MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI(); + MMI.setHasEHFunclets(true); } void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) { - report_fatal_error("visitCatchRet not yet implemented!"); -} + // Update machine-CFG edge. + MachineBasicBlock *PadMBB = FuncInfo.MBB; + MachineBasicBlock *TargetMBB = FuncInfo.MBBMap[I.getSuccessor()]; + PadMBB->addSuccessor(TargetMBB); -void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) { - report_fatal_error("visitCatchPad not yet implemented!"); + // Create the terminator node. + SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other, + getControlRoot(), DAG.getBasicBlock(TargetMBB)); + DAG.setRoot(Ret); } -void SelectionDAGBuilder::visitTerminatePad(const TerminatePadInst &TPI) { - report_fatal_error("visitTerminatePad not yet implemented!"); +void SelectionDAGBuilder::visitCatchEndPad(const CatchEndPadInst &I) { + // If this unwinds to caller, we don't need a DAG node hanging around. + if (!I.hasUnwindDest()) + return; + + // Update machine-CFG edge. + MachineBasicBlock *PadMBB = FuncInfo.MBB; + MachineBasicBlock *UnwindMBB = FuncInfo.MBBMap[I.getUnwindDest()]; + PadMBB->addSuccessor(UnwindMBB); } void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) { + MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI(); + MMI.setHasEHFunclets(true); report_fatal_error("visitCleanupPad not yet implemented!"); } +void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) { + report_fatal_error("visitCleanupRet not yet implemented!"); +} + +void SelectionDAGBuilder::visitTerminatePad(const TerminatePadInst &TPI) { + report_fatal_error("visitTerminatePad not yet implemented!"); +} + void SelectionDAGBuilder::visitRet(const ReturnInst &I) { const TargetLowering &TLI = DAG.getTargetLoweringInfo(); auto &DL = DAG.getDataLayout(); @@ -2021,7 +2047,7 @@ void SelectionDAGBuilder::visitResume(const ResumeInst &RI) { } void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) { - assert(FuncInfo.MBB->isLandingPad() && + assert(FuncInfo.MBB->isEHPad() && "Call to landingpad not in landing pad!"); MachineBasicBlock *MBB = FuncInfo.MBB; @@ -5094,7 +5120,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) { assert(Reg && "cannot get exception code on this platform"); MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout()); const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT); - assert(FuncInfo.MBB->isLandingPad() && "eh.exceptioncode in non-lpad"); + assert(FuncInfo.MBB->isEHPad() && "eh.exceptioncode in non-lpad"); unsigned VReg = FuncInfo.MBB->addLiveIn(Reg, PtrRC); SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), getCurSDLoc(), VReg, PtrVT); |