Skip to content

Commit

Permalink
[MLIR] Expose optional attribute parsing functions
Browse files Browse the repository at this point in the history
The functionality already exists in AsmParser to parse optional ArrayAttrs and
StringAttrs, but only if they are added to a NamedAttrList.  This moves the
code to parse an optional attribute and add it to an list into a common
template, and exposes the simpler functionality of just parsing the optional
attributes.

Reviewed By: rriddle

Differential Revision: https://reviews.llvm.org/D111918
  • Loading branch information
youngar committed Oct 18, 2021
1 parent 1ff367d commit 44b22f6
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 47 deletions.
56 changes: 34 additions & 22 deletions mlir/include/mlir/IR/OpImplementation.h
Expand Up @@ -639,28 +639,6 @@ class AsmParser {
return parseAttribute(result, Type(), attrName, attrs);
}

/// Parse an optional attribute.
virtual OptionalParseResult parseOptionalAttribute(Attribute &result,
Type type,
StringRef attrName,
NamedAttrList &attrs) = 0;
template <typename AttrT>
OptionalParseResult parseOptionalAttribute(AttrT &result, StringRef attrName,
NamedAttrList &attrs) {
return parseOptionalAttribute(result, Type(), attrName, attrs);
}

/// Specialized variants of `parseOptionalAttribute` that remove potential
/// ambiguities in syntax.
virtual OptionalParseResult parseOptionalAttribute(ArrayAttr &result,
Type type,
StringRef attrName,
NamedAttrList &attrs) = 0;
virtual OptionalParseResult parseOptionalAttribute(StringAttr &result,
Type type,
StringRef attrName,
NamedAttrList &attrs) = 0;

/// Parse an arbitrary attribute of a given type and return it in result. This
/// also adds the attribute to the specified attribute list with the specified
/// name.
Expand All @@ -683,6 +661,40 @@ class AsmParser {
return success();
}

/// Parse an arbitrary optional attribute of a given type and return it in
/// result.
virtual OptionalParseResult parseOptionalAttribute(Attribute &result,
Type type = {}) = 0;

/// Parse an optional array attribute and return it in result.
virtual OptionalParseResult parseOptionalAttribute(ArrayAttr &result,
Type type = {}) = 0;

/// Parse an optional string attribute and return it in result.
virtual OptionalParseResult parseOptionalAttribute(StringAttr &result,
Type type = {}) = 0;

/// Parse an optional attribute of a specific type and add it to the list with
/// the specified name.
template <typename AttrType>
OptionalParseResult parseOptionalAttribute(AttrType &result,
StringRef attrName,
NamedAttrList &attrs) {
return parseOptionalAttribute(result, Type(), attrName, attrs);
}

/// Parse an optional attribute of a specific type and add it to the list with
/// the specified name.
template <typename AttrType>
OptionalParseResult parseOptionalAttribute(AttrType &result, Type type,
StringRef attrName,
NamedAttrList &attrs) {
OptionalParseResult parseResult = parseOptionalAttribute(result, type);
if (parseResult.hasValue() && succeeded(*parseResult))
attrs.append(attrName, result);
return parseResult;
}

/// Parse a named dictionary into 'result' if it is present.
virtual ParseResult parseOptionalAttrDict(NamedAttrList &result) = 0;

Expand Down
36 changes: 11 additions & 25 deletions mlir/lib/Parser/AsmParserImpl.h
Expand Up @@ -343,31 +343,17 @@ class AsmParserImpl : public BaseT {
return success(static_cast<bool>(result));
}

/// Parse an optional attribute.
template <typename AttrT>
OptionalParseResult
parseOptionalAttributeAndAddToList(AttrT &result, Type type,
StringRef attrName, NamedAttrList &attrs) {
OptionalParseResult parseResult =
parser.parseOptionalAttribute(result, type);
if (parseResult.hasValue() && succeeded(*parseResult))
attrs.push_back(parser.builder.getNamedAttr(attrName, result));
return parseResult;
}
OptionalParseResult parseOptionalAttribute(Attribute &result, Type type,
StringRef attrName,
NamedAttrList &attrs) override {
return parseOptionalAttributeAndAddToList(result, type, attrName, attrs);
}
OptionalParseResult parseOptionalAttribute(ArrayAttr &result, Type type,
StringRef attrName,
NamedAttrList &attrs) override {
return parseOptionalAttributeAndAddToList(result, type, attrName, attrs);
}
OptionalParseResult parseOptionalAttribute(StringAttr &result, Type type,
StringRef attrName,
NamedAttrList &attrs) override {
return parseOptionalAttributeAndAddToList(result, type, attrName, attrs);
OptionalParseResult parseOptionalAttribute(Attribute &result,
Type type) override {
return parser.parseOptionalAttribute(result, type);
}
OptionalParseResult parseOptionalAttribute(ArrayAttr &result,
Type type) override {
return parser.parseOptionalAttribute(result, type);
}
OptionalParseResult parseOptionalAttribute(StringAttr &result,
Type type) override {
return parser.parseOptionalAttribute(result, type);
}

/// Parse a named dictionary into 'result' if it is present.
Expand Down

0 comments on commit 44b22f6

Please sign in to comment.