<div dir="ltr">Er, that didn't actually work.  I thought I finished this, but apparently not...</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Oct 30, 2013 at 3:38 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">    - Make it only active in -fms-extensions.<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1989" target="_blank">http://llvm-reviews.chandlerc.com/D1989</a><br>
<br>
CHANGE SINCE LAST DIFF<br>
  <a href="http://llvm-reviews.chandlerc.com/D1989?vs=5067&id=5275#toc" target="_blank">http://llvm-reviews.chandlerc.com/D1989?vs=5067&id=5275#toc</a><br>
<br>
Files:<br>
  include/clang/Basic/Builtins.def<br>
  include/clang/Basic/Builtins.h<br>
<div class="im">  lib/CodeGen/CGBuiltin.cpp<br>
  test/CodeGen/builtins.c<br>
  test/SemaCXX/no-implicit-builtin-decls.cpp<br>
<br>
Index: include/clang/Basic/Builtins.def<br>
===================================================================<br>
--- include/clang/Basic/Builtins.def<br>
+++ include/clang/Basic/Builtins.def<br>
</div>@@ -670,11 +670,12 @@<br>
 BUILTIN(__builtin_index, "c*cC*i", "Fn")<br>
<div class="im"> BUILTIN(__builtin_rindex, "c*cC*i", "Fn")<br>
<br>
</div>-// Microsoft builtins.<br>
-BUILTIN(__assume, "vb", "n")<br>
-BUILTIN(__noop, "v.", "n")<br>
-BUILTIN(__debugbreak, "v", "n")<br>
-<br>
+// Microsoft builtins.  These are only active with -fms-extensions.<br>
+// They are not library builtins despire our use of LIBBUILTIN.<br>
+LIBBUILTIN(_alloca,      "v*z", "n", 0, ALL_MS_LANGUAGES)<br>
+LIBBUILTIN(__assume,     "vb",  "n", 0, ALL_MS_LANGUAGES)<br>
+LIBBUILTIN(__noop,       "v.",  "n", 0, ALL_MS_LANGUAGES)<br>
+LIBBUILTIN(__debugbreak, "v",   "n", 0, ALL_MS_LANGUAGES)<br>
<br>
 // C99 library functions<br>
 // C99 stdlib.h<br>
Index: include/clang/Basic/Builtins.h<br>
===================================================================<br>
--- include/clang/Basic/Builtins.h<br>
+++ include/clang/Basic/Builtins.h<br>
@@ -35,8 +35,10 @@<br>
     C_LANG = 0x2,    // builtin for c only.<br>
     CXX_LANG = 0x4,  // builtin for cplusplus only.<br>
     OBJC_LANG = 0x8, // builtin for objective-c and objective-c++<br>
+    MS_LANG = 0x10,  // builtin requires MS mode.<br>
     ALL_LANGUAGES = C_LANG | CXX_LANG | OBJC_LANG, // builtin for all languages.<br>
-    ALL_GNU_LANGUAGES = ALL_LANGUAGES | GNU_LANG   // builtin requires GNU mode.<br>
+    ALL_GNU_LANGUAGES = ALL_LANGUAGES | GNU_LANG,  // builtin requires GNU mode.<br>
+    ALL_MS_LANGUAGES = ALL_LANGUAGES | MS_LANG     // builtin requires MS mode.<br>
   };<br>
<br>
 namespace Builtin {<br>
<div class="im">Index: lib/CodeGen/CGBuiltin.cpp<br>
===================================================================<br>
--- lib/CodeGen/CGBuiltin.cpp<br>
+++ lib/CodeGen/CGBuiltin.cpp<br>
</div>@@ -604,6 +604,7 @@<br>
<div class="HOEnZb"><div class="h5">   }<br>
<br>
   case Builtin::BIalloca:<br>
+  case Builtin::BI_alloca:<br>
   case Builtin::BI__builtin_alloca: {<br>
     Value *Size = EmitScalarExpr(E->getArg(0));<br>
     return RValue::get(Builder.CreateAlloca(Builder.getInt8Ty(), Size));<br>
Index: test/CodeGen/builtins.c<br>
===================================================================<br>
--- test/CodeGen/builtins.c<br>
+++ test/CodeGen/builtins.c<br>
@@ -210,3 +210,11 @@<br>
   // CHECK: call i64 @llvm.readcyclecounter()<br>
   return __builtin_readcyclecounter();<br>
 }<br>
+<br>
+// CHECK-LABEL: define void @test_alloca<br>
+void test_alloca(int n) {<br>
+  extern void capture(void *);<br>
+  capture(_alloca(n));<br>
+  // CHECK: alloca i8, i64 %<br>
+  // CHECK: call void @capture<br>
+}<br>
Index: test/SemaCXX/no-implicit-builtin-decls.cpp<br>
===================================================================<br>
--- test/SemaCXX/no-implicit-builtin-decls.cpp<br>
+++ test/SemaCXX/no-implicit-builtin-decls.cpp<br>
@@ -1,6 +1,6 @@<br>
 // RUN: %clang_cc1 -fsyntax-only -verify %s<br>
<br>
-void f() {<br>
+void f() { // expected-note@+1 {{declared here}}<br>
   void *p = malloc(sizeof(int) * 10); // expected-error{{use of undeclared identifier 'malloc'}}<br>
 }<br>
</div></div></blockquote></div><br></div>