From 070280e97f801ae809ddcc7930c153929f253997 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Wed, 23 May 2007 11:08:31 +0000 Subject: [PATCH] Mark all calls as "could throw", when exceptions are enabled. Emit necessary LP info too. This fixes PR1439 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37311 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineModuleInfo.h | 1 + lib/CodeGen/DwarfWriter.cpp | 2 +- lib/CodeGen/MachineModuleInfo.cpp | 16 +++-- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 71 ++++++++++--------- 4 files changed, 52 insertions(+), 38 deletions(-) diff --git a/include/llvm/CodeGen/MachineModuleInfo.h b/include/llvm/CodeGen/MachineModuleInfo.h index 4e7ce5b8f12..c13ba517529 100644 --- a/include/llvm/CodeGen/MachineModuleInfo.h +++ b/include/llvm/CodeGen/MachineModuleInfo.h @@ -967,6 +967,7 @@ struct LandingPadInfo { LandingPadInfo(MachineBasicBlock *MBB) : LandingPadBlock(MBB) , LandingPadLabel(0) + , Personality(NULL) , TypeIds() , IsFilter(false) {} diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index 23ce4b2bf44..7e97788bc12 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -2852,7 +2852,7 @@ private: EmitLabel("eh_frame_begin", EHFrameInfo.Number); - EmitSectionOffset("eh_frame_begin", "section_eh_frame", + EmitSectionOffset("eh_frame_begin", "eh_frame_common", EHFrameInfo.Number, EHFrameInfo.PersonalityIndex, true, true); Asm->EOL("FDE CIE offset"); diff --git a/lib/CodeGen/MachineModuleInfo.cpp b/lib/CodeGen/MachineModuleInfo.cpp index d4d132989ec..564c070bc34 100644 --- a/lib/CodeGen/MachineModuleInfo.cpp +++ b/lib/CodeGen/MachineModuleInfo.cpp @@ -1723,7 +1723,9 @@ void MachineModuleInfo::TidyLandingPads() { LandingPadInfo &LandingPad = LandingPads[i]; LandingPad.LandingPadLabel = MappedLabel(LandingPad.LandingPadLabel); - if (!LandingPad.LandingPadLabel) { + // Special case: we *should* emit LPs with null LP MBB. This indicates + // "rethrow" case. + if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { LandingPads.erase(LandingPads.begin() + i); continue; } @@ -1768,9 +1770,15 @@ Function *MachineModuleInfo::getPersonality() const { /// getPersonalityIndex - Return unique index for current personality /// function. NULL personality function should always get zero index. unsigned MachineModuleInfo::getPersonalityIndex() const { - const Function* Personality = (!LandingPads.empty() ? - LandingPads[0].Personality : NULL); - + const Function* Personality = NULL; + + // Scan landing pads. If there is at least one non-NULL personality - use it. + for (unsigned i = 0; i != LandingPads.size(); ++i) + if (LandingPads[i].Personality) { + Personality = LandingPads[i].Personality; + break; + } + for (unsigned i = 0; i < Personalities.size(); ++i) { if (Personalities[i] == Personality) return i; diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 7fd1938e7a7..1115b219948 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -529,8 +529,9 @@ public: void ExportFromCurrentBlock(Value *V); void LowerCallTo(Instruction &I, const Type *CalledValueTy, unsigned CallingConv, - bool IsTailCall, SDOperand Callee, unsigned OpIdx); - + bool IsTailCall, SDOperand Callee, unsigned OpIdx, + MachineBasicBlock *LandingPad = NULL); + // Terminator instructions. void visitRet(ReturnInst &I); void visitBr(BranchInst &I); @@ -1341,31 +1342,13 @@ void SelectionDAGLowering::visitInvoke(InvokeInst &I, bool AsTerminator) { if (!AsTerminator) { // Mark landing pad so that it doesn't get deleted in branch folding. LandingPad->setIsLandingPad(); - - // Insert a label before the invoke call to mark the try range. - // This can be used to detect deletion of the invoke via the - // MachineModuleInfo. - MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - unsigned BeginLabel = MMI->NextLabelID(); - DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), - DAG.getConstant(BeginLabel, MVT::i32))); - + LowerCallTo(I, I.getCalledValue()->getType(), - I.getCallingConv(), - false, - getValue(I.getOperand(0)), - 3); - - // Insert a label before the invoke call to mark the try range. - // This can be used to detect deletion of the invoke via the - // MachineModuleInfo. - unsigned EndLabel = MMI->NextLabelID(); - DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), - DAG.getConstant(EndLabel, MVT::i32))); - - // Inform MachineModuleInfo of range. - MMI->addInvoke(LandingPad, BeginLabel, EndLabel); - + I.getCallingConv(), + false, + getValue(I.getOperand(0)), + 3, LandingPad); + // Update successor info CurMBB->addSuccessor(Return); CurMBB->addSuccessor(LandingPad); @@ -2782,11 +2765,14 @@ void SelectionDAGLowering::LowerCallTo(Instruction &I, const Type *CalledValueTy, unsigned CallingConv, bool IsTailCall, - SDOperand Callee, unsigned OpIdx) { + SDOperand Callee, unsigned OpIdx, + MachineBasicBlock *LandingPad) { const PointerType *PT = cast(CalledValueTy); const FunctionType *FTy = cast(PT->getElementType()); const ParamAttrsList *Attrs = FTy->getParamAttrs(); - + MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); + unsigned BeginLabel = 0, EndLabel = 0; + TargetLowering::ArgListTy Args; TargetLowering::ArgListEntry Entry; Args.reserve(I.getNumOperands()); @@ -2803,6 +2789,14 @@ void SelectionDAGLowering::LowerCallTo(Instruction &I, Args.push_back(Entry); } + if (ExceptionHandling) { + // Insert a label before the invoke call to mark the try range. This can be + // used to detect deletion of the invoke via the MachineModuleInfo. + BeginLabel = MMI->NextLabelID(); + DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), + DAG.getConstant(BeginLabel, MVT::i32))); + } + std::pair Result = TLI.LowerCallTo(getRoot(), I.getType(), Attrs && Attrs->paramHasAttr(0, ParamAttr::SExt), @@ -2811,6 +2805,17 @@ void SelectionDAGLowering::LowerCallTo(Instruction &I, if (I.getType() != Type::VoidTy) setValue(&I, Result.first); DAG.setRoot(Result.second); + + if (ExceptionHandling) { + // Insert a label at the end of the invoke call to mark the try range. This + // can be used to detect deletion of the invoke via the MachineModuleInfo. + EndLabel = MMI->NextLabelID(); + DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), + DAG.getConstant(EndLabel, MVT::i32))); + + // Inform MachineModuleInfo of range. + MMI->addInvoke(LandingPad, BeginLabel, EndLabel); + } } @@ -2871,12 +2876,12 @@ void SelectionDAGLowering::visitCall(CallInst &I) { Callee = getValue(I.getOperand(0)); else Callee = DAG.getExternalSymbol(RenameFn, TLI.getPointerTy()); - + LowerCallTo(I, I.getCalledValue()->getType(), - I.getCallingConv(), - I.isTailCall(), - Callee, - 1); + I.getCallingConv(), + I.isTailCall(), + Callee, + 1); } -- 2.34.1