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