Commit 5aa57c28 authored by Jacques Pienaar's avatar Jacques Pienaar
Browse files

[mlir][ods] Add query for derived attribute

For ODS generated operations enable querying whether there is a derived
attribute with a given name.
parent e3afe595
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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
+21 −0
Original line number Diff line number Diff line
@@ -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() {