//===- LLVMTypeSyntax.cpp - Parsing/printing for MLIR LLVM Dialect types --===// // // 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 // //===----------------------------------------------------------------------===// #include "mlir/Dialect/LLVMIR/LLVMTypes.h" #include "mlir/IR/Builders.h" #include "mlir/IR/DialectImplementation.h" #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/TypeSwitch.h" usingnamespacemlir; usingnamespacemlir::LLVM; //===----------------------------------------------------------------------===// // Printing. //===----------------------------------------------------------------------===// /// If the given type is compatible with the LLVM dialect, prints it using /// internal functions to avoid getting a verbose `!llvm` prefix. Otherwise /// prints it as usual. static void dispatchPrint(AsmPrinter &printer, Type type) { … } /// Returns the keyword to use for the given type. static StringRef getTypeKeyword(Type type) { … } /// Prints a structure type. Keeps track of known struct names to handle self- /// or mutually-referring structs without falling into infinite recursion. static void printStructType(AsmPrinter &printer, LLVMStructType type) { … } /// Prints the given LLVM dialect type recursively. This leverages closedness of /// the LLVM dialect type system to avoid printing the dialect prefix /// repeatedly. For recursive structures, only prints the name of the structure /// when printing a self-reference. Note that this does not apply to sibling /// references. For example, /// struct<"a", (ptr<struct<"a">>)> /// struct<"c", (ptr<struct<"b", (ptr<struct<"c">>)>>, /// ptr<struct<"b", (ptr<struct<"c">>)>>)> /// note that "b" is printed twice. void mlir::LLVM::detail::printType(Type type, AsmPrinter &printer) { … } //===----------------------------------------------------------------------===// // Parsing. //===----------------------------------------------------------------------===// static ParseResult dispatchParse(AsmParser &parser, Type &type); /// Parses an LLVM dialect vector type. /// llvm-type ::= `vec<` `? x`? integer `x` llvm-type `>` /// Supports both fixed and scalable vectors. static Type parseVectorType(AsmParser &parser) { … } /// Attempts to set the body of an identified structure type. Reports a parsing /// error at `subtypesLoc` in case of failure. static LLVMStructType trySetStructBody(LLVMStructType type, ArrayRef<Type> subtypes, bool isPacked, AsmParser &parser, SMLoc subtypesLoc) { … } /// Parses an LLVM dialect structure type. /// llvm-type ::= `struct<` (string-literal `,`)? `packed`? /// `(` llvm-type-list `)` `>` /// | `struct<` string-literal `>` /// | `struct<` string-literal `, opaque>` static LLVMStructType parseStructType(AsmParser &parser) { … } /// Parses a type appearing inside another LLVM dialect-compatible type. This /// will try to parse any type in full form (including types with the `!llvm` /// prefix), and on failure fall back to parsing the short-hand version of the /// LLVM dialect types without the `!llvm` prefix. static Type dispatchParse(AsmParser &parser, bool allowAny = true) { … } /// Helper to use in parse lists. static ParseResult dispatchParse(AsmParser &parser, Type &type) { … } /// Parses one of the LLVM dialect types. Type mlir::LLVM::detail::parseType(DialectAsmParser &parser) { … } ParseResult LLVM::parsePrettyLLVMType(AsmParser &p, Type &type) { … } void LLVM::printPrettyLLVMType(AsmPrinter &p, Type type) { … }