Support var arg intrinsics.
authorJim Laskey <jlaskey@mac.com>
Tue, 6 Feb 2007 18:02:54 +0000 (18:02 +0000)
committerJim Laskey <jlaskey@mac.com>
Tue, 6 Feb 2007 18:02:54 +0000 (18:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33962 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Intrinsics.td
lib/VMCore/Verifier.cpp
utils/TableGen/FileLexer.l
utils/TableGen/IntrinsicEmitter.cpp

index 3fc55f79da6127a0432c2f2834fd31200b39efd2..bda4a927bbe9fe44a647b1ad080b676e42acdce2 100644 (file)
@@ -88,6 +88,8 @@ def llvm_v4i32_ty      : LLVMPackedType<v4i32, 4, llvm_i32_ty>;   //  4 x i32
 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_func_start   : Intrinsic<[llvm_void_ty, llvm_descriptor_ty]>;
 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
 //===----------------------------------------------------------------------===//
index f5b0550d88ea3f1097cad2c324096393ca14cfd7..c2fd8746b7abac5b6828d1d45f3148b0c9433a3f 100644 (file)
@@ -987,6 +987,10 @@ void Verifier::VerifyIntrinsicPrototype(Function *F, ...) {
   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);
index cc6825f5e07e1c29546cb2d5bc2517499656fb11..fa89b8ba04fd8ef6eecef4fd7c6b2ab0467d91ac 100644 (file)
@@ -176,7 +176,7 @@ using namespace llvm;
 
 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    \"[^"]*\"
index 7cd03751de38b4890e713a9ff751b01308af002a..9a1132a27595de1048c974923af65f703efef725 100644 (file)
@@ -109,6 +109,11 @@ EmitIntrinsicToNameTable(const std::vector<CodeGenIntrinsic> &Ints,
 }
 
 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"))