diff options
Diffstat (limited to 'lib/CodeGen/CGException.cpp')
-rw-r--r-- | lib/CodeGen/CGException.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index d1edde5273..5e26e9bbea 100644 --- a/lib/CodeGen/CGException.cpp +++ b/lib/CodeGen/CGException.cpp @@ -165,6 +165,10 @@ static void CopyObject(CodeGenFunction &CGF, const Expr *E, llvm::Value *N) { llvm::Value *Src = CGF.EmitLValue(E).getAddress(); + llvm::BasicBlock *TerminateHandler = CGF.getTerminateHandler(); + llvm::BasicBlock *PrevLandingPad = CGF.getInvokeDest(); + CGF.setInvokeDest(TerminateHandler); + // Stolen from EmitClassAggrMemberwiseCopy llvm::Value *Callee = CGF.CGM.GetAddrOfCXXConstructor(CopyCtor, Ctor_Complete); @@ -179,6 +183,7 @@ static void CopyObject(CodeGenFunction &CGF, const Expr *E, llvm::Value *N) { CopyCtor->getType()->getAs<FunctionType>()->getResultType(); CGF.EmitCall(CGF.CGM.getTypes().getFunctionInfo(ResultType, CallArgs), Callee, CallArgs, CopyCtor); + CGF.setInvokeDest(PrevLandingPad); } else llvm::llvm_unreachable("uncopyable object"); } @@ -253,7 +258,6 @@ void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) { llvm::ConstantInt::get(SizeTy, TypeSize), "exception"); - // FIXME: terminate protect this CopyObject(*this, E->getSubExpr(), ExceptionPtr); // Now throw the exception. @@ -685,6 +689,13 @@ CodeGenFunction::EHCleanupBlock::~EHCleanupBlock() { } llvm::BasicBlock *CodeGenFunction::getTerminateHandler() { + llvm::BasicBlock *Cont = 0; + + if (HaveInsertPoint()) { + Cont = createBasicBlock("cont"); + EmitBranch(Cont); + } + llvm::Constant *Personality = CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::getInt32Ty (VMContext), @@ -706,7 +717,7 @@ llvm::BasicBlock *CodeGenFunction::getTerminateHandler() { Args.push_back(Exc); Args.push_back(Personality); Args.push_back(llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), - 0)); + 1)); Builder.CreateCall(llvm_eh_selector, Args.begin(), Args.end()); llvm::CallInst *TerminateCall = Builder.CreateCall(getTerminateFn(*this)); @@ -717,5 +728,8 @@ llvm::BasicBlock *CodeGenFunction::getTerminateHandler() { // Clear the insertion point to indicate we are in unreachable code. Builder.ClearInsertionPoint(); + if (Cont) + EmitBlock(Cont); + return TerminateHandler; } |