From 1bedb2340774099fd3faa6610a78119a4f802955 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar Date: Tue, 3 Mar 2020 12:01:54 -0800 Subject: [PATCH] [mlir][ods] Add query for derived attribute For ODS generated operations enable querying whether there is a derived attribute with a given name. Rollforward of commit 5aa57c2 without using llvm::is_contained. --- mlir/test/mlir-tblgen/op-attribute.td | 12 ++++++++++++ mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp | 14 ++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/mlir/test/mlir-tblgen/op-attribute.td b/mlir/test/mlir-tblgen/op-attribute.td index 44c9a72..cb85149 100644 --- a/mlir/test/mlir-tblgen/op-attribute.td +++ b/mlir/test/mlir-tblgen/op-attribute.td @@ -201,6 +201,18 @@ def DOp : NS_Op<"d_op", []> { // DEF: odsState.addAttribute("str_attr", (*odsBuilder).getStringAttr(str_attr)); // DEF: odsState.addAttribute("dv_str_attr", (*odsBuilder).getStringAttr(dv_str_attr)); +// Test derived type attr. +// --- +def DerivedTypeAttrOp : NS_Op<"derived_type_attr_op", []> { + let results = (outs AnyTensor:$output); + DerivedTypeAttr element_dtype = DerivedTypeAttr<"return output().getType();">; +} + +// DECL: bool isDerivedAttribute +// DEF: bool DerivedTypeAttrOp::isDerivedAttribute(StringRef name) { +// DEF: if (name == "element_dtype") return true; +// DEF: return false; +// DEF: } // Test that only default valued attributes at the end of the arguments // list get default values in the builder signature diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp index f4d114a..8c6ba60 100644 --- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp +++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp @@ -391,6 +391,20 @@ void OpEmitter::genAttrGetters() { emitAttrWithReturnType(name, attr); } } + + // Generate helper method to query whether a named attribute is a derived + // attribute. This enables, for example, avoiding adding an attribute that + // overlaps with a derived attribute. + auto &method = + opClass.newMethod("bool", "isDerivedAttribute", "StringRef name"); + auto &body = method.body(); + auto derivedAttr = make_filter_range(op.getAttributes(), + [](const NamedAttribute &namedAttr) { + return namedAttr.attr.isDerivedAttr(); + }); + for (auto namedAttr : derivedAttr) + body << " if (name == \"" << namedAttr.name << "\") return true;\n"; + body << " return false;"; } void OpEmitter::genAttrSetters() { -- 2.7.4