[TableGen] Resolve concrete but not complete field access initializers

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

Reviewed By: Paul-C-Anagnostopoulos

Differential Revision: https://reviews.llvm.org/D100253
This commit is contained in:
Daniel Sanders 2021-04-13 11:14:30 -07:00
parent 192c6023e1
commit be50657c6a
4 changed files with 20 additions and 7 deletions

View File

@ -708,6 +708,7 @@ public:
///
Init *resolveReferences(Resolver &R) const override;
bool isComplete() const override;
bool isConcrete() const override;
std::string getAsString() const override;

View File

@ -655,6 +655,14 @@ Init *ListInit::resolveReferences(Resolver &R) const {
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 @@ Init *FieldInit::Fold(Record *CurRec) const {
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);

View File

@ -111,8 +111,11 @@ def Rec08 {
// 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 @@ def Rec10 {
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.

View File

@ -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 {