Error check and eliminate unnecessary value.
authorJim Laskey <jlaskey@mac.com>
Tue, 6 Feb 2007 18:30:58 +0000 (18:30 +0000)
committerJim Laskey <jlaskey@mac.com>
Tue, 6 Feb 2007 18:30:58 +0000 (18:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33966 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/IntrinsicEmitter.cpp

index 9a1132a27595de1048c974923af65f703efef725..ab527521dc74d1cf29d6e712985c267fa6371d42 100644 (file)
@@ -108,11 +108,8 @@ EmitIntrinsicToNameTable(const std::vector<CodeGenIntrinsic> &Ints,
   OS << "#endif\n\n";
 }
 
-static void EmitTypeVerify(std::ostream &OS, Record *ArgType) {
-  if (ArgType->getValueAsString("TypeVal") == "...") {
-    OS << "-2, ";
-    return;
-  }
+static bool EmitTypeVerify(std::ostream &OS, Record *ArgType) {
+  if (ArgType->getValueAsString("TypeVal") == "...")  return true;
   
   OS << "(int)" << ArgType->getValueAsString("TypeVal") << ", ";
   // If this is an integer type, check the width is correct.
@@ -124,6 +121,8 @@ static void EmitTypeVerify(std::ostream &OS, Record *ArgType) {
     EmitTypeVerify(OS, ArgType->getValueAsDef("ElTy"));
     OS << ArgType->getValueAsInt("NumElts") << ", ";
   }
+  
+  return false;
 }
 
 /// RecordListComparator - Provide a determinstic comparator for lists of
@@ -172,9 +171,17 @@ void IntrinsicEmitter::EmitVerifier(const std::vector<CodeGenIntrinsic> &Ints,
     
     const std::vector<Record*> &ArgTypes = I->first;
     OS << "    VerifyIntrinsicPrototype(IF, ";
-    for (unsigned j = 0; j != ArgTypes.size(); ++j)
-      EmitTypeVerify(OS, ArgTypes[j]);
-    OS << "-1);\n";
+    bool VarArg = false;
+    for (unsigned j = 0; j != ArgTypes.size(); ++j) {
+      VarArg = EmitTypeVerify(OS, ArgTypes[j]);
+      if (VarArg) {
+        if ((j+1) != ArgTypes.size())
+          throw "Var arg type not last argument";
+        break;
+      }
+    }
+      
+    OS << (VarArg ? "-2);\n" : "-1);\n");
     OS << "    break;\n";
   }
   OS << "  }\n";