diff options
author | Mike Stump <mrs@apple.com> | 2009-12-04 01:51:45 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-12-04 01:51:45 +0000 |
commit | 0a3816e566db7cd6084310a2f5a3167d0ec30b31 (patch) | |
tree | 297c2ec025302918084e46efc45633e3d6dd635b /lib/CodeGen/CGException.cpp | |
parent | 13a5be10b198a5dc7e3e72c54481cd8b70f68495 (diff) |
Fixup reference binding for catch parameters.
Fixup throws and rethrows to use invoke as appropriate.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90513 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGException.cpp')
-rw-r--r-- | lib/CodeGen/CGException.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index 692153ed68..d714911054 100644 --- a/lib/CodeGen/CGException.cpp +++ b/lib/CodeGen/CGException.cpp @@ -210,7 +210,13 @@ static void CopyObject(CodeGenFunction &CGF, QualType ObjectType, void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) { if (!E->getSubExpr()) { - Builder.CreateCall(getReThrowFn(*this))->setDoesNotReturn(); + if (getInvokeDest()) { + llvm::BasicBlock *Cont = createBasicBlock("invoke.cont"); + Builder.CreateInvoke(getReThrowFn(*this), Cont, getInvokeDest()) + ->setDoesNotReturn(); + EmitBlock(Cont); + } else + Builder.CreateCall(getReThrowFn(*this))->setDoesNotReturn(); Builder.CreateUnreachable(); // Clear the insertion point to indicate we are in unreachable code. @@ -237,9 +243,18 @@ void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) { llvm::Constant *TypeInfo = CGM.GenerateRTTI(ThrowType); llvm::Constant *Dtor = llvm::Constant::getNullValue(Int8PtrTy); - llvm::CallInst *ThrowCall = - Builder.CreateCall3(getThrowFn(*this), ExceptionPtr, TypeInfo, Dtor); - ThrowCall->setDoesNotReturn(); + if (getInvokeDest()) { + llvm::BasicBlock *Cont = createBasicBlock("invoke.cont"); + llvm::InvokeInst *ThrowCall = + Builder.CreateInvoke3(getThrowFn(*this), Cont, getInvokeDest(), + ExceptionPtr, TypeInfo, Dtor); + ThrowCall->setDoesNotReturn(); + EmitBlock(Cont); + } else { + llvm::CallInst *ThrowCall = + Builder.CreateCall3(getThrowFn(*this), ExceptionPtr, TypeInfo, Dtor); + ThrowCall->setDoesNotReturn(); + } Builder.CreateUnreachable(); // Clear the insertion point to indicate we are in unreachable code. @@ -383,7 +398,8 @@ void CodeGenFunction::EmitCXXTryStmt(const CXXTryStmt &S) { setInvokeDest(TerminateHandler); bool WasPointer = true; if (!CatchType.getTypePtr()->isPointerType()) { - WasPointer = false; + if (!isa<ReferenceType>(CatchParam->getType())) + WasPointer = false; CatchType = getContext().getPointerType(CatchType); } ExcObject = Builder.CreateBitCast(ExcObject, ConvertType(CatchType)); @@ -428,7 +444,6 @@ void CodeGenFunction::EmitCXXTryStmt(const CXXTryStmt &S) { Builder.CreateInvoke(getEndCatchFn(*this), Cont, TerminateHandler, Args.begin(), Args.begin()); - EmitBlock(Cont); if (Info.SwitchBlock) EmitBlock(Info.SwitchBlock); |