1 //===- MatchDataInfo.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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file Contains utilities related to handling "match data" for GlobalISel
10 ///  Combiners. Match data allows for setting some arbitrary data in the "match"
11 ///  phase and pass it down to the "apply" phase.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_UTILS_MIRPATTERNS_MATCHDATAINFO_H
16 #define LLVM_UTILS_MIRPATTERNS_MATCHDATAINFO_H
17 
18 #include "llvm/ADT/ArrayRef.h"
19 #include "llvm/ADT/StringMap.h"
20 #include "llvm/ADT/StringRef.h"
21 #include <string>
22 #include <vector>
23 
24 namespace llvm {
25 
26 class raw_ostream;
27 
28 namespace gi {
29 
30 /// Represents MatchData defined by the match stage and required by the apply
31 /// stage.
32 ///
33 /// This allows the plumbing of arbitrary data from C++ predicates between the
34 /// stages.
35 ///
36 /// When this class is initially created, it only has a pattern symbol and a
37 /// type. When all of the MatchDatas declarations of a given pattern have been
38 /// parsed, `AssignVariables` must be called to assign storage variable names to
39 /// each MatchDataInfo.
40 class MatchDataInfo {
41   StringRef PatternSymbol;
42   StringRef Type;
43   std::string VarName;
44 
45 public:
46   static constexpr StringLiteral StructTypeName = "MatchInfosTy";
47   static constexpr StringLiteral StructName = "MatchInfos";
48 
MatchDataInfo(StringRef PatternSymbol,StringRef Type)49   MatchDataInfo(StringRef PatternSymbol, StringRef Type)
50       : PatternSymbol(PatternSymbol), Type(Type.trim()) {}
51 
getPatternSymbol()52   StringRef getPatternSymbol() const { return PatternSymbol; };
getType()53   StringRef getType() const { return Type; };
54 
hasVariableName()55   bool hasVariableName() const { return !VarName.empty(); }
setVariableName(StringRef Name)56   void setVariableName(StringRef Name) { VarName = Name; }
57   StringRef getVariableName() const;
58 
getQualifiedVariableName()59   std::string getQualifiedVariableName() const {
60     return StructName.str() + "." + getVariableName().str();
61   }
62 
63   void print(raw_ostream &OS) const;
64   void dump() const;
65 };
66 
67 /// Pool of type -> variables used to emit MatchData variables declarations.
68 ///
69 /// e.g. if the map contains "int64_t" -> ["MD0", "MD1"], then two variable
70 /// declarations must be emitted: `int64_t MD0` and `int64_t MD1`.
71 ///
72 /// This has a static lifetime and will outlive all the `MatchDataInfo` objects
73 /// by design. It needs a static lifetime so the backends can emit variable
74 /// declarations after processing all the inputs.
75 extern StringMap<std::vector<std::string>> AllMatchDataVars;
76 
77 /// Assign variable names to all MatchDatas used by a pattern. This must be
78 /// called after all MatchData decls have been parsed for a given processing
79 /// unit (e.g. a combine rule)
80 ///
81 /// Requires an array of MatchDataInfo so we can handle cases where a pattern
82 /// uses multiple instances of the same MatchData type.
83 ///
84 /// Writes to \ref AllMatchDataVars.
85 void AssignMatchDataVariables(MutableArrayRef<MatchDataInfo> Infos);
86 
87 } // namespace gi
88 } // end namespace llvm
89 
90 #endif // ifndef LLVM_UTILS_MIRPATTERNS_MATCHDATAINFO_H
91