llvm-project/llvm/test/TableGen/generic-tables.td

166 lines
3.9 KiB
TableGen

// 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
include "llvm/TableGen/SearchableTable.td"
// CHECK-LABEL: GET_BValues_DECL
// CHECK: enum BValues {
// CHECK: BAlice = 172,
// CHECK: BBob = 20,
// CHECK: BCharlie = 128,
// CHECK: BEve = 76,
// CHECK: }
// CHECK-LABEL: GET_CEnum_DECL
// CHECK: enum CEnum {
// CHECK: CBar
// CHECK: CBaz
// CHECK: CFoo
// CHECK: }
// CHECK-LABEL: GET_ATable_DECL
// CHECK: const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2);
// CHECK-LABEL: GET_ATable_IMPL
// CHECK: constexpr AEntry ATable[] = {
// CHECK: { "baz"
// CHECK: { "foo"
// CHECK: { "foobar"
// CHECK: { "bar"
// CHECK: };
// CHECK: const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2) {
// CHECK: return &*Idx;
// CHECK: }
class AEntry<string str, int val1, int val2> {
string Str = str;
bits<8> Val1 = val1;
bits<10> Val2 = val2;
}
def : AEntry<"bar", 5, 3>;
def : AEntry<"baz", 2, 6>;
def : AEntry<"foo", 4, 4>;
def : AEntry<"foobar", 4, 5>;
def ATable : GenericTable {
let FilterClass = "AEntry";
let Fields = ["Str", "Val1", "Val2"];
let PrimaryKey = ["Val1", "Val2"];
let PrimaryKeyName = "lookupATableByValues";
}
// CHECK-LABEL: GET_BTable_IMPL
// CHECK: constexpr BTypeName BTable[] = {
// CHECK: { "BAlice", 0xAC, },
// CHECK: { "BBob", 0x14, Bob == 13 },
// CHECK: { "BCharlie", 0x80, Charlie == 42 },
// CHECK: { "BEve", 0x4C, Eve == 108 },
// CHECK: };
// CHECK: const BTypeName *lookupBTableByName(StringRef Name) {
// CHECK: return &BTable[Idx->_index];
// CHECK: }
class BEntry<bits<16> enc, code test = [{}]> {
string Name = NAME;
bits<16> Encoding = enc;
code Test = test;
}
def BAlice : BEntry<0xac>;
def BBob : BEntry<0x14, [{Bob == 13}]>;
def BCharlie : BEntry<0x80, "Charlie == 42">;
def BEve : BEntry<0x4c, [{Eve == }] # 108>;
def BValues : GenericEnum {
let FilterClass = "BEntry";
let NameField = "Name";
let ValueField = "Encoding";
}
def BTable : GenericTable {
let FilterClass = "BEntry";
string CppTypeName = "BTypeName";
let Fields = ["Name", "Encoding", "Test"];
string TypeOf_Test = "code";
}
def lookupBTableByName : SearchIndex {
let Table = BTable;
let Key = ["Name"];
}
// CHECK-LABEL: GET_CTable_DECL
// CHECK: const CEntry *lookupCEntryByEncoding(uint16_t Encoding);
// CHECK: const CEntry *lookupCEntry(StringRef Name, unsigned Kind);
// CHECK-LABEL: GET_CTable_IMPL
// CHECK: const CEntry *lookupCEntryByEncoding(uint16_t Encoding) {
// CHECK: if ((Encoding < 0xA) ||
// CHECK: (Encoding > 0xF))
// CHECK: return nullptr;
// CHECK: const CEntry *lookupCEntry(StringRef Name, unsigned Kind) {
// CHECK: Index[] = {
// CHECK: { "ALICE", CBar, 1 },
// CHECK: { "ALICE", CFoo, 0 },
// CHECK: { "BOB", CBaz, 2 },
class CEnum;
def CFoo : CEnum;
def CBar : CEnum;
def CBaz : CEnum;
def CEnum : GenericEnum {
let FilterClass = "CEnum";
}
class CEntry<string name, CEnum kind, int enc> {
string Name = name;
CEnum Kind = kind;
bits<16> Encoding = enc;
}
def : CEntry<"alice", CFoo, 10>;
def : CEntry<"alice", CBar, 13>;
def : CEntry<"bob", CBaz, 15>;
def CTable : GenericTable {
let FilterClass = "CEntry";
let Fields = ["Name", "Kind", "Encoding"];
string TypeOf_Kind = "CEnum";
let PrimaryKey = ["Encoding"];
let PrimaryKeyName = "lookupCEntryByEncoding";
let PrimaryKeyEarlyOut = 1;
}
def lookupCEntry : SearchIndex {
let Table = CTable;
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' for table 'DTable' is missing field 'Val1'
def DBar : DEntry<"bar", ?>;
def DTable : GenericTable {
let FilterClass = "DEntry";
let Fields = ["Str", "Val1"];
}
#endif // ERROR1