summaryrefslogtreecommitdiff
path: root/llvm/utils/TableGen/Common/GlobalISel/PatternParser.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/TableGen/Common/GlobalISel/PatternParser.h')
-rw-r--r--llvm/utils/TableGen/Common/GlobalISel/PatternParser.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/llvm/utils/TableGen/Common/GlobalISel/PatternParser.h b/llvm/utils/TableGen/Common/GlobalISel/PatternParser.h
new file mode 100644
index 000000000000..cd6f524075cd
--- /dev/null
+++ b/llvm/utils/TableGen/Common/GlobalISel/PatternParser.h
@@ -0,0 +1,118 @@
+//===- PatternParser.h ------------------------------------------*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+/// \file Contains tools to parse MIR patterns from TableGen DAG elements.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_UTILS_GLOBALISEL_PATTERNPARSER_H
+#define LLVM_UTILS_GLOBALISEL_PATTERNPARSER_H
+
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/STLFunctionalExtras.h"
+#include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/Support/SMLoc.h"
+#include <memory>
+
+namespace llvm {
+class CodeGenTarget;
+class DagInit;
+class Init;
+class Record;
+class StringRef;
+class StringInit;
+
+namespace gi {
+class InstructionPattern;
+class Pattern;
+class PatFrag;
+
+/// Helper class to parse MIR Pattern lists.
+///
+/// e.g., `(match (G_FADD $x, $y, $z), (G_FNEG $y, $z))`
+class PatternParser {
+ const CodeGenTarget &CGT;
+ ArrayRef<SMLoc> DiagLoc;
+
+ mutable SmallPtrSet<const PatFrag *, 2> SeenPatFrags;
+
+public:
+ PatternParser(const CodeGenTarget &CGT, ArrayRef<SMLoc> DiagLoc)
+ : CGT(CGT), DiagLoc(DiagLoc) {}
+
+ /// Parses a list of patterns such as:
+ /// (Operator (Pattern1 ...), (Pattern2 ...))
+ /// \param List DagInit of the expected pattern list.
+ /// \param ParseAction Callback to handle a succesfully parsed pattern.
+ /// \param Operator The name of the operator, e.g. "match"
+ /// \param AnonPatNamePrefix Prefix for anonymous pattern names.
+ /// \return true on success, false on failure.
+ bool
+ parsePatternList(const DagInit &List,
+ function_ref<bool(std::unique_ptr<Pattern>)> ParseAction,
+ StringRef Operator, StringRef AnonPatNamePrefix);
+
+ /// \returns all PatFrags encountered by this PatternParser.
+ const auto &getSeenPatFrags() const { return SeenPatFrags; }
+
+private:
+ /// Parse any InstructionPattern from a TableGen Init.
+ /// \param Arg Init to parse.
+ /// \param PatName Name of the pattern that will be parsed.
+ /// \return the parsed pattern on success, nullptr on failure.
+ std::unique_ptr<Pattern> parseInstructionPattern(const Init &Arg,
+ StringRef PatName);
+
+ /// Parse a WipOpcodeMatcher from a TableGen Init.
+ /// \param Arg Init to parse.
+ /// \param PatName Name of the pattern that will be parsed.
+ /// \return the parsed pattern on success, nullptr on failure.
+ std::unique_ptr<Pattern> parseWipMatchOpcodeMatcher(const Init &Arg,
+ StringRef PatName);
+
+ /// Parses an Operand of an InstructionPattern from a TableGen Init.
+ /// \param IP InstructionPattern for which we're parsing.
+ /// \param OpInit Init to parse.
+ /// \param OpName Name of the operand to parse.
+ /// \return true on success, false on failure.
+ bool parseInstructionPatternOperand(InstructionPattern &IP,
+ const Init *OpInit,
+ const StringInit *OpName);
+
+ /// Parses a MIFlag for an InstructionPattern from a TableGen Init.
+ /// \param IP InstructionPattern for which we're parsing.
+ /// \param Op Init to parse.
+ /// \return true on success, false on failure.
+ bool parseInstructionPatternMIFlags(InstructionPattern &IP,
+ const DagInit *Op);
+
+ /// (Uncached) PatFrag parsing implementation.
+ /// \param Def PatFrag def to parsee.
+ /// \return the parsed PatFrag on success, nullptr on failure.
+ std::unique_ptr<PatFrag> parsePatFragImpl(const Record *Def);
+
+ /// Parses the in or out parameter list of a PatFrag.
+ /// \param OpsList Init to parse.
+ /// \param ParseAction Callback on successful parse, with the name of
+ /// the parameter and its \ref PatFrag::ParamKind
+ /// \return true on success, false on failure.
+ bool
+ parsePatFragParamList(const DagInit &OpsList,
+ function_ref<bool(StringRef, unsigned)> ParseAction);
+
+ /// Cached PatFrag parser. This avoids duplicate work by keeping track of
+ /// already-parsed PatFrags.
+ /// \param Def PatFrag def to parsee.
+ /// \return the parsed PatFrag on success, nullptr on failure.
+ const PatFrag *parsePatFrag(const Record *Def);
+};
+
+} // namespace gi
+} // namespace llvm
+
+#endif