[PATCH] D43656: TableGen: Allow NAME in template arguments in defm in multiclass

Nicolai Hähnle via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 22 16:20:47 PST 2018


nhaehnle created this revision.
nhaehnle added reviewers: arsenm, craig.topper, tra, MartinO.
Herald added a subscriber: wdng.
nhaehnle added a dependency: D43561: TableGen: Avoid using resolveListElementReference in TGParser.

Original test cases provided by Artem Belevich (tra)

Change-Id: I933b74f328c0ff202e7dc23a35b78f3505760cc9


Repository:
  rL LLVM

https://reviews.llvm.org/D43656

Files:
  lib/TableGen/TGParser.cpp
  test/TableGen/MultiClass-defm-fail.td
  test/TableGen/MultiClass-defm.td


Index: test/TableGen/MultiClass-defm.td
===================================================================
--- /dev/null
+++ test/TableGen/MultiClass-defm.td
@@ -0,0 +1,38 @@
+// RUN: llvm-tblgen %s | FileCheck %s
+// XFAIL: vg_leak
+
+class A {}
+class B<A a> {
+  A ba = a;
+}
+
+multiclass M0<string s> {
+  def _m0 : B<!cast<A>(s)>;
+
+  // Uncomment to test that !cast will eventually fail if the record it refers
+  // to does not exist by the time we instantiate this record from the top
+  // level.
+  //def _m1 : B<!cast<A>(s#"X")>;
+}
+
+multiclass M1<string s> {
+  def _r1 : A;
+  // It would be nice if we could refer to _r1's name without having to pass it
+  // explicitly via 's'.
+  defm _m1: M0<s # "_r1">;
+}
+
+multiclass M2 {
+  // This used to throw an error during multiclass parsing as NAME was not
+  // recognized when parsing the template arguments.
+  defm NAME: M1<NAME>;
+}
+defm d0: M2;
+// CHECK-LABEL: def d0_m1_m0
+// CHECK: A ba = d0_r1;
+
+// This always works, because d1_r1 is instantiated before d1_m1 which would
+// attempt to !cast to it.
+defm d1: M1<"d1">;
+// CHECK-LABEL: def d1_m1_m0
+// CHECK: A ba = d1_r1;
Index: test/TableGen/MultiClass-defm-fail.td
===================================================================
--- /dev/null
+++ test/TableGen/MultiClass-defm-fail.td
@@ -0,0 +1,32 @@
+// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
+// XFAIL: vg_leak
+
+// This test verifies that tablegen does fail if it can't resolve an unresolved
+// !cast() during processing top-level defm.
+
+class A {}
+class B<A a> {
+  A ba = a;
+}
+
+multiclass M0<string s> {
+  // This should work fine.
+  def _m00 : B<!cast<A>(s)>;
+  // CHECK: error: Undefined reference:'d1_r1_no_such_record'
+  def _m01: B<!cast<A>(s#"_no_such_record")>;
+}
+
+multiclass M1<string s> {
+  def _r1 : A;
+  // It would be nice if we could refer to _r1's name without having to pass it
+  // explicitly via 's'.
+  // XCHECK-DAG: note: instantiated from multiclass
+  defm _m1: M0<s # "_r1">;
+}
+
+// CHECK: defm d1: M1
+// CHECK: note: instantiated from multiclass
+// CHECK: defm _m1: M0
+// CHECK: note: instantiated from multiclass
+// CHECK: def _m01: B
+defm d1: M1<"d1">;
Index: lib/TableGen/TGParser.cpp
===================================================================
--- lib/TableGen/TGParser.cpp
+++ lib/TableGen/TGParser.cpp
@@ -747,6 +747,9 @@
   }
 
   if (CurMultiClass) {
+    if (Name->getValue() == "NAME")
+      return VarInit::get(Name, StringRecTy::get());
+
     Init *MCName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name, "::");
 
     if (CurMultiClass->Rec.isTemplateArg(MCName)) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43656.135551.patch
Type: text/x-patch
Size: 2647 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180223/501d2c75/attachment.bin>


More information about the llvm-commits mailing list