Skip to content

Commit a15eb89

Browse files
committed
[TableGen] Allow bit fields in SearchableTables.
Differential Revision: https://reviews.llvm.org/D151756
1 parent 8265994 commit a15eb89

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

llvm/test/TableGen/generic-tables.td

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,25 +56,29 @@ def ATable : GenericTable {
5656

5757
// CHECK-LABEL: GET_BTable_IMPL
5858
// CHECK: constexpr BTypeName BTable[] = {
59-
// CHECK: { "BAlice", 0xAC, },
60-
// CHECK: { "BBob", 0x14, Bob == 13 },
61-
// CHECK: { "BCharlie", 0x80, Charlie == 42 },
62-
// CHECK: { "BEve", 0x4C, Eve == 108 },
59+
// CHECK: { "BAlice", 0xAC, false, },
60+
// CHECK: { "BBob", 0x14, false, Bob == 13 },
61+
// CHECK: { "BCharlie", 0x80, true, Charlie == 42 },
62+
// CHECK: { "BEve", 0x4C, true, Eve == 108 },
6363
// CHECK: };
6464
// CHECK: const BTypeName *lookupBTableByName(StringRef Name) {
6565
// CHECK: return &BTable[Idx->_index];
6666
// CHECK: }
67+
// CHECK: const BTypeName *lookupBTableByNameAndFlag(StringRef Name, bool Flag) {
68+
// CHECK: return &BTable[Idx->_index];
69+
// CHECK: }
6770

68-
class BEntry<bits<16> enc, code test = [{}]> {
71+
class BEntry<bits<16> enc, bit flag = 0, code test = [{}]> {
6972
string Name = NAME;
7073
bits<16> Encoding = enc;
74+
bit Flag = flag;
7175
code Test = test;
7276
}
7377

7478
def BAlice : BEntry<0xac>;
75-
def BBob : BEntry<0x14, [{Bob == 13}]>;
76-
def BCharlie : BEntry<0x80, "Charlie == 42">;
77-
def BEve : BEntry<0x4c, [{Eve == }] # 108>;
79+
def BBob : BEntry<0x14, 0, [{Bob == 13}]>;
80+
def BCharlie : BEntry<0x80, 1, "Charlie == 42">;
81+
def BEve : BEntry<0x4c, 1, [{Eve == }] # 108>;
7882

7983
def BValues : GenericEnum {
8084
let FilterClass = "BEntry";
@@ -85,7 +89,7 @@ def BValues : GenericEnum {
8589
def BTable : GenericTable {
8690
let FilterClass = "BEntry";
8791
string CppTypeName = "BTypeName";
88-
let Fields = ["Name", "Encoding", "Test"];
92+
let Fields = ["Name", "Encoding", "Flag", "Test"];
8993
string TypeOf_Test = "code";
9094
}
9195

@@ -94,6 +98,10 @@ def lookupBTableByName : SearchIndex {
9498
let Key = ["Name"];
9599
}
96100

101+
def lookupBTableByNameAndFlag : SearchIndex {
102+
let Table = BTable;
103+
let Key = ["Name", "Flag"];
104+
}
97105

98106
// CHECK-LABEL: GET_CTable_DECL
99107
// CHECK: const CEntry *lookupCEntryByEncoding(uint16_t Encoding);

llvm/utils/TableGen/SearchableTableEmitter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ class SearchableTableEmitter {
174174
"' lookup method '" + Index.Name +
175175
"', key field '" + Field.Name +
176176
"' of type bits is too large");
177+
} else if (BitRecTy *BI = dyn_cast<BitRecTy>(Field.RecType)) {
178+
return "bool";
177179
} else if (Field.Enum || Field.IsIntrinsic || Field.IsInstruction)
178180
return "unsigned";
179181
PrintFatalError(Index.Loc,

0 commit comments

Comments
 (0)