@@ -177,6 +177,15 @@ Value createConstraint(OpBuilder &builder, tblgen::Constraint constraint) {
177
177
}
178
178
179
179
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
+ }
180
189
std::string typeName = (" !" + predRec.getValueAsString (" typeName" )).str ();
181
190
auto op = builder.create <irdl::BaseOp>(UnknownLoc::get (ctx),
182
191
StringAttr::get (ctx, typeName));
@@ -250,6 +259,12 @@ static StringRef getOperatorName(tblgen::Operator &tblgenOp) {
250
259
return opName;
251
260
}
252
261
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
+
253
268
// / Extract an operation to IRDL.
254
269
irdl::OperationOp createIRDLOperation (OpBuilder &builder,
255
270
tblgen::Operator &tblgenOp) {
@@ -300,6 +315,19 @@ irdl::OperationOp createIRDLOperation(OpBuilder &builder,
300
315
return op;
301
316
}
302
317
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
+
303
331
static irdl::DialectOp createIRDLDialect (OpBuilder &builder) {
304
332
MLIRContext *ctx = builder.getContext ();
305
333
return builder.create <irdl::DialectOp>(UnknownLoc::get (ctx),
@@ -322,6 +350,14 @@ static bool emitDialectIRDLDefs(const RecordKeeper &recordKeeper,
322
350
// Set insertion point to start of DialectOp.
323
351
builder = builder.atBlockBegin (&dialect.getBody ().emplaceBlock ());
324
352
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
+
325
361
for (const Record *def :
326
362
recordKeeper.getAllDerivedDefinitionsIfDefined (" Op" )) {
327
363
tblgen::Operator tblgenOp (def);
0 commit comments