MLIR 24.0.0git
EnumInfo.cpp
Go to the documentation of this file.
1//===- EnumInfo.cpp - EnumInfo wrapper class ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
11#include "llvm/TableGen/Error.h"
12#include "llvm/TableGen/Record.h"
13
14using namespace mlir;
15using namespace mlir::tblgen;
16
17using llvm::DefInit;
18using llvm::Init;
19using llvm::Record;
20
21EnumCase::EnumCase(const Record *record) : def(record) {
22 assert(def->isSubClassOf("EnumCase") &&
23 "must be subclass of TableGen 'EnumCase' class");
24}
25
26EnumCase::EnumCase(const DefInit *init) : EnumCase(init->getDef()) {}
27
28StringRef EnumCase::getSymbol() const {
29 return def->getValueAsString("symbol");
30}
31
32StringRef EnumCase::getStr() const { return def->getValueAsString("str"); }
33
34int64_t EnumCase::getValue() const { return def->getValueAsInt("value"); }
35
36const Record &EnumCase::getDef() const { return *def; }
37
38EnumInfo::EnumInfo(const Record *record) : def(record) {
39 assert(isSubClassOf("EnumInfo") &&
40 "must be subclass of TableGen 'EnumInfo' class");
41}
42
43EnumInfo::EnumInfo(const Record &record) : EnumInfo(&record) {}
44
45EnumInfo::EnumInfo(const DefInit *init) : EnumInfo(init->getDef()) {}
46
47bool EnumInfo::isSubClassOf(StringRef className) const {
48 return def->isSubClassOf(className);
49}
50
51bool EnumInfo::isEnumAttr() const { return isSubClassOf("EnumAttrInfo"); }
52
53std::optional<Attribute> EnumInfo::asEnumAttr() const {
54 if (isEnumAttr())
55 return Attribute(def);
56 return std::nullopt;
57}
58
59bool EnumInfo::isBitEnum() const { return isSubClassOf("BitEnumBase"); }
60
62 return isBitEnum() && !printBitEnumQuoted();
63}
64
66 std::optional<Attribute> enumAttrInfo = asEnumAttr();
67 return !getUnderlyingType().empty() &&
68 (!enumAttrInfo || !enumAttrInfo->getConstBuilderTemplate().empty());
69}
70
71StringRef EnumInfo::getEnumClassName() const {
72 return def->getValueAsString("className");
73}
74
75StringRef EnumInfo::getSummary() const {
76 return def->getValueAsString("summary");
77}
78
79StringRef EnumInfo::getDescription() const {
80 return def->getValueAsString("description");
81}
82
83StringRef EnumInfo::getCppNamespace() const {
84 return def->getValueAsString("cppNamespace");
85}
86
87std::string EnumInfo::getQualifiedName() const {
88 return (getCppNamespace() + "::" + getEnumClassName()).str();
89}
90
91int64_t EnumInfo::getBitwidth() const { return def->getValueAsInt("bitwidth"); }
92
93StringRef EnumInfo::getUnderlyingType() const {
94 return def->getValueAsString("underlyingType");
95}
96
98 return def->getValueAsString("underlyingToSymbolFnName");
99}
100
102 return def->getValueAsString("stringToSymbolFnName");
103}
104
106 return def->getValueAsString("symbolToStringFnName");
107}
108
110 return def->getValueAsString("symbolToStringFnRetType");
111}
112
114 return def->getValueAsString("maxEnumValFnName");
115}
116
117std::vector<EnumCase> EnumInfo::getAllCases() const {
118 const auto *inits = def->getValueAsListInit("enumerants");
119
120 std::vector<EnumCase> cases;
121 cases.reserve(inits->size());
122
123 for (const Init *init : *inits) {
124 cases.emplace_back(cast<DefInit>(init));
125 }
126
127 return cases;
128}
129
131 return isSubClassOf("EnumAttrInfo") &&
132 def->getValueAsBit("genSpecializedAttr");
133}
134
135const Record *EnumInfo::getBaseAttrClass() const {
136 return def->getValueAsDef("baseAttrClass");
137}
138
140 return def->getValueAsString("specializedAttrClassName");
141}
142
144 return def->getValueAsBit("printBitEnumPrimaryGroups");
145}
146
148 return def->getValueAsBit("printBitEnumQuoted");
149}
150
152 return def->getValueAsString("separator");
153}
154
156 StringRef separator = getBitEnumSeparator().trim();
157 if (separator == "|")
159 if (separator == ",")
161 if (separator.empty())
163 PrintFatalError(def->getLoc(),
164 "bit enum separator must be '|', ',', or a space ' '");
165}
166
168 switch (getBitEnumSeparatorKind()) {
170 return "parseOptionalVerticalBar";
172 return "parseOptionalComma";
174 // Whitespace is not a token, so there is nothing to parse between cases.
175 PrintFatalError(def->getLoc(),
176 "a bit enum with a space separator has no separator "
177 "parser");
178 }
179 llvm_unreachable("unknown bit enum separator kind");
180}
181
182const Record &EnumInfo::getDef() const { return *def; }
int64_t getValue() const
Definition EnumInfo.cpp:34
const llvm::Record * def
Definition EnumInfo.h:48
StringRef getSymbol() const
Definition EnumInfo.cpp:28
const llvm::Record & getDef() const
Definition EnumInfo.cpp:36
StringRef getStr() const
Definition EnumInfo.cpp:32
EnumCase(const llvm::Record *record)
bool isNewStyleBitEnum() const
Definition EnumInfo.cpp:61
StringRef getSymbolToStringFnName() const
Definition EnumInfo.cpp:105
bool genSpecializedAttr() const
Definition EnumInfo.cpp:130
const llvm::Record * getBaseAttrClass() const
Definition EnumInfo.cpp:135
BitEnumSeparatorKind getBitEnumSeparatorKind() const
Definition EnumInfo.cpp:155
std::vector< EnumCase > getAllCases() const
Definition EnumInfo.cpp:117
EnumInfo(const llvm::Record *record)
bool printBitEnumPrimaryGroups() const
Definition EnumInfo.cpp:143
int64_t getBitwidth() const
Definition EnumInfo.cpp:91
bool isSubClassOf(StringRef className) const
Definition EnumInfo.cpp:47
StringRef getMaxEnumValFnName() const
Definition EnumInfo.cpp:113
const llvm::Record * def
Definition EnumInfo.h:155
bool hasParserPrinter() const
Definition EnumInfo.cpp:65
const llvm::Record & getDef() const
Definition EnumInfo.cpp:182
StringRef getUnderlyingToSymbolFnName() const
Definition EnumInfo.cpp:97
StringRef getUnderlyingType() const
Definition EnumInfo.cpp:93
bool isBitEnum() const
Definition EnumInfo.cpp:59
bool printBitEnumQuoted() const
Definition EnumInfo.cpp:147
StringRef getStringToSymbolFnName() const
Definition EnumInfo.cpp:101
bool isEnumAttr() const
Definition EnumInfo.cpp:51
StringRef getCppNamespace() const
Definition EnumInfo.cpp:83
StringRef getSummary() const
Definition EnumInfo.cpp:75
StringRef getSpecializedAttrClassName() const
Definition EnumInfo.cpp:139
StringRef getEnumClassName() const
Definition EnumInfo.cpp:71
std::string getQualifiedName() const
Definition EnumInfo.cpp:87
StringRef getBitEnumSeparatorParser() const
Definition EnumInfo.cpp:167
StringRef getDescription() const
Definition EnumInfo.cpp:79
StringRef getSymbolToStringFnRetType() const
Definition EnumInfo.cpp:109
StringRef getBitEnumSeparator() const
Definition EnumInfo.cpp:151
std::optional< Attribute > asEnumAttr() const
Definition EnumInfo.cpp:53
Include the generated interface declarations.