//===- TypeParser.cpp - MLIR Type Parser Implementation -------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements the parser for the MLIR Types. // //===----------------------------------------------------------------------===// #include "Parser.h" #include "mlir/IR/AffineMap.h" #include "mlir/IR/BuiltinAttributeInterfaces.h" #include "mlir/IR/BuiltinTypeInterfaces.h" #include "mlir/IR/BuiltinTypes.h" #include "mlir/IR/OpDefinition.h" #include "mlir/IR/TensorEncoding.h" #include "mlir/IR/Types.h" #include "mlir/Support/LLVM.h" #include "llvm/ADT/STLExtras.h" #include <cassert> #include <cstdint> #include <limits> #include <optional> usingnamespacemlir; usingnamespacemlir::detail; /// Optionally parse a type. OptionalParseResult Parser::parseOptionalType(Type &type) { … } /// Parse an arbitrary type. /// /// type ::= function-type /// | non-function-type /// Type Parser::parseType() { … } /// Parse a function result type. /// /// function-result-type ::= type-list-parens /// | non-function-type /// ParseResult Parser::parseFunctionResultTypes(SmallVectorImpl<Type> &elements) { … } /// Parse a list of types without an enclosing parenthesis. The list must have /// at least one member. /// /// type-list-no-parens ::= type (`,` type)* /// ParseResult Parser::parseTypeListNoParens(SmallVectorImpl<Type> &elements) { … } /// Parse a parenthesized list of types. /// /// type-list-parens ::= `(` `)` /// | `(` type-list-no-parens `)` /// ParseResult Parser::parseTypeListParens(SmallVectorImpl<Type> &elements) { … } /// Parse a complex type. /// /// complex-type ::= `complex` `<` type `>` /// Type Parser::parseComplexType() { … } /// Parse a function type. /// /// function-type ::= type-list-parens `->` function-result-type /// Type Parser::parseFunctionType() { … } /// Parse a memref type. /// /// memref-type ::= ranked-memref-type | unranked-memref-type /// /// ranked-memref-type ::= `memref` `<` dimension-list-ranked type /// (`,` layout-specification)? (`,` memory-space)? `>` /// /// unranked-memref-type ::= `memref` `<*x` type (`,` memory-space)? `>` /// /// stride-list ::= `[` (dimension (`,` dimension)*)? `]` /// strided-layout ::= `offset:` dimension `,` `strides: ` stride-list /// layout-specification ::= semi-affine-map | strided-layout | attribute /// memory-space ::= integer-literal | attribute /// Type Parser::parseMemRefType() { … } /// Parse any type except the function type. /// /// non-function-type ::= integer-type /// | index-type /// | float-type /// | extended-type /// | vector-type /// | tensor-type /// | memref-type /// | complex-type /// | tuple-type /// | none-type /// /// index-type ::= `index` /// float-type ::= `f16` | `bf16` | `f32` | `f64` | `f80` | `f128` /// none-type ::= `none` /// Type Parser::parseNonFunctionType() { … } /// Parse a tensor type. /// /// tensor-type ::= `tensor` `<` dimension-list type `>` /// dimension-list ::= dimension-list-ranked | `*x` /// Type Parser::parseTensorType() { … } /// Parse a tuple type. /// /// tuple-type ::= `tuple` `<` (type (`,` type)*)? `>` /// Type Parser::parseTupleType() { … } /// Parse a vector type. /// /// vector-type ::= `vector` `<` vector-dim-list vector-element-type `>` /// vector-dim-list := (static-dim-list `x`)? (`[` static-dim-list `]` `x`)? /// static-dim-list ::= decimal-literal (`x` decimal-literal)* /// VectorType Parser::parseVectorType() { … } /// Parse a dimension list in a vector type. This populates the dimension list. /// For i-th dimension, `scalableDims[i]` contains either: /// * `false` for a non-scalable dimension (e.g. `4`), /// * `true` for a scalable dimension (e.g. `[4]`). /// /// vector-dim-list := (static-dim-list `x`)? /// static-dim-list ::= static-dim (`x` static-dim)* /// static-dim ::= (decimal-literal | `[` decimal-literal `]`) /// ParseResult Parser::parseVectorDimensionList(SmallVectorImpl<int64_t> &dimensions, SmallVectorImpl<bool> &scalableDims) { … } /// Parse a dimension list of a tensor or memref type. This populates the /// dimension list, using ShapedType::kDynamic for the `?` dimensions if /// `allowDynamic` is set and errors out on `?` otherwise. Parsing the trailing /// `x` is configurable. /// /// dimension-list ::= eps | dimension (`x` dimension)* /// dimension-list-with-trailing-x ::= (dimension `x`)* /// dimension ::= `?` | decimal-literal /// /// When `allowDynamic` is not set, this is used to parse: /// /// static-dimension-list ::= eps | decimal-literal (`x` decimal-literal)* /// static-dimension-list-with-trailing-x ::= (dimension `x`)* ParseResult Parser::parseDimensionListRanked(SmallVectorImpl<int64_t> &dimensions, bool allowDynamic, bool withTrailingX) { … } ParseResult Parser::parseIntegerInDimensionList(int64_t &value) { … } /// Parse an 'x' token in a dimension list, handling the case where the x is /// juxtaposed with an element type, as in "xf32", leaving the "f32" as the next /// token. ParseResult Parser::parseXInDimensionList() { … }