[Mlir-commits] [flang] [mlir] [MLIR][DLTI] Pretty parsing and printing for DLTI attrs (PR #113365)
Christian Ulmann
llvmlistbot at llvm.org
Wed Oct 30 23:56:17 PDT 2024
================
@@ -28,6 +29,134 @@ using namespace mlir;
#define DEBUG_TYPE "dlti"
+//===----------------------------------------------------------------------===//
+// Common parsing utility functions.
+//===----------------------------------------------------------------------===//
+
+/// Parse an entry which can either be of the form `key = value` or a
+/// #dlti.dl_entry attribute. When `tryType=true` the key can be a type,
+/// otherwise only quoted strings are allowed. The grammar is as follows:
+/// entry ::= ((type | quoted-string) `=` attr) | dl-entry-attr
+static ParseResult parseKeyValuePair(AsmParser &parser,
+ DataLayoutEntryInterface &entry,
+ bool tryType = false) {
+ Attribute value;
+
+ if (tryType) {
+ Type type;
+ OptionalParseResult parsedType = parser.parseOptionalType(type);
+ if (parsedType.has_value()) {
+ if (failed(parsedType.value()))
+ return parser.emitError(parser.getCurrentLocation())
+ << "error while parsing type DLTI key";
+
+ if (failed(parser.parseEqual()) || failed(parser.parseAttribute(value)))
+ return failure();
+
+ entry = DataLayoutEntryAttr::get(type, value);
+ return ParseResult::success();
+ }
+ }
+
+ std::string ident;
+ OptionalParseResult parsedStr = parser.parseOptionalString(&ident);
+ if (parsedStr.has_value() && succeeded(parsedStr.value())) {
+ if (failed(parser.parseEqual()) || failed(parser.parseAttribute(value)))
+ return failure(); // Assume that an error has already been emitted.
+
+ entry = DataLayoutEntryAttr::get(
+ StringAttr::get(parser.getContext(), ident), value);
+ return ParseResult::success();
+ }
+
+ OptionalParseResult parsedEntry = parser.parseAttribute(entry);
+ if (parsedEntry.has_value()) {
+ if (succeeded(parsedEntry.value()))
+ return parsedEntry.value();
+ return failure(); // Assume that an error has already been emitted.
+ }
+ return parser.emitError(parser.getCurrentLocation())
+ << "failed to parse DLTI entry";
+}
+
+/// Construct a requested attribute by parsing list of entries occurring within
+/// a pair of `<` and `>`, optionally allow types as keys and an empty list.
+/// The grammar is as follows:
+/// bracketed-entry-list ::=`<` entry-list `>`
+/// entry-list ::= | entry | entry `,` entry-list
+/// entry ::= ((type | quoted-string) `=` attr) | dl-entry-attr
+template <class Attr>
+static Attribute parseAngleBracketedEntries(AsmParser &parser, Type ty,
+ bool tryType = false,
+ bool allowEmpty = false) {
+ SmallVector<DataLayoutEntryInterface> entries;
+ if (failed(parser.parseCommaSeparatedList(
+ AsmParser::Delimiter::LessGreater, [&]() {
+ return parseKeyValuePair(parser, entries.emplace_back(), tryType);
+ })))
+ return {};
+
+ if (entries.empty() && !allowEmpty) {
+ parser.emitError(parser.getNameLoc()) << "no DLTI entries provided";
+ return {};
+ }
+
+ return Attr::getChecked([&] { return parser.emitError(parser.getNameLoc()); },
+ parser.getContext(), ArrayRef(entries));
+}
+
+//===----------------------------------------------------------------------===//
+// Common printing utility functions.
+//===----------------------------------------------------------------------===//
+
+/// Convert pointer-union keys to strings.
+static inline std::string keyToStr(DataLayoutEntryKey key) {
----------------
Dinistro wrote:
Side note: `inline` most certainly has not the effect you expect it to have. The `inline` keyword does not force or encourage inlining this function.
It is mainly used when having functions like this in a header, then it ensures that you do not get duplicated symbols from different compilation units.
https://github.com/llvm/llvm-project/pull/113365
More information about the Mlir-commits
mailing list