The Intrinsic::getDeclaration function's Tys parameter only contains the
authorReid Spencer <rspencer@reidspencer.com>
Tue, 22 May 2007 19:30:31 +0000 (19:30 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Tue, 22 May 2007 19:30:31 +0000 (19:30 +0000)
types of the iAny types involved in the overloaded intrinsic. Thus, we
can't use the argument number as the index but have to count them separately
in order to index Tys correctly. This patch rectifies this situation.

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

utils/TableGen/IntrinsicEmitter.cpp

index 834e1429ba49da4e10b5e0f660f3b04421430619..a362553d2aee4f2e984745e6f3073df447f7e594 100644 (file)
@@ -134,11 +134,18 @@ static bool EmitTypeVerify(std::ostream &OS, Record *ArgType) {
   return false;
 }
 
-static void EmitTypeGenerate(std::ostream &OS, Record *ArgType, unsigned ArgNo){
+static void EmitTypeGenerate(std::ostream &OS, Record *ArgType, 
+                             unsigned &ArgNo) {
   if (ArgType->isSubClassOf("LLVMIntegerType")) {
     unsigned BitWidth = ArgType->getValueAsInt("Width");
+    // NOTE: The ArgNo variable here is not the absolute argument number, it is
+    // the index of the "arbitrary" type in the Tys array passed to the
+    // Intrinsic::getDeclaration function. Consequently, we only want to
+    // increment it when we actually hit an arbitray integer type which is
+    // identified by BitWidth == 0. Getting this wrong leads to very subtle
+    // bugs!
     if (BitWidth == 0)
-      OS << "Tys[" << ArgNo << "]";
+      OS << "Tys[" << ArgNo++ << "]";
     else
       OS << "IntegerType::get(" << BitWidth << ")";
   } else if (ArgType->isSubClassOf("LLVMVectorType")) {
@@ -253,16 +260,16 @@ void IntrinsicEmitter::EmitGenerator(const std::vector<CodeGenIntrinsic> &Ints,
       --N;
     }
     
+    unsigned ArgNo = 0;
     OS << "    ResultTy = ";
-    EmitTypeGenerate(OS, ArgTypes[0], 0);
+    EmitTypeGenerate(OS, ArgTypes[0], ArgNo);
     OS << ";\n";
     
     for (unsigned j = 1; j != N; ++j) {
       OS << "    ArgTys.push_back(";
-      EmitTypeGenerate(OS, ArgTypes[j], j);
+      EmitTypeGenerate(OS, ArgTypes[j], ArgNo);
       OS << ");\n";
     }
-    
     OS << "    break;\n";
   }
   OS << "  }\n";