@@ -177,6 +177,15 @@ Value createConstraint(OpBuilder &builder, tblgen::Constraint constraint) {
177177 }
178178
179179 if (predRec.isSubClassOf (" TypeDef" )) {
180+ auto dialect = predRec.getValueAsDef (" dialect" )->getValueAsString (" name" );
181+ if (dialect == selectedDialect) {
182+ std::string combined = (" !" + predRec.getValueAsString (" mnemonic" )).str ();
183+ SmallVector<FlatSymbolRefAttr> nested = {
184+ SymbolRefAttr::get (ctx, combined)};
185+ auto typeSymbol = SymbolRefAttr::get (ctx, dialect, nested);
186+ auto op = builder.create <irdl::BaseOp>(UnknownLoc::get (ctx), typeSymbol);
187+ return op.getOutput ();
188+ }
180189 std::string typeName = (" !" + predRec.getValueAsString (" typeName" )).str ();
181190 auto op = builder.create <irdl::BaseOp>(UnknownLoc::get (ctx),
182191 StringAttr::get (ctx, typeName));
@@ -250,6 +259,12 @@ static StringRef getOperatorName(tblgen::Operator &tblgenOp) {
250259 return opName;
251260}
252261
262+ // / Returns the name of the type without the dialect prefix.
263+ static StringRef getTypeName (tblgen::TypeDef &tblgenType) {
264+ StringRef opName = tblgenType.getDef ()->getValueAsString (" mnemonic" );
265+ return opName;
266+ }
267+
253268// / Extract an operation to IRDL.
254269irdl::OperationOp createIRDLOperation (OpBuilder &builder,
255270 tblgen::Operator &tblgenOp) {
@@ -300,6 +315,19 @@ irdl::OperationOp createIRDLOperation(OpBuilder &builder,
300315 return op;
301316}
302317
318+ irdl::TypeOp createIRDLType (OpBuilder &builder, tblgen::TypeDef &tblgenType) {
319+ MLIRContext *ctx = builder.getContext ();
320+ StringRef typeName = getTypeName (tblgenType);
321+ std::string combined = (" !" + typeName).str ();
322+
323+ irdl::TypeOp op = builder.create <irdl::TypeOp>(
324+ UnknownLoc::get (ctx), StringAttr::get (ctx, combined));
325+
326+ op.getBody ().emplaceBlock ();
327+
328+ return op;
329+ }
330+
303331static irdl::DialectOp createIRDLDialect (OpBuilder &builder) {
304332 MLIRContext *ctx = builder.getContext ();
305333 return builder.create <irdl::DialectOp>(UnknownLoc::get (ctx),
@@ -322,6 +350,14 @@ static bool emitDialectIRDLDefs(const RecordKeeper &recordKeeper,
322350 // Set insertion point to start of DialectOp.
323351 builder = builder.atBlockBegin (&dialect.getBody ().emplaceBlock ());
324352
353+ for (const Record *type :
354+ recordKeeper.getAllDerivedDefinitionsIfDefined (" TypeDef" )) {
355+ tblgen::TypeDef tblgenType (type);
356+ if (tblgenType.getDialect ().getName () != selectedDialect)
357+ continue ;
358+ createIRDLType (builder, tblgenType);
359+ }
360+
325361 for (const Record *def :
326362 recordKeeper.getAllDerivedDefinitionsIfDefined (" Op" )) {
327363 tblgen::Operator tblgenOp (def);
0 commit comments