From 52086f802e37fbb2acc61c49120990b0b3fd10cd Mon Sep 17 00:00:00 2001 From: River Riddle Date: Mon, 10 Feb 2020 17:51:26 -0800 Subject: [PATCH] [llvm][TableGen] Define FieldInit::isConcrete overload Summary: There are a few field init values that are concrete but not complete/foldable (e.g. `?`). This allows for using those values as initializers without erroring out. Example: ``` class A { string value = ?; } class B : A { let value = impl.value; // This currently emits an error. let value = ?; // This doesn't emit an error. } ``` Differential Revision: https://reviews.llvm.org/D74360 --- llvm/include/llvm/TableGen/Record.h | 1 + llvm/lib/TableGen/Record.cpp | 8 ++++++++ llvm/test/TableGen/field-access-initializers.td | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 llvm/test/TableGen/field-access-initializers.td diff --git a/llvm/include/llvm/TableGen/Record.h b/llvm/include/llvm/TableGen/Record.h index 6667afe..48aeaa1 100644 --- a/llvm/include/llvm/TableGen/Record.h +++ b/llvm/include/llvm/TableGen/Record.h @@ -1295,6 +1295,7 @@ public: Init *resolveReferences(Resolver &R) const override; Init *Fold(Record *CurRec) const; + bool isConcrete() const override; std::string getAsString() const override { return Rec->getAsString() + "." + FieldName->getValue().str(); } diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp index 54ff9ae..ca8cd15 100644 --- a/llvm/lib/TableGen/Record.cpp +++ b/llvm/lib/TableGen/Record.cpp @@ -1778,6 +1778,14 @@ Init *FieldInit::Fold(Record *CurRec) const { return const_cast(this); } +bool FieldInit::isConcrete() const { + if (DefInit *DI = dyn_cast(Rec)) { + Init *FieldVal = DI->getDef()->getValue(FieldName)->getValue(); + return FieldVal->isConcrete(); + } + return false; +} + static void ProfileCondOpInit(FoldingSetNodeID &ID, ArrayRef CondRange, ArrayRef ValRange, diff --git a/llvm/test/TableGen/field-access-initializers.td b/llvm/test/TableGen/field-access-initializers.td new file mode 100644 index 0000000..5a25e29 --- /dev/null +++ b/llvm/test/TableGen/field-access-initializers.td @@ -0,0 +1,23 @@ +// RUN: llvm-tblgen %s | FileCheck %s +// XFAIL: vg_leak + +// CHECK: --- Defs --- + +// CHECK: def A1 { +// CHECK: string value = ?; +// CHECK: } + +// CHECK: def B1 { +// CHECK: string value = A1.value; +// CHECK: } + +class A { + string value = ?; +} + +class B : A { + let value = impl.value; +} + +def A1 : A; +def B1 : B; -- 2.7.4