[cfe-commits] r102204 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/exceptions.m

Daniel Dunbar daniel at zuster.org
Fri Apr 23 12:12:32 PDT 2010


Author: ddunbar
Date: Fri Apr 23 14:12:32 2010
New Revision: 102204

URL: http://llvm.org/viewvc/llvm-project?rev=102204&view=rev
Log:
NeXT/EH: When generating the rethrow code for a finally block, make sure to
chain outwards when inside a nested exception scope.
 - A real test for this is going into LLVM test-suite.

Added:
    cfe/trunk/test/CodeGenObjC/exceptions.m
Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=102204&r1=102203&r2=102204&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Fri Apr 23 14:12:32 2010
@@ -5772,9 +5772,19 @@
   // Branch around the rethrow code.
   CGF.EmitBranch(FinallyEnd);
 
+  // Generate the rethrow code, taking care to use an invoke if we are in a
+  // nested exception scope.
   CGF.EmitBlock(FinallyRethrow);
-  CGF.Builder.CreateCall(ObjCTypes.getUnwindResumeOrRethrowFn(),
-                         CGF.Builder.CreateLoad(RethrowPtr));
+  if (PrevLandingPad) {
+    llvm::BasicBlock *Cont = CGF.createBasicBlock("invoke.cont");
+    CGF.Builder.CreateInvoke(ObjCTypes.getUnwindResumeOrRethrowFn(),
+                             Cont, PrevLandingPad,
+                             CGF.Builder.CreateLoad(RethrowPtr));
+    CGF.EmitBlock(Cont);
+  } else {
+    CGF.Builder.CreateCall(ObjCTypes.getUnwindResumeOrRethrowFn(),
+                           CGF.Builder.CreateLoad(RethrowPtr));
+  }
   CGF.Builder.CreateUnreachable();
 
   CGF.EmitBlock(FinallyEnd);

Added: cfe/trunk/test/CodeGenObjC/exceptions.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/exceptions.m?rev=102204&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenObjC/exceptions.m (added)
+++ cfe/trunk/test/CodeGenObjC/exceptions.m Fri Apr 23 14:12:32 2010
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o %t %s
+//
+// <rdar://problem/7471679> [irgen] [eh] Exception code built with clang (x86_64) crashes
+
+// Just check that we don't emit any dead blocks.
+//
+// RUN: grep 'No predecessors' %t | count 0
+
+ at interface NSArray @end
+void f0() {
+  @try {
+    @try {
+      @throw @"a";
+    } @catch(NSArray *e) {
+    }
+  } @catch (id e) {
+  }
+}





More information about the cfe-commits mailing list