Final bugfix for PR724. GCC won't inline varargs functions, so use one to
authorChris Lattner <sabre@nondot.org>
Fri, 31 Mar 2006 04:48:26 +0000 (04:48 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 31 Mar 2006 04:48:26 +0000 (04:48 +0000)
validate the prototype of intrinsic functions.  This prevents GCC from going
crazy and inlining too much stuff, eventually running out of memory.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27283 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/IntrinsicEmitter.cpp

index f53c8ea8c989974402e326674462506275a23b80..1da361c9340e85f1dc5adda979d87ea8ec43c4d6 100644 (file)
@@ -108,22 +108,14 @@ EmitIntrinsicToNameTable(const std::vector<CodeGenIntrinsic> &Ints,
   OS << "#endif\n\n";
 }
 
-static void EmitTypeVerify(std::ostream &OS, const std::string &Val,
-                           Record *ArgType) {
-  OS << "    Assert1(" << Val << "->getTypeID() == "
-     << ArgType->getValueAsString("TypeVal") << ",\n"
-     << "            \"Illegal intrinsic type!\", IF);\n";
+static void EmitTypeVerify(std::ostream &OS, Record *ArgType) {
+  OS << "(int)" << ArgType->getValueAsString("TypeVal") << ", ";
 
   // If this is a packed type, check that the subtype and size are correct.
   if (ArgType->isSubClassOf("LLVMPackedType")) {
     Record *SubType = ArgType->getValueAsDef("ElTy");
-    OS << "    Assert1(cast<PackedType>(" << Val
-       << ")->getElementType()->getTypeID() == "
-       << SubType->getValueAsString("TypeVal") << ",\n"
-       << "            \"Illegal intrinsic type!\", IF);\n";
-    OS << "    Assert1(cast<PackedType>(" << Val << ")->getNumElements() == "
-       << ArgType->getValueAsInt("NumElts") << ",\n"
-       << "            \"Illegal intrinsic type!\", IF);\n";
+    OS << "(int)" << SubType->getValueAsString("TypeVal") << ", "
+       << ArgType->getValueAsInt("NumElts") << ", ";
   }
 }
 
@@ -170,12 +162,12 @@ void IntrinsicEmitter::EmitVerifier(const std::vector<CodeGenIntrinsic> &Ints,
       OS << "  case Intrinsic::" << Ints[I->second[i]].EnumName << ":\t\t// "
          << Ints[I->second[i]].Name << "\n";
     }
+    
     const std::vector<Record*> &ArgTypes = I->first;
-    OS << "    Assert1(FTy->getNumParams() == " << ArgTypes.size()-1 << ",\n"
-       << "            \"Illegal # arguments for intrinsic function!\", IF);\n";
-    EmitTypeVerify(OS, "FTy->getReturnType()", ArgTypes[0]);
-    for (unsigned j = 1; j != ArgTypes.size(); ++j)
-      EmitTypeVerify(OS, "FTy->getParamType(" + utostr(j-1) + ")", ArgTypes[j]);
+    OS << "    VerifyIntrinsicPrototype(IF, ";
+    for (unsigned j = 0; j != ArgTypes.size(); ++j)
+      EmitTypeVerify(OS, ArgTypes[j]);
+    OS << "-1);\n";
     OS << "    break;\n";
   }
   OS << "  }\n";