@@ -49,6 +49,8 @@ bool DialectType::init(raw_ostream &errs, GenDialectsContext &context,
4949 m_defaultGetterHasExplicitContextArgument =
5050 record->getValueAsBit (" defaultGetterHasExplicitContextArgument" );
5151
52+ m_customizeTypeClass = record->getValueAsBit (" customizeTypeClass" );
53+
5254 FmtContext fmt;
5355 fmt.addSubst (" _type" , m_name);
5456 {
@@ -141,6 +143,35 @@ bool DialectType::init(raw_ostream &errs, GenDialectsContext &context,
141143 return true ;
142144}
143145
146+ void DialectType::emitTypeClass (llvm::raw_ostream &out, GenDialect *dialect,
147+ FmtContext &fmt) const {
148+ FmtContextScope scope (fmt);
149+ fmt.addSubst (" dialect" , dialect->name );
150+ fmt.addSubst (" _type" , getName ());
151+ fmt.addSubst (" mnemonic" , getMnemonic ());
152+
153+ if (m_customizeTypeClass) {
154+ fmt.addSubst (" customize" ,
155+ tgfmt (" $_type::customizeTypeClass(&theClass);" , &fmt).str ());
156+ } else {
157+ fmt.addSubst (" customize" , " " );
158+ }
159+
160+ out << tgfmt (R"(
161+ static const auto class$_type = ([]() {
162+ ::llvm::TargetExtTypeClass theClass("$dialect.$mnemonic");
163+ theClass.setVerifier(
164+ [](::llvm::TargetExtType *T, ::llvm::raw_ostream &errs) {
165+ return ::llvm::cast<$_type>(T)->verifier(errs);
166+ });
167+ $customize
168+ return theClass;
169+ })();
170+ $_context.registerTargetExtTypeClass(&class$_type);
171+ )" ,
172+ &fmt);
173+ }
174+
144175void DialectType::emitDeclaration (raw_ostream &out, GenDialect *dialect) const {
145176 FmtContext fmt;
146177 fmt.withContext (m_context);
@@ -174,6 +205,12 @@ void DialectType::emitDeclaration(raw_ostream &out, GenDialect *dialect) const {
174205 }
175206 out << " );\n\n " ;
176207
208+ if (m_customizeTypeClass) {
209+ out << R"(
210+ static void customizeTypeClass(::llvm::TargetExtTypeClass *typeClass);
211+ )" ;
212+ }
213+
177214 for (const auto &argument : typeArguments ()) {
178215 out << tgfmt (" $0 get$1() const;\n " , &fmt, argument.type ->getCppType (),
179216 convertToCamelFromSnakeCase (argument.name , true ));
0 commit comments