| // RUN: llvm-tblgen -gen-searchable-tables -I %p/../../include %s | FileCheck %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: const 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: const BTypeName *lookupBTableByName(StringRef Name) { | |
| // CHECK: return &BTable[Idx->_index]; | |
| // CHECK: } | |
| class BEntry<bits<16> enc> { | |
| string Name = NAME; | |
| bits<16> Encoding = enc; | |
| } | |
| def BAlice : BEntry<0xac>; | |
| def BBob : BEntry<0x14>; | |
| def BCharlie : BEntry<0x80>; | |
| def BEve : BEntry<0x4c>; | |
| 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"]; | |
| } | |
| 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"]; | |
| GenericEnum TypeOf_Kind = CEnum; | |
| let PrimaryKey = ["Encoding"]; | |
| let PrimaryKeyName = "lookupCEntryByEncoding"; | |
| let PrimaryKeyEarlyOut = 1; | |
| } | |
| def lookupCEntry : SearchIndex { | |
| let Table = CTable; | |
| let Key = ["Name", "Kind"]; | |
| } |