diff options
-rw-r--r-- | include/llvm/TableGen/Record.h | 7 | ||||
-rw-r--r-- | lib/TableGen/Record.cpp | 5 | ||||
-rw-r--r-- | lib/TableGen/TGParser.cpp | 2 | ||||
-rw-r--r-- | test/TableGen/Dag.td | 2 | ||||
-rw-r--r-- | test/TableGen/foreach.td | 2 |
5 files changed, 16 insertions, 2 deletions
diff --git a/include/llvm/TableGen/Record.h b/include/llvm/TableGen/Record.h index f7a48c4dfb..0cf1725a98 100644 --- a/include/llvm/TableGen/Record.h +++ b/include/llvm/TableGen/Record.h @@ -1473,6 +1473,13 @@ public: void addValue(const RecordVal &RV) { assert(getValue(RV.getName()) == 0 && "Value already added!"); Values.push_back(RV); + if (Values.size() > 1) + // Keep NAME at the end of the list. It makes record dumps a + // bit prettier and allows TableGen tests to be written more + // naturally. Tests can use CHECK-NEXT to look for Record + // fields they expect to see after a def. They can't do that if + // NAME is the first Record field. + std::swap(Values[Values.size() - 2], Values[Values.size() - 1]); } void removeValue(Init *Name) { diff --git a/lib/TableGen/Record.cpp b/lib/TableGen/Record.cpp index a22c80c5e2..92559d15b5 100644 --- a/lib/TableGen/Record.cpp +++ b/lib/TableGen/Record.cpp @@ -1686,6 +1686,11 @@ unsigned Record::LastID = 0; void Record::init() { checkName(); + + // Every record potentially has a def at the top. This value is + // replaced with the top-level def name at instantiation time. + RecordVal DN("NAME", StringRecTy::get(), 0); + addValue(DN); } void Record::checkName() { diff --git a/lib/TableGen/TGParser.cpp b/lib/TableGen/TGParser.cpp index 45625f98d9..085136d481 100644 --- a/lib/TableGen/TGParser.cpp +++ b/lib/TableGen/TGParser.cpp @@ -1744,7 +1744,7 @@ bool TGParser::ParseClass() { Record *CurRec = Records.getClass(Lex.getCurStrVal()); if (CurRec) { // If the body was previously defined, this is an error. - if (!CurRec->getValues().empty() || + if (CurRec->getValues().size() > 1 || // Account for NAME. !CurRec->getSuperClasses().empty() || !CurRec->getTemplateArgs().empty()) return TokError("Class '" + CurRec->getNameInitAsString() diff --git a/test/TableGen/Dag.td b/test/TableGen/Dag.td index 9ed2301cef..7ceb4e74b2 100644 --- a/test/TableGen/Dag.td +++ b/test/TableGen/Dag.td @@ -60,6 +60,7 @@ def VAL3 : bar<foo1, somedef1>; // CHECK-NEXT: dag Dag1 = (somedef1 1); // CHECK-NEXT: dag Dag2 = (somedef1 2); // CHECK-NEXT: dag Dag3 = (somedef1 2); +// CHECK-NEXT: NAME = ? // CHECK-NEXT: } @@ -68,4 +69,5 @@ def VAL4 : bar<foo2, somedef2>; // CHECK-NEXT: dag Dag1 = (somedef1 1); // CHECK-NEXT: dag Dag2 = (somedef2 2); // CHECK-NEXT: dag Dag3 = (somedef2 2); +// CHECK-NEXT: NAME = ? // CHECK-NEXT: } diff --git a/test/TableGen/foreach.td b/test/TableGen/foreach.td index cbcade921b..814ae6ef93 100644 --- a/test/TableGen/foreach.td +++ b/test/TableGen/foreach.td @@ -1,6 +1,6 @@ // RUN: llvm-tblgen %s | grep {Jr} | count 2 // RUN: llvm-tblgen %s | grep {Sr} | count 2 -// RUN: llvm-tblgen %s | grep {NAME} | count 1 +// RUN: llvm-tblgen %s | grep {"NAME"} | count 1 // XFAIL: vg_leak // Variables for foreach |