1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

[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 impl> : 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
This commit is contained in:
River Riddle 2020-02-10 17:51:26 -08:00 committed by River Riddle
parent 163f13ebd8
commit cb7e7cb874
3 changed files with 32 additions and 0 deletions

View File

@ -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();
}

View File

@ -1778,6 +1778,14 @@ Init *FieldInit::Fold(Record *CurRec) const {
return const_cast<FieldInit *>(this);
}
bool FieldInit::isConcrete() const {
if (DefInit *DI = dyn_cast<DefInit>(Rec)) {
Init *FieldVal = DI->getDef()->getValue(FieldName)->getValue();
return FieldVal->isConcrete();
}
return false;
}
static void ProfileCondOpInit(FoldingSetNodeID &ID,
ArrayRef<Init *> CondRange,
ArrayRef<Init *> ValRange,

View File

@ -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 impl> : A {
let value = impl.value;
}
def A1 : A;
def B1 : B<A1>;