| // 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 |