]> granicus.if.org Git - clang/commitdiff
Add a simplified EmitJumpThroughFinally and use it in CGObjC in preparation of making...
authorAnders Carlsson <andersca@mac.com>
Sun, 8 Feb 2009 22:25:30 +0000 (22:25 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 8 Feb 2009 22:25:30 +0000 (22:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64098 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CodeGenFunction.h

index ba2f5262fd1365466380973fcba89d267436cbb1..aad569aace869e8d7693dab9142f8c398bf3dbfc 100644 (file)
@@ -1904,7 +1904,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
   CGF.EmitBlock(TryBlock);
   CGF.EmitStmt(isTry ? cast<ObjCAtTryStmt>(S).getTryBody() 
                      : cast<ObjCAtSynchronizedStmt>(S).getSynchBody());
-  CGF.EmitJumpThroughFinally(&EHEntry, FinallyEnd);
+  CGF.EmitJumpThroughFinally(FinallyEnd);
   
   // Emit the "exception in @try" block.
   CGF.EmitBlock(TryHandler);
@@ -1919,7 +1919,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
   {
     CGF.Builder.CreateStore(Caught, RethrowPtr);
     CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
-    CGF.EmitJumpThroughFinally(&EHEntry, FinallyRethrow, false);    
+    CGF.EmitJumpThroughFinally(FinallyRethrow);
   }
   else if (const ObjCAtCatchStmt* CatchStmt = 
            cast<ObjCAtTryStmt>(S).getCatchStmts()) 
@@ -1973,7 +1973,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
         }
         
         CGF.EmitStmt(CatchStmt->getCatchBody());
-        CGF.EmitJumpThroughFinally(&EHEntry, FinallyEnd);
+        CGF.EmitJumpThroughFinally(FinallyEnd);
         break;
       }
       
@@ -2004,7 +2004,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
       CGF.Builder.CreateStore(Tmp, CGF.GetAddrOfLocalVar(VD));
       
       CGF.EmitStmt(CatchStmt->getCatchBody());
-      CGF.EmitJumpThroughFinally(&EHEntry, FinallyEnd);
+      CGF.EmitJumpThroughFinally(FinallyEnd);
       
       CGF.EmitBlock(NextCatchBlock);
     }
@@ -2013,7 +2013,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
       // None of the handlers caught the exception, so store it to be
       // rethrown at the end of the @finally block.
       CGF.Builder.CreateStore(Caught, RethrowPtr);
-      CGF.EmitJumpThroughFinally(&EHEntry, FinallyRethrow);
+      CGF.EmitJumpThroughFinally(FinallyRethrow);
     }
     
     // Emit the exception handler for the @catch blocks.
@@ -2022,11 +2022,11 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
                                                    ExceptionData), 
                             RethrowPtr);
     CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
-    CGF.EmitJumpThroughFinally(&EHEntry, FinallyRethrow, false);
+    CGF.EmitJumpThroughFinally(FinallyRethrow);
   } else {
     CGF.Builder.CreateStore(Caught, RethrowPtr);
     CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
-    CGF.EmitJumpThroughFinally(&EHEntry, FinallyRethrow, false);    
+    CGF.EmitJumpThroughFinally(FinallyRethrow);
   }
   
   // Pop the exception-handling stack entry. It is important to do
@@ -2090,9 +2090,12 @@ void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
   CGF.Builder.ClearInsertionPoint();
 }
 
+void CodeGenFunction::EmitJumpThroughFinally(llvm::BasicBlock *Dest) {
+  EmitJumpThroughFinally(ObjCEHStack.back(), Dest);
+}
+
 void CodeGenFunction::EmitJumpThroughFinally(ObjCEHEntry *E,
-                                             llvm::BasicBlock *Dst,
-                                             bool ExecuteTryExit) {
+                                             llvm::BasicBlock *Dst) {
   if (!HaveInsertPoint())
     return;
   
index 320e26b82d7419d60e27ef3c944c4ef1ecd8f640..248bb1826222473c5d7f167e10962169b9bbd84f 100644 (file)
@@ -125,8 +125,9 @@ public:
   ///
   /// \param ExecuteTryExit - When true, the try_exit runtime function
   /// should be called prior to executing the finally code.
-  void EmitJumpThroughFinally(ObjCEHEntry *Entry, llvm::BasicBlock *Dest,
-                              bool ExecuteTryExit=true);
+  void EmitJumpThroughFinally(ObjCEHEntry *Entry, llvm::BasicBlock *Dest);
+  
+  void EmitJumpThroughFinally(llvm::BasicBlock *Dest);
   
   /// PushCleanupBlock - Push a new cleanup entry on the stack and set the
   /// passed in block as the cleanup block.