]> granicus.if.org Git - clang/commitdiff
Fixup reference binding for catch parameters.
authorMike Stump <mrs@apple.com>
Fri, 4 Dec 2009 01:51:45 +0000 (01:51 +0000)
committerMike Stump <mrs@apple.com>
Fri, 4 Dec 2009 01:51:45 +0000 (01:51 +0000)
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

lib/CodeGen/CGException.cpp

index 692153ed683a6bcbc52ac0a4667501b73b9ad196..d7149110543c407244df6d5634b9b0e72e65fabf 100644 (file)
@@ -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);