diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td --- a/mlir/include/mlir/IR/OpBase.td +++ b/mlir/include/mlir/IR/OpBase.td @@ -791,12 +791,16 @@ // instantiation. // TOOD(b/132458159): deduplicate the fields in attribute wrapper classes. Attr baseAttr = ?; + + // The fully-qualified C++ namespace where the generated class lives. + string cppNamespace = ""; } // An attribute of a specific dialect. class DialectAttr : Attr { Dialect dialect = d; + let cppNamespace = d.cppNamespace; } //===----------------------------------------------------------------------===// @@ -1115,16 +1119,6 @@ // underlying type is not explicitly specified. string underlyingType = ""; - // The C++ namespaces that the enum class definition and utility functions - // should be placed into. - // - // Normally you want to place the full namespace path here. If it is nested, - // use "::" as the delimiter, e.g., given "A::B", generated code will be - // placed in `namespace A { namespace B { ... } }`. To avoid placing in any - // namespace, use "". - // TODO: use dialect to provide the namespace. - string cppNamespace = ""; - // The name of the utility function that converts a value of the underlying // type to the corresponding symbol. It will have the following signature: // @@ -1463,7 +1457,8 @@ // useful when representing data that would normally be in a structure. class StructAttr attributes> : - DictionaryAttrBase()">, + DictionaryAttrBase()">, "DictionaryAttr with field(s): " # StrJoin.result # " (each field having its own constraints)"> { @@ -1471,14 +1466,16 @@ string className = name; // Return type should match the name of the structure. - let returnType = name; + let returnType = d.cppNamespace # "::" # name; // Storage type should match the name of the structure. - let storageType = name; + let storageType = d.cppNamespace # "::" # name; // The dialect this StructAttr belongs to. Dialect dialect = d; + let cppNamespace = d.cppNamespace; + // List of fields that the StructAttr contains. list fields = attributes; } diff --git a/mlir/lib/TableGen/Pattern.cpp b/mlir/lib/TableGen/Pattern.cpp --- a/mlir/lib/TableGen/Pattern.cpp +++ b/mlir/lib/TableGen/Pattern.cpp @@ -219,11 +219,11 @@ case Kind::Operand: { // Use operand range for captured operands (to support potential variadic // operands). - return std::string( - formatv("Operation::operand_range {0}(op0->getOperands());\n", name)); + return std::string(formatv( + "::mlir::Operation::operand_range {0}(op0->getOperands());\n", name)); } case Kind::Value: { - return std::string(formatv("ArrayRef {0};\n", name)); + return std::string(formatv("::llvm::ArrayRef<::mlir::Value> {0};\n", name)); } case Kind::Result: { // Use the op itself for captured results. diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp --- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp +++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp @@ -487,16 +487,7 @@ // Emit with return type specified. auto emitAttrWithReturnType = [&](StringRef name, Attribute attr) { - Dialect attrDialect = attr.getDialect(); - // Does the current operation have a different namespace than the attribute? - bool differentNamespace = - attrDialect && opDialect && attrDialect != opDialect; - std::string returnType = differentNamespace - ? (llvm::Twine(attrDialect.getCppNamespace()) + - "::" + attr.getReturnType()) - .str() - : attr.getReturnType().str(); - auto *method = opClass.addMethodAndPrune(returnType, name); + auto *method = opClass.addMethodAndPrune(attr.getReturnType(), name); auto &body = method->body(); body << " auto attr = " << name << "Attr();\n"; if (attr.hasDefaultValue()) { @@ -2000,8 +1991,8 @@ opClass.addTrait("::mlir::OpAsmOpInterface::Trait"); // Generate the right accessor for the number of results. - auto *method = opClass.addMethodAndPrune("void", "getAsmResultNames", - "OpAsmSetValueNameFn", "setNameFn"); + auto *method = opClass.addMethodAndPrune( + "void", "getAsmResultNames", "::mlir::OpAsmSetValueNameFn", "setNameFn"); auto &body = method->body(); for (int i = 0; i != numResults; ++i) { body << " auto resultGroup" << i << " = getODSResults(" << i << ");\n" diff --git a/mlir/tools/mlir-tblgen/RewriterGen.cpp b/mlir/tools/mlir-tblgen/RewriterGen.cpp --- a/mlir/tools/mlir-tblgen/RewriterGen.cpp +++ b/mlir/tools/mlir-tblgen/RewriterGen.cpp @@ -221,7 +221,8 @@ int indent = 4 + 2 * depth; os.indent(indent) << formatv( - "auto castedOp{0} = dyn_cast_or_null<{1}>(op{0}); (void)castedOp{0};\n", + "auto castedOp{0} = ::llvm::dyn_cast_or_null<{1}>(op{0}); " + "(void)castedOp{0};\n", depth, op.getQualCppClassName()); // Skip the operand matching at depth 0 as the pattern rewriter already does. if (depth != 0) { @@ -535,7 +536,7 @@ os << "\n// Rewrite\n"; emitRewriteLogic(); - os << "return success();\n"; + os << "return ::mlir::success();\n"; } os << "};\n"; } @@ -1145,8 +1146,8 @@ } // Emit function to add the generated matchers to the pattern list. - os << "void LLVM_ATTRIBUTE_UNUSED populateWithGenerated(MLIRContext " - "*context, OwningRewritePatternList *patterns) {\n"; + os << "void LLVM_ATTRIBUTE_UNUSED populateWithGenerated(::mlir::MLIRContext " + "*context, ::mlir::OwningRewritePatternList *patterns) {\n"; for (const auto &name : rewriterNames) { os << " patterns->insert<" << name << ">(context);\n"; }