forked from OSchip/llvm-project
[TableGen] Diagnose undefined fields when generating searchable tables
Summary: Previously TableGen would crash trying to print the undefined value as an integer. Change-Id: I3900071ceaa07c26acafb33bc49966d7d7a02828 Reviewers: nhaehnle Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D74210
This commit is contained in:
parent
81e8b60b72
commit
a912275864
|
@ -1,4 +1,5 @@
|
||||||
// RUN: llvm-tblgen -gen-searchable-tables -I %p/../../include %s | FileCheck %s
|
// RUN: llvm-tblgen -gen-searchable-tables -I %p/../../include %s | FileCheck %s
|
||||||
|
// RUN: not llvm-tblgen -gen-searchable-tables -I %p/../../include -DERROR1 %s 2>&1 | FileCheck --check-prefix=ERROR1 %s
|
||||||
// XFAIL: vg_leak
|
// XFAIL: vg_leak
|
||||||
|
|
||||||
include "llvm/TableGen/SearchableTable.td"
|
include "llvm/TableGen/SearchableTable.td"
|
||||||
|
@ -136,3 +137,21 @@ def lookupCEntry : SearchIndex {
|
||||||
let Table = CTable;
|
let Table = CTable;
|
||||||
let Key = ["Name", "Kind"];
|
let Key = ["Name", "Kind"];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ERROR1
|
||||||
|
|
||||||
|
class DEntry<string str, int val1> {
|
||||||
|
string Str = str;
|
||||||
|
bits<8> Val1 = val1;
|
||||||
|
}
|
||||||
|
|
||||||
|
def DFoo : DEntry<"foo", 1>;
|
||||||
|
// ERROR1: [[@LINE+1]]:1: error: Record 'DBar' in table 'DTable' is missing field 'Val1'
|
||||||
|
def DBar : DEntry<"bar", ?>;
|
||||||
|
|
||||||
|
def DTable : GenericTable {
|
||||||
|
let FilterClass = "DEntry";
|
||||||
|
let Fields = ["Str", "Val1"];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // ERROR1
|
||||||
|
|
|
@ -599,7 +599,7 @@ void SearchableTableEmitter::collectTableEntries(
|
||||||
for (auto EntryRec : Items) {
|
for (auto EntryRec : Items) {
|
||||||
for (auto &Field : Table.Fields) {
|
for (auto &Field : Table.Fields) {
|
||||||
auto TI = dyn_cast<TypedInit>(EntryRec->getValueInit(Field.Name));
|
auto TI = dyn_cast<TypedInit>(EntryRec->getValueInit(Field.Name));
|
||||||
if (!TI) {
|
if (!TI || !TI->isComplete()) {
|
||||||
PrintFatalError(EntryRec->getLoc(),
|
PrintFatalError(EntryRec->getLoc(),
|
||||||
Twine("Record '") + EntryRec->getName() +
|
Twine("Record '") + EntryRec->getName() +
|
||||||
"' in table '" + Table.Name +
|
"' in table '" + Table.Name +
|
||||||
|
|
Loading…
Reference in New Issue