| //===- MatchDataInfo.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 utilities related to handling "match data" for GlobalISel |
| /// Combiners. Match data allows for setting some arbitrary data in the "match" |
| /// phase and pass it down to the "apply" phase. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_UTILS_MIRPATTERNS_MATCHDATAINFO_H |
| #define LLVM_UTILS_MIRPATTERNS_MATCHDATAINFO_H |
| |
| #include "llvm/ADT/ArrayRef.h" |
| #include "llvm/ADT/StringMap.h" |
| #include "llvm/ADT/StringRef.h" |
| #include <string> |
| #include <vector> |
| |
| namespace llvm { |
| |
| class raw_ostream; |
| |
| namespace gi { |
| |
| /// Represents MatchData defined by the match stage and required by the apply |
| /// stage. |
| /// |
| /// This allows the plumbing of arbitrary data from C++ predicates between the |
| /// stages. |
| /// |
| /// When this class is initially created, it only has a pattern symbol and a |
| /// type. When all of the MatchDatas declarations of a given pattern have been |
| /// parsed, `AssignVariables` must be called to assign storage variable names to |
| /// each MatchDataInfo. |
| class MatchDataInfo { |
| StringRef PatternSymbol; |
| StringRef Type; |
| std::string VarName; |
| |
| public: |
| static constexpr StringLiteral StructTypeName = "MatchInfosTy"; |
| static constexpr StringLiteral StructName = "MatchInfos"; |
| |
| MatchDataInfo(StringRef PatternSymbol, StringRef Type) |
| : PatternSymbol(PatternSymbol), Type(Type.trim()) {} |
| |
| StringRef getPatternSymbol() const { return PatternSymbol; }; |
| StringRef getType() const { return Type; }; |
| |
| bool hasVariableName() const { return !VarName.empty(); } |
| void setVariableName(StringRef Name) { VarName = Name; } |
| StringRef getVariableName() const; |
| |
| std::string getQualifiedVariableName() const { |
| return StructName.str() + "." + getVariableName().str(); |
| } |
| |
| void print(raw_ostream &OS) const; |
| void dump() const; |
| }; |
| |
| /// Pool of type -> variables used to emit MatchData variables declarations. |
| /// |
| /// e.g. if the map contains "int64_t" -> ["MD0", "MD1"], then two variable |
| /// declarations must be emitted: `int64_t MD0` and `int64_t MD1`. |
| /// |
| /// This has a static lifetime and will outlive all the `MatchDataInfo` objects |
| /// by design. It needs a static lifetime so the backends can emit variable |
| /// declarations after processing all the inputs. |
| extern StringMap<std::vector<std::string>> AllMatchDataVars; |
| |
| /// Assign variable names to all MatchDatas used by a pattern. This must be |
| /// called after all MatchData decls have been parsed for a given processing |
| /// unit (e.g. a combine rule) |
| /// |
| /// Requires an array of MatchDataInfo so we can handle cases where a pattern |
| /// uses multiple instances of the same MatchData type. |
| /// |
| /// Writes to \ref AllMatchDataVars. |
| void AssignMatchDataVariables(MutableArrayRef<MatchDataInfo> Infos); |
| |
| } // namespace gi |
| } // end namespace llvm |
| |
| #endif // ifndef LLVM_UTILS_MIRPATTERNS_MATCHDATAINFO_H |