Path: blob/main/contrib/llvm-project/llvm/utils/TableGen/Common/GlobalISel/PatternParser.h
35315 views
//===- PatternParser.h ------------------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8/// \file Contains tools to parse MIR patterns from TableGen DAG elements.9//10//===----------------------------------------------------------------------===//1112#ifndef LLVM_UTILS_GLOBALISEL_PATTERNPARSER_H13#define LLVM_UTILS_GLOBALISEL_PATTERNPARSER_H1415#include "llvm/ADT/ArrayRef.h"16#include "llvm/ADT/STLFunctionalExtras.h"17#include "llvm/ADT/SmallPtrSet.h"18#include "llvm/Support/SMLoc.h"19#include <memory>2021namespace llvm {22class CodeGenTarget;23class DagInit;24class Init;25class Record;26class StringRef;27class StringInit;2829namespace gi {30class InstructionPattern;31class Pattern;32class PatFrag;3334/// Helper class to parse MIR Pattern lists.35///36/// e.g., `(match (G_FADD $x, $y, $z), (G_FNEG $y, $z))`37class PatternParser {38const CodeGenTarget &CGT;39ArrayRef<SMLoc> DiagLoc;4041mutable SmallPtrSet<const PatFrag *, 2> SeenPatFrags;4243public:44PatternParser(const CodeGenTarget &CGT, ArrayRef<SMLoc> DiagLoc)45: CGT(CGT), DiagLoc(DiagLoc) {}4647/// Parses a list of patterns such as:48/// (Operator (Pattern1 ...), (Pattern2 ...))49/// \param List DagInit of the expected pattern list.50/// \param ParseAction Callback to handle a succesfully parsed pattern.51/// \param Operator The name of the operator, e.g. "match"52/// \param AnonPatNamePrefix Prefix for anonymous pattern names.53/// \return true on success, false on failure.54bool55parsePatternList(const DagInit &List,56function_ref<bool(std::unique_ptr<Pattern>)> ParseAction,57StringRef Operator, StringRef AnonPatNamePrefix);5859/// \returns all PatFrags encountered by this PatternParser.60const auto &getSeenPatFrags() const { return SeenPatFrags; }6162private:63/// Parse any InstructionPattern from a TableGen Init.64/// \param Arg Init to parse.65/// \param PatName Name of the pattern that will be parsed.66/// \return the parsed pattern on success, nullptr on failure.67std::unique_ptr<Pattern> parseInstructionPattern(const Init &Arg,68StringRef PatName);6970/// Parse a WipOpcodeMatcher from a TableGen Init.71/// \param Arg Init to parse.72/// \param PatName Name of the pattern that will be parsed.73/// \return the parsed pattern on success, nullptr on failure.74std::unique_ptr<Pattern> parseWipMatchOpcodeMatcher(const Init &Arg,75StringRef PatName);7677/// Parses an Operand of an InstructionPattern from a TableGen Init.78/// \param IP InstructionPattern for which we're parsing.79/// \param OpInit Init to parse.80/// \param OpName Name of the operand to parse.81/// \return true on success, false on failure.82bool parseInstructionPatternOperand(InstructionPattern &IP,83const Init *OpInit,84const StringInit *OpName);8586/// Parses a MIFlag for an InstructionPattern from a TableGen Init.87/// \param IP InstructionPattern for which we're parsing.88/// \param Op Init to parse.89/// \return true on success, false on failure.90bool parseInstructionPatternMIFlags(InstructionPattern &IP,91const DagInit *Op);9293/// (Uncached) PatFrag parsing implementation.94/// \param Def PatFrag def to parsee.95/// \return the parsed PatFrag on success, nullptr on failure.96std::unique_ptr<PatFrag> parsePatFragImpl(const Record *Def);9798/// Parses the in or out parameter list of a PatFrag.99/// \param OpsList Init to parse.100/// \param ParseAction Callback on successful parse, with the name of101/// the parameter and its \ref PatFrag::ParamKind102/// \return true on success, false on failure.103bool104parsePatFragParamList(const DagInit &OpsList,105function_ref<bool(StringRef, unsigned)> ParseAction);106107/// Cached PatFrag parser. This avoids duplicate work by keeping track of108/// already-parsed PatFrags.109/// \param Def PatFrag def to parsee.110/// \return the parsed PatFrag on success, nullptr on failure.111const PatFrag *parsePatFrag(const Record *Def);112};113114} // namespace gi115} // namespace llvm116117#endif118119120