[mlir][ods] Add query for derived attribute

For ODS generated operations enable querying whether there is a derived
attribute with a given name.
This commit is contained in:
Jacques Pienaar 2020-03-02 13:26:16 -08:00
parent e3afe5952d
commit 5aa57c2812
2 changed files with 32 additions and 0 deletions

View File

@ -201,6 +201,17 @@ 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: return llvm::is_contained(llvm::makeArrayRef<StringRef>({"element_dtype"}));
// DEF: }
// Test that only default valued attributes at the end of the arguments
// list get default values in the builder signature

View File

@ -391,6 +391,27 @@ 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();
});
if (derivedAttr.empty()) {
body << " return false;";
} else {
body << " return llvm::is_contained(llvm::makeArrayRef<StringRef>({";
mlir::interleaveComma(derivedAttr, body,
[&](const NamedAttribute &namedAttr) {
body << "\"" << namedAttr.name << "\"";
});
body << "}));";
}
}
void OpEmitter::genAttrSetters() {