[PATCH] D100253: [TableGen] Resolve concrete but not complete field access initializers

Daniel Sanders via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 10 20:03:54 PDT 2021


dsanders created this revision.
dsanders added reviewers: Paul-C-Anagnostopoulos, lattner.
Herald added a subscriber: hiraditya.
dsanders requested review of this revision.
Herald added a project: LLVM.

This fixes the resolution of Rec10.Zero in ListSlices.td.

As part of this, correct the definition of complete for ListInit such that
it's complete iff all the elements in the list are complete rather than
always being complete regardless of the elements. This is the reason
Rec10.TwoFive from ListSlices.td previously resolved despite being
incomplete like Rec10.Zero was

Depends on D100247 <https://reviews.llvm.org/D100247>


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D100253

Files:
  llvm/include/llvm/TableGen/Record.h
  llvm/lib/TableGen/Record.cpp
  llvm/test/TableGen/ListSlices.td
  llvm/test/TableGen/field-access-initializers.td


Index: llvm/test/TableGen/field-access-initializers.td
===================================================================
--- llvm/test/TableGen/field-access-initializers.td
+++ llvm/test/TableGen/field-access-initializers.td
@@ -1,6 +1,10 @@
 // RUN: llvm-tblgen %s | FileCheck %s
 // XFAIL: vg_leak
 
+// CHECK: class B<A B:impl = ?> {
+// CHECK:   string value = B:impl.value;
+// CHECK: }
+
 // CHECK: --- Defs ---
 
 // CHECK: def A1 {
@@ -8,7 +12,7 @@
 // CHECK: }
 
 // CHECK: def B1 {
-// CHECK:   string value = A1.value;
+// CHECK:   string value = ?;
 // CHECK: }
 
 class A {
Index: llvm/test/TableGen/ListSlices.td
===================================================================
--- llvm/test/TableGen/ListSlices.td
+++ llvm/test/TableGen/ListSlices.td
@@ -111,8 +111,11 @@
 // CHECK: def Rec09
 // CHECK:   int Zero = ?;
 // CHECK:   list<int> TwoFive = [2, 3, ?, 5];
-// CHECK: def Rec10
-// CHECK:   list<int> TwoFive = [2, 3, ?, 5];
+// We need CHECK-NEXT for these because otherwise it will match anonymous defs
+// that appear later.
+// CHECK: def Rec10 {
+// CHECK-NEXT:   int Zero = ?;
+// CHECK-NEXT:   list<int> TwoFive = [2, 3, ?, 5];
 
 def Rec09 : Class1<[?, ?, 2, 3, ?, 5, ?]>;
 
@@ -120,6 +123,3 @@
   int Zero = Class1<[?, ?, 2, 3, ?, 5, ?]>.Zero;
   list<int> TwoFive = Class1<[?, ?, 2, 3, ?, 5, ?]>.TwoFive;
 }
-
-// TO-DO: Notice that the first field in Rec10 is not checked. 
-// It is not fully resolved for reasons that need to be investigated.
Index: llvm/lib/TableGen/Record.cpp
===================================================================
--- llvm/lib/TableGen/Record.cpp
+++ llvm/lib/TableGen/Record.cpp
@@ -655,6 +655,14 @@
   return const_cast<ListInit *>(this);
 }
 
+bool ListInit::isComplete() const {
+  for (Init *Element : *this) {
+    if (!Element->isComplete())
+      return false;
+  }
+  return true;
+}
+
 bool ListInit::isConcrete() const {
   for (Init *Element : *this) {
     if (!Element->isConcrete())
@@ -1924,7 +1932,7 @@
                       FieldName->getAsUnquotedString() + "' of '" +
                       Rec->getAsString() + "' is a forbidden self-reference");
     Init *FieldVal = Def->getValue(FieldName)->getValue();
-    if (FieldVal->isComplete())
+    if (FieldVal->isConcrete())
       return FieldVal;
   }
   return const_cast<FieldInit *>(this);
Index: llvm/include/llvm/TableGen/Record.h
===================================================================
--- llvm/include/llvm/TableGen/Record.h
+++ llvm/include/llvm/TableGen/Record.h
@@ -708,6 +708,7 @@
   ///
   Init *resolveReferences(Resolver &R) const override;
 
+  bool isComplete() const override;
   bool isConcrete() const override;
   std::string getAsString() const override;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D100253.336637.patch
Type: text/x-patch
Size: 2739 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210411/bc1fb471/attachment.bin>


More information about the llvm-commits mailing list