[PATCH] D15478: [MS ABI] Don't rely on terminatepad

David Majnemer via cfe-commits cfe-commits at lists.llvm.org
Sat Dec 12 12:02:39 PST 2015


majnemer created this revision.
majnemer added a reviewer: rnk.
majnemer added a subscriber: cfe-commits.

We'd like to remove support for terminatepad from LLVM.  To do this, we
need to move Clang off of it first.  The intent behind terminatepad was
to carefully model exception specifications for the MSVC personality.

However, we don't support exception specifications for the MSVC
personality and neither does MSVC.  Instead, MSVC supports
all-or-nothing exception specifications.  We can model this limited
usage using cleanuppads which call std::terminate.

http://reviews.llvm.org/D15478

Files:
  lib/CodeGen/CGException.cpp
  test/CodeGenCXX/exceptions-cxx-new.cpp
  test/CodeGenCXX/microsoft-abi-eh-terminate.cpp

Index: test/CodeGenCXX/microsoft-abi-eh-terminate.cpp
===================================================================
--- test/CodeGenCXX/microsoft-abi-eh-terminate.cpp
+++ test/CodeGenCXX/microsoft-abi-eh-terminate.cpp
@@ -9,6 +9,7 @@
 // CHECK-LABEL: define void @"\01?never_throws@@YAXXZ"()
 // CHECK-SAME:          personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*)
 // CHECK:      invoke void @"\01?may_throw@@YAXXZ"()
-// MSVC2013:      terminatepad within none [void ()* @"\01?terminate@@YAXXZ"]
-// MSVC2015:      terminatepad within none [void ()* @__std_terminate]
+// CHECK:      cleanuppad within none []
+// MSVC2013:      call void @"\01?terminate@@YAXXZ"()
+// MSVC2015:      call void @__std_terminate()
 // CHECK-NEXT: unreachable
Index: test/CodeGenCXX/exceptions-cxx-new.cpp
===================================================================
--- test/CodeGenCXX/exceptions-cxx-new.cpp
+++ test/CodeGenCXX/exceptions-cxx-new.cpp
@@ -72,5 +72,6 @@
 // CHECK:   ret void
 
 // CHECK: [[TERMINATE]]
-// CHECK:   terminatepad within none [void ()* @"\01?terminate@@YAXXZ"] unwind to caller
+// CHECK:   cleanuppad within none []
+// CHECK-NEXT:   call void @"\01?terminate@@YAXXZ"()
 
Index: lib/CodeGen/CGException.cpp
===================================================================
--- lib/CodeGen/CGException.cpp
+++ lib/CodeGen/CGException.cpp
@@ -1325,21 +1325,20 @@
   // end of the function by FinishFunction.
   TerminateHandler = createBasicBlock("terminate.handler");
   Builder.SetInsertPoint(TerminateHandler);
+  llvm::Value *Exn = nullptr;
   if (EHPersonality::get(*this).usesFuncletPads()) {
     llvm::Value *ParentPad = CurrentFuncletPad;
     if (!ParentPad)
       ParentPad = llvm::ConstantTokenNone::get(CGM.getLLVMContext());
-    Builder.CreateTerminatePad(ParentPad, /*UnwindBB=*/nullptr,
-                               {CGM.getTerminateFn()});
+    Builder.CreateCleanupPad(ParentPad);
   } else {
-    llvm::Value *Exn = nullptr;
     if (getLangOpts().CPlusPlus)
       Exn = getExceptionFromSlot();
-    llvm::CallInst *terminateCall =
-        CGM.getCXXABI().emitTerminateForUnexpectedException(*this, Exn);
-    terminateCall->setDoesNotReturn();
-    Builder.CreateUnreachable();
   }
+  llvm::CallInst *terminateCall =
+      CGM.getCXXABI().emitTerminateForUnexpectedException(*this, Exn);
+  terminateCall->setDoesNotReturn();
+  Builder.CreateUnreachable();
 
   // Restore the saved insertion state.
   Builder.restoreIP(SavedIP);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15478.42641.patch
Type: text/x-patch
Size: 2506 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151212/cd71185c/attachment.bin>


More information about the cfe-commits mailing list