]> granicus.if.org Git - clang/commitdiff
[WinEH] Don't emit an exceptional cleanup for llvm.eh.endcatch
authorReid Kleckner <reid@kleckner.net>
Wed, 22 Apr 2015 23:39:15 +0000 (23:39 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 22 Apr 2015 23:39:15 +0000 (23:39 +0000)
These extra endcatch markers aren't helping identify regions to outline,
so let's get rid of them.  LLVM outlines (more or less) from begincatch
to endcatch.  Any unwind edge from an enclosed invoke is a transition to
a new exception handler, which has it's own outlining markers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235562 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MicrosoftCXXABI.cpp
test/CodeGenCXX/microsoft-abi-eh-catch.cpp

index f00cd9c81dff0700fe3fc6d4cf3bda8637b405a8..42135954bbd0107687c070629f938b43584079aa 100644 (file)
@@ -814,7 +814,7 @@ void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF,
   if (!CatchParam || !CatchParam->getDeclName()) {
     llvm::Value *Args[2] = {Exn, llvm::Constant::getNullValue(CGF.Int8PtrTy)};
     CGF.EmitNounwindRuntimeCall(BeginCatch, Args);
-    CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalAndEHCleanup);
+    CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalCleanup);
     return;
   }
 
@@ -823,8 +823,7 @@ void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF,
       CGF.Builder.CreateBitCast(var.getObjectAddress(CGF), CGF.Int8PtrTy);
   llvm::Value *Args[2] = {Exn, ParamAddr};
   CGF.EmitNounwindRuntimeCall(BeginCatch, Args);
-  // FIXME: Do we really need exceptional endcatch cleanups?
-  CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalAndEHCleanup);
+  CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalCleanup);
   CGF.EmitAutoVarCleanups(var);
 }
 
index 292fad2e4d6fee1ad882a3e8c32f90b6596ccccd..d7268bf38529eff76609c34c089d9952e646d499 100644 (file)
@@ -116,3 +116,39 @@ extern "C" void fn_with_exc_spec() throw(int) {
 // WIN64-LABEL: define void @fn_with_exc_spec()
 // WIN64: call void @might_throw()
 // WIN64-NEXT: ret void
+
+extern "C" void catch_nested() {
+  try {
+    might_throw();
+  } catch (int) {
+    try {
+      might_throw();
+    } catch (int) {
+      might_throw();
+    }
+  }
+}
+
+// WIN64-LABEL: define void @catch_nested()
+// WIN64: invoke void @might_throw()
+// WIN64-NEXT: to label %[[cont1:[^ ]*]] unwind label %[[lp1:[^ ]*]]
+// WIN64: [[cont1]]
+//
+// WIN64: [[lp1]]
+// WIN64: landingpad { i8*, i32 }
+// WIN64: call void @llvm.eh.begincatch(i8* %{{.*}}, i8* null)
+// WIN64: invoke void @might_throw()
+// WIN64-NEXT: to label %[[cont2:[^ ]*]] unwind label %[[lp2:[^ ]*]]
+//
+// WIN64: [[cont2]]
+// WIN64-NEXT: br label %[[trycont:[^ ]*]]
+//
+// WIN64: [[lp2]]
+// WIN64: landingpad { i8*, i32 }
+// WIN64: call void @llvm.eh.begincatch(i8* %{{.*}}, i8* null)
+// WIN64-NEXT: call void @might_throw()
+// WIN64-NEXT: call void @llvm.eh.endcatch()
+// WIN64-NEXT: br label %[[trycont]]
+//
+// WIN64: [[trycont]]
+// WIN64: call void @llvm.eh.endcatch()