<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sun, May 10, 2015 at 3:24 PM, Nico Weber <span dir="ltr"><<a href="mailto:thakis@chromium.org" target="_blank">thakis@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="h5">On Sun, May 10, 2015 at 2:38 PM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: majnemer<br>
Date: Sun May 10 16:38:26 2015<br>
New Revision: 236961<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=236961&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=236961&view=rev</a><br>
Log:<br>
[MS ABI] Update EH emission for MSVC 2015 compatibility<br>
<br>
MSVC 2015 renamed the symbol found by name lookup for 'std::terminate'<br>
so we cannot rely on using '?terminate@@YAXXZ'.  Furthermore, it seems<br>
that 2015 will be the first release of MSVC which permits inlining a<br>
function which is noexcept into a function which isn't.  This is<br>
implemented by creating a cleanup for the invoker which jumps to<br>
__std_terminate.  Clang's implementation of this aspect of the MSVC<br>
scheme is slightly less efficient in this respect because we use a<br>
catch handler configured as a catch-all handler instead.<br>
<br>
Added:<br>
    cfe/trunk/test/CodeGenCXX/microsoft-abi-eh-terminate.cpp<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGException.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGException.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=236961&r1=236960&r2=236961&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=236961&r1=236960&r2=236961&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGException.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGException.cpp Sun May 10 16:38:26 2015<br>
@@ -60,7 +60,10 @@ llvm::Constant *CodeGenModule::getTermin<br>
     name = "_ZSt9terminatev";<br>
   } else if (getLangOpts().CPlusPlus &&<br>
              getTarget().getCXXABI().isMicrosoft()) {<br>
-    name = "\01?terminate@@YAXXZ";<br>
+    if (getLangOpts().isCompatibleWithMSVC(19))<br></blockquote><div><br></div></div></div><div>Since this 19 is showing up in a few places, should there be a named constant (say, MSVS2015) for it?</div></div></div></div></blockquote><div><br></div><div>Done in r236967.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+      name = "__std_terminate";<br>
+    else<br>
+      name = "\01?terminate@@YAXXZ";<br>
   } else if (getLangOpts().ObjC1 &&<br>
              getLangOpts().ObjCRuntime.hasTerminate())<br>
     name = "objc_terminate";<br>
<br>
Added: cfe/trunk/test/CodeGenCXX/microsoft-abi-eh-terminate.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-eh-terminate.cpp?rev=236961&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-eh-terminate.cpp?rev=236961&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/microsoft-abi-eh-terminate.cpp (added)<br>
+++ cfe/trunk/test/CodeGenCXX/microsoft-abi-eh-terminate.cpp Sun May 10 16:38:26 2015<br>
@@ -0,0 +1,15 @@<br>
+// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=x86_64-pc-windows-msvc -mconstructor-aliases -fexceptions -fcxx-exceptions -fms-compatibility-version=18.00 | FileCheck -check-prefix=MSVC2013 %s<br>
+// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=x86_64-pc-windows-msvc -mconstructor-aliases -fexceptions -fcxx-exceptions -fms-compatibility-version=19.00 | FileCheck -check-prefix=MSVC2015 %s<br>
+<br>
+void may_throw();<br>
+void never_throws() noexcept(true) {<br>
+  may_throw();<br>
+}<br>
+<br>
+// CHECK-LABEL: define void @"\01?never_throws@@YAXXZ"<br>
+// CHECK:      invoke void @"\01?may_throw@@YAXXZ"()<br>
+<br>
+// CHECK:      landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*)<br>
+// MSVC2013:   call void @"\01?terminate@@YAXXZ"()<br>
+// MSVC2015:   call void @__std_terminate()<br>
+// CHECK-NEXT: unreachable<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>