Support var arg intrinsics.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33962 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Intrinsics.td b/include/llvm/Intrinsics.td
index 3fc55f7..bda4a92 100644
--- a/include/llvm/Intrinsics.td
+++ b/include/llvm/Intrinsics.td
@@ -88,6 +88,8 @@
 def llvm_v4f32_ty      : LLVMPackedType<v4f32, 4, llvm_float_ty>; //  4 x float
 def llvm_v2f64_ty      : LLVMPackedType<v2f64, 2, llvm_double_ty>;//  2 x double
 
+def ...                : LLVMType<isVoid, "...">; // vararg
+
 //===----------------------------------------------------------------------===//
 // Intrinsic Definitions.
 //===----------------------------------------------------------------------===//
@@ -217,6 +219,11 @@
 def int_dbg_declare      : Intrinsic<[llvm_void_ty, llvm_ptr_ty,
                                                     llvm_descriptor_ty]>;
 
+//===------------------ Exception Handling Intrinsics----------------------===//
+//
+def int_eh_exception : Intrinsic<[llvm_ptr_ty]>;
+def int_eh_handlers : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty, ...]>;
+
 //===----------------------------------------------------------------------===//
 // Target-specific intrinsics
 //===----------------------------------------------------------------------===//
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index f5b0550..c2fd874 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -987,6 +987,10 @@
   for (unsigned ArgNo = 0; 1; ++ArgNo) {
     int TypeID = va_arg(VA, int);
 
+    if (TypeID == -2) {
+      break;
+    }
+
     if (TypeID == -1) {
       if (ArgNo != FTy->getNumParams()+1)
         CheckFailed("Intrinsic prototype has too many arguments!", F);
diff --git a/utils/TableGen/FileLexer.l b/utils/TableGen/FileLexer.l
index cc6825f..fa89b8b 100644
--- a/utils/TableGen/FileLexer.l
+++ b/utils/TableGen/FileLexer.l
@@ -176,7 +176,7 @@
 
 Comment      \/\/.*
 
-Identifier   [a-zA-Z_][0-9a-zA-Z_]*
+Identifier   [a-zA-Z_][0-9a-zA-Z_]*|\.\.\.
 Integer      [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+
 CodeFragment \[\{([^}]+|\}[^\]])*\}\]
 StringVal    \"[^"]*\"
diff --git a/utils/TableGen/IntrinsicEmitter.cpp b/utils/TableGen/IntrinsicEmitter.cpp
index 7cd0375..9a1132a 100644
--- a/utils/TableGen/IntrinsicEmitter.cpp
+++ b/utils/TableGen/IntrinsicEmitter.cpp
@@ -109,6 +109,11 @@
 }
 
 static void EmitTypeVerify(std::ostream &OS, Record *ArgType) {
+  if (ArgType->getValueAsString("TypeVal") == "...") {
+    OS << "-2, ";
+    return;
+  }
+  
   OS << "(int)" << ArgType->getValueAsString("TypeVal") << ", ";
   // If this is an integer type, check the width is correct.
   if (ArgType->isSubClassOf("LLVMIntegerType"))