From e338565757bfcfe9d762751c976684f66954fb45 Mon Sep 17 00:00:00 2001 From: David Greene Date: Wed, 19 Oct 2011 13:04:13 +0000 Subject: [PATCH] Add NAME Member Add a Value named "NAME" to each Record. This will be set to the def or defm name when instantiating multiclasses. This will replace the #NAME# processing hack once paste functionality is in place. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142518 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/TableGen/Record.h | 7 +++++++ lib/TableGen/Record.cpp | 5 +++++ lib/TableGen/TGParser.cpp | 2 +- test/TableGen/Dag.td | 2 ++ 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 f7a48c4dfbd..0cf1725a981 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 a22c80c5e2e..92559d15b5f 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 45625f98d98..085136d4815 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 9ed2301cef0..7ceb4e74b2f 100644 --- a/test/TableGen/Dag.td +++ b/test/TableGen/Dag.td @@ -60,6 +60,7 @@ def VAL3 : bar; // 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; // 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 cbcade921b9..814ae6ef936 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