1// RUN: llvm-tblgen -gen-searchable-tables -I %p/../../include %s | FileCheck %s
2// XFAIL: vg_leak
3
4include "llvm/TableGen/SearchableTable.td"
5
6// CHECK-LABEL: GET_BValues_DECL
7// CHECK: enum BValues {
8// CHECK:   BAlice = 172,
9// CHECK:   BBob = 20,
10// CHECK:   BCharlie = 128,
11// CHECK:   BEve = 76,
12// CHECK: }
13
14// CHECK-LABEL: GET_CEnum_DECL
15// CHECK: enum CEnum {
16// CHECK:   CBar
17// CHECK:   CBaz
18// CHECK:   CFoo
19// CHECK: }
20
21// CHECK-LABEL: GET_ATable_DECL
22// CHECK: const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2);
23
24// CHECK-LABEL: GET_ATable_IMPL
25// CHECK: constexpr AEntry ATable[] = {
26// CHECK:   { "baz"
27// CHECK:   { "foo"
28// CHECK:   { "foobar"
29// CHECK:   { "bar"
30// CHECK: };
31
32// CHECK: const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2) {
33// CHECK:   return &*Idx;
34// CHECK: }
35
36class AEntry<string str, int val1, int val2> {
37  string Str = str;
38  bits<8> Val1 = val1;
39  bits<10> Val2 = val2;
40}
41
42def : AEntry<"bar",    5, 3>;
43def : AEntry<"baz",    2, 6>;
44def : AEntry<"foo",    4, 4>;
45def : AEntry<"foobar", 4, 5>;
46
47def ATable : GenericTable {
48  let FilterClass = "AEntry";
49  let Fields = ["Str", "Val1", "Val2"];
50
51  let PrimaryKey = ["Val1", "Val2"];
52  let PrimaryKeyName = "lookupATableByValues";
53}
54
55
56// CHECK-LABEL: GET_BTable_IMPL
57// CHECK: const BTypeName *lookupBTableByName(StringRef Name) {
58// CHECK:   return &BTable[Idx->_index];
59// CHECK: }
60
61class BEntry<bits<16> enc> {
62  string Name = NAME;
63  bits<16> Encoding = enc;
64}
65
66def BAlice   : BEntry<0xac>;
67def BBob     : BEntry<0x14>;
68def BCharlie : BEntry<0x80>;
69def BEve     : BEntry<0x4c>;
70
71def BValues : GenericEnum {
72  let FilterClass = "BEntry";
73  let NameField = "Name";
74  let ValueField = "Encoding";
75}
76
77def BTable : GenericTable {
78  let FilterClass = "BEntry";
79  string CppTypeName = "BTypeName";
80  let Fields = ["Name", "Encoding"];
81}
82
83def lookupBTableByName : SearchIndex {
84  let Table = BTable;
85  let Key = ["Name"];
86}
87
88
89// CHECK-LABEL: GET_CTable_DECL
90// CHECK: const CEntry *lookupCEntryByEncoding(uint16_t Encoding);
91// CHECK: const CEntry *lookupCEntry(StringRef Name, unsigned Kind);
92// CHECK-LABEL: GET_CTable_IMPL
93// CHECK: const CEntry *lookupCEntryByEncoding(uint16_t Encoding) {
94// CHECK:   if ((Encoding < 0xA) ||
95// CHECK:       (Encoding > 0xF))
96// CHECK:     return nullptr;
97
98// CHECK: const CEntry *lookupCEntry(StringRef Name, unsigned Kind) {
99// CHECK: Index[] = {
100// CHECK:   { "ALICE", CBar, 1 },
101// CHECK:   { "ALICE", CFoo, 0 },
102// CHECK:   { "BOB", CBaz, 2 },
103
104class CEnum;
105
106def CFoo : CEnum;
107def CBar : CEnum;
108def CBaz : CEnum;
109
110def CEnum : GenericEnum {
111  let FilterClass = "CEnum";
112}
113
114class CEntry<string name, CEnum kind, int enc> {
115  string Name = name;
116  CEnum Kind = kind;
117  bits<16> Encoding = enc;
118}
119
120def : CEntry<"alice", CFoo, 10>;
121def : CEntry<"alice", CBar, 13>;
122def : CEntry<"bob",   CBaz, 15>;
123
124def CTable : GenericTable {
125  let FilterClass = "CEntry";
126  let Fields = ["Name", "Kind", "Encoding"];
127
128  GenericEnum TypeOf_Kind = CEnum;
129
130  let PrimaryKey = ["Encoding"];
131  let PrimaryKeyName = "lookupCEntryByEncoding";
132  let PrimaryKeyEarlyOut = 1;
133}
134
135def lookupCEntry : SearchIndex {
136  let Table = CTable;
137  let Key = ["Name", "Kind"];
138}
139