Don't put TGParser scratch results in the output.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 24 May 2012 22:17:36 +0000 (22:17 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 24 May 2012 22:17:36 +0000 (22:17 +0000)
Only fully expanded Records should go into RecordKeeper.

llvm-svn: 157431

llvm/include/llvm/TableGen/Record.h
llvm/lib/TableGen/TGParser.cpp
llvm/test/TableGen/ForeachLoop.td

index 3aea1ae..a8256b7 100644 (file)
@@ -1558,12 +1558,14 @@ public:
     return I == Defs.end() ? 0 : I->second;
   }
   void addClass(Record *R) {
-    assert(getClass(R->getNameInitAsString()) == 0 && "Class already exists!");
-    Classes.insert(std::make_pair(R->getNameInitAsString(), R));
+    bool Ins = Classes.insert(std::make_pair(R->getName(), R)).second;
+    (void)Ins;
+    assert(Ins && "Class already exists");
   }
   void addDef(Record *R) {
-    assert(getDef(R->getNameInitAsString()) == 0 && "Def already exists!");
-    Defs.insert(std::make_pair(R->getNameInitAsString(), R));
+    bool Ins = Defs.insert(std::make_pair(R->getName(), R)).second;
+    (void)Ins;
+    assert(Ins && "Record already exists");
   }
 
   /// removeClass - Remove, but do not delete, the specified record.
index 68d9ef4..b23f410 100644 (file)
@@ -1903,7 +1903,7 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) {
   // Parse ObjectName and make a record for it.
   Record *CurRec = new Record(ParseObjectName(CurMultiClass), DefLoc, Records);
 
-  if (!CurMultiClass) {
+  if (!CurMultiClass && Loops.empty()) {
     // Top-level def definition.
 
     // Ensure redefinition doesn't happen.
@@ -1913,7 +1913,7 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) {
       return true;
     }
     Records.addDef(CurRec);
-  } else {
+  } else if (CurMultiClass) {
     // Otherwise, a def inside a multiclass, add it to the multiclass.
     for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); i != e; ++i)
       if (CurMultiClass->DefPrototypes[i]->getNameInit()
index e2defe9..3426096 100644 (file)
@@ -9,6 +9,7 @@ class Register<string name, int idx> {
 foreach i = [0, 1, 2, 3, 4, 5, 6, 7] in
   def R#i : Register<"R"#i, i>;
 
+// CHECK-NOT: !strconcat
 
 // CHECK: def R0
 // CHECK: string Name = "R0";