@@ -130,6 +130,12 @@ class DefGen {
130130 // / Emit a trait method.
131131 void emitTraitMethod (const InterfaceMethod &method);
132132
133+ // ===--------------------------------------------------------------------===//
134+ // OpAsm{Type,Attr}Interface Default Method Emission
135+
136+ // / Emit 'getAlias' method using mnemonic as alias.
137+ void emitMnemonicAliasMethod ();
138+
133139 // ===--------------------------------------------------------------------===//
134140 // Storage Class Emission
135141 void emitStorageClass ();
@@ -215,6 +221,9 @@ DefGen::DefGen(const AttrOrTypeDef &def)
215221 emitAccessors ();
216222 // Emit trait interface methods
217223 emitInterfaceMethods ();
224+ // Emit OpAsm{Type,Attr}Interface default methods
225+ if (def.genMnemonicAlias ())
226+ emitMnemonicAliasMethod ();
218227 defCls.finalize ();
219228 // Emit a storage class if one is needed
220229 if (storageCls && def.genStorageClass ())
@@ -229,11 +238,24 @@ void DefGen::createParentWithTraits() {
229238 ? strfmt (" {0}::{1}" , def.getStorageNamespace (),
230239 def.getStorageClassName ())
231240 : strfmt (" ::mlir::{0}Storage" , valueType));
232- for (auto &trait : def.getTraits ()) {
233- defParent.addTemplateParam (
234- isa<NativeTrait>(&trait)
235- ? cast<NativeTrait>(&trait)->getFullyQualifiedTraitName ()
236- : cast<InterfaceTrait>(&trait)->getFullyQualifiedTraitName ());
241+ SmallVector<std::string> traitNames =
242+ llvm::to_vector (llvm::map_range (def.getTraits (), [](auto &trait) {
243+ return isa<NativeTrait>(&trait)
244+ ? cast<NativeTrait>(&trait)->getFullyQualifiedTraitName ()
245+ : cast<InterfaceTrait>(&trait)->getFullyQualifiedTraitName ();
246+ }));
247+ llvm::for_each (traitNames, [&](auto &traitName) {
248+ defParent.addTemplateParam (traitName);
249+ });
250+
251+ // Add OpAsmInterface::Trait if we automatically generate mnemonic alias
252+ // method.
253+ std::string opAsmInterfaceTraitName =
254+ strfmt (" ::mlir::OpAsm{0}Interface::Trait" , defType);
255+ if (def.genMnemonicAlias () && llvm::none_of (traitNames, [&](auto &traitName) {
256+ return traitName == opAsmInterfaceTraitName;
257+ })) {
258+ defParent.addTemplateParam (opAsmInterfaceTraitName);
237259 }
238260 defCls.addParent (std::move (defParent));
239261}
@@ -577,6 +599,22 @@ void DefGen::emitTraitMethod(const InterfaceMethod &method) {
577599 std::move (params));
578600}
579601
602+ // ===----------------------------------------------------------------------===//
603+ // OpAsm{Type,Attr}Interface Default Method Emission
604+
605+ void DefGen::emitMnemonicAliasMethod () {
606+ // If the mnemonic is not set, there is nothing to do.
607+ if (!def.getMnemonic ())
608+ return ;
609+
610+ // Emit the mnemonic alias method.
611+ SmallVector<MethodParameter> params{{" ::llvm::raw_ostream &" , " os" }};
612+ Method *m = defCls.addMethod <Method::Const>(" ::mlir::OpAsmAliasResult" ,
613+ " getAlias" , std::move (params));
614+ m->body ().indent () << strfmt (" os << \" {0}\" ;\n " , *def.getMnemonic ())
615+ << " return ::mlir::OpAsmAliasResult::OverridableAlias;\n " ;
616+ }
617+
580618// ===----------------------------------------------------------------------===//
581619// Storage Class Emission
582620// ===----------------------------------------------------------------------===//
0 commit comments