brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · e968c73 Raw
84 lines · cpp
1//===- Syntax.cpp - Custom syntax for Linalg transform ops ----------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "mlir/Dialect/Linalg/TransformOps/Syntax.h"10#include "mlir/IR/OpImplementation.h"11#include "llvm/Support/InterleavedRange.h"12 13using namespace mlir;14 15ParseResult mlir::parseSemiFunctionType(OpAsmParser &parser, Type &argumentType,16                                        Type &resultType, bool resultOptional) {17  argumentType = resultType = nullptr;18 19  bool hasLParen = resultOptional ? parser.parseOptionalLParen().succeeded()20                                  : parser.parseLParen().succeeded();21  if (!resultOptional && !hasLParen)22    return failure();23  if (parser.parseType(argumentType).failed())24    return failure();25  if (!hasLParen)26    return success();27 28  return failure(parser.parseRParen().failed() ||29                 parser.parseArrow().failed() ||30                 parser.parseType(resultType).failed());31}32 33ParseResult mlir::parseSemiFunctionType(OpAsmParser &parser, Type &argumentType,34                                        SmallVectorImpl<Type> &resultTypes) {35  argumentType = nullptr;36  bool hasLParen = parser.parseOptionalLParen().succeeded();37  if (parser.parseType(argumentType).failed())38    return failure();39  if (!hasLParen)40    return success();41 42  if (parser.parseRParen().failed() || parser.parseArrow().failed())43    return failure();44 45  if (parser.parseOptionalLParen().failed()) {46    Type type;47    if (parser.parseType(type).failed())48      return failure();49    resultTypes.push_back(type);50    return success();51  }52  if (parser.parseTypeList(resultTypes).failed() ||53      parser.parseRParen().failed()) {54    resultTypes.clear();55    return failure();56  }57  return success();58}59 60void mlir::printSemiFunctionType(OpAsmPrinter &printer, Operation *op,61                                 Type argumentType, TypeRange resultType) {62  if (!resultType.empty())63    printer << "(";64  printer << argumentType;65  if (resultType.empty())66    return;67  printer << ") -> ";68 69  if (resultType.size() > 1)70    printer << "(";71  printer << llvm::interleaved(resultType);72  if (resultType.size() > 1)73    printer << ")";74}75 76void mlir::printSemiFunctionType(OpAsmPrinter &printer, Operation *op,77                                 Type argumentType, Type resultType,78                                 bool resultOptional) {79  assert(resultOptional || resultType != nullptr);80  return printSemiFunctionType(printer, op, argumentType,81                               resultType ? TypeRange(resultType)82                                          : TypeRange());83}84