brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · 2f95d3c Raw
119 lines · c
1//===- PatternParser.h ------------------------------------------*- C++ -*-===//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/// \file Contains tools to parse MIR patterns from TableGen DAG elements.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_UTILS_TABLEGEN_COMMON_GLOBALISEL_PATTERNPARSER_H14#define LLVM_UTILS_TABLEGEN_COMMON_GLOBALISEL_PATTERNPARSER_H15 16#include "llvm/ADT/ArrayRef.h"17#include "llvm/ADT/STLFunctionalExtras.h"18#include "llvm/ADT/SmallPtrSet.h"19#include "llvm/Support/SMLoc.h"20#include <memory>21 22namespace llvm {23class CodeGenTarget;24class DagInit;25class Init;26class Record;27class StringRef;28class StringInit;29 30namespace gi {31class InstructionPattern;32class Pattern;33class PatFrag;34 35/// Helper class to parse MIR Pattern lists.36///37/// e.g., `(match (G_FADD $x, $y, $z), (G_FNEG $y, $z))`38class PatternParser {39  const CodeGenTarget &CGT;40  ArrayRef<SMLoc> DiagLoc;41 42  mutable SmallPtrSet<const PatFrag *, 2> SeenPatFrags;43 44public:45  PatternParser(const CodeGenTarget &CGT, ArrayRef<SMLoc> DiagLoc)46      : CGT(CGT), DiagLoc(DiagLoc) {}47 48  /// Parses a list of patterns such as:49  ///   (Operator (Pattern1 ...), (Pattern2 ...))50  /// \param List         DagInit of the expected pattern list.51  /// \param ParseAction  Callback to handle a succesfully parsed pattern.52  /// \param Operator     The name of the operator, e.g. "match"53  /// \param AnonPatNamePrefix Prefix for anonymous pattern names.54  /// \return true on success, false on failure.55  bool56  parsePatternList(const DagInit &List,57                   function_ref<bool(std::unique_ptr<Pattern>)> ParseAction,58                   StringRef Operator, StringRef AnonPatNamePrefix);59 60  /// \returns all PatFrags encountered by this PatternParser.61  const auto &getSeenPatFrags() const { return SeenPatFrags; }62 63private:64  /// Parse any InstructionPattern from a TableGen Init.65  /// \param Arg Init to parse.66  /// \param PatName Name of the pattern that will be parsed.67  /// \return the parsed pattern on success, nullptr on failure.68  std::unique_ptr<Pattern> parseInstructionPattern(const Init &Arg,69                                                   StringRef PatName);70 71  /// Parse a WipOpcodeMatcher from a TableGen Init.72  /// \param Arg Init to parse.73  /// \param PatName Name of the pattern that will be parsed.74  /// \return the parsed pattern on success, nullptr on failure.75  std::unique_ptr<Pattern> parseWipMatchOpcodeMatcher(const Init &Arg,76                                                      StringRef PatName);77 78  /// Parses an Operand of an InstructionPattern from a TableGen Init.79  /// \param IP InstructionPattern for which we're parsing.80  /// \param OpInit Init to parse.81  /// \param OpName Name of the operand to parse.82  /// \return true on success, false on failure.83  bool parseInstructionPatternOperand(InstructionPattern &IP,84                                      const Init *OpInit,85                                      const StringInit *OpName);86 87  /// Parses a MIFlag for an InstructionPattern from a TableGen Init.88  /// \param IP InstructionPattern for which we're parsing.89  /// \param Op Init to parse.90  /// \return true on success, false on failure.91  bool parseInstructionPatternMIFlags(InstructionPattern &IP,92                                      const DagInit *Op);93 94  /// (Uncached) PatFrag parsing implementation.95  /// \param Def PatFrag def to parsee.96  /// \return the parsed PatFrag on success, nullptr on failure.97  std::unique_ptr<PatFrag> parsePatFragImpl(const Record *Def);98 99  /// Parses the in or out parameter list of a PatFrag.100  /// \param OpsList Init to parse.101  /// \param ParseAction Callback on successful parse, with the name of102  ///                     the parameter and its \ref PatFrag::ParamKind103  /// \return true on success, false on failure.104  bool105  parsePatFragParamList(const DagInit &OpsList,106                        function_ref<bool(StringRef, unsigned)> ParseAction);107 108  /// Cached PatFrag parser. This avoids duplicate work by keeping track of109  /// already-parsed PatFrags.110  /// \param Def PatFrag def to parsee.111  /// \return the parsed PatFrag on success, nullptr on failure.112  const PatFrag *parsePatFrag(const Record *Def);113};114 115} // namespace gi116} // namespace llvm117 118#endif // LLVM_UTILS_TABLEGEN_COMMON_GLOBALISEL_PATTERNPARSER_H119