| // 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"]; | 
 | } |