1*c9157d92SDimitry Andric //===- MatchDataInfo.cpp ----------------------------------------*- C++ -*-===//
2*c9157d92SDimitry Andric //
3*c9157d92SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*c9157d92SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*c9157d92SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*c9157d92SDimitry Andric //
7*c9157d92SDimitry Andric //===----------------------------------------------------------------------===//
8*c9157d92SDimitry Andric //
9*c9157d92SDimitry Andric //
10*c9157d92SDimitry Andric //===----------------------------------------------------------------------===//
11*c9157d92SDimitry Andric 
12*c9157d92SDimitry Andric #include "MatchDataInfo.h"
13*c9157d92SDimitry Andric #include "llvm/Support/Debug.h"
14*c9157d92SDimitry Andric #include "llvm/Support/raw_ostream.h"
15*c9157d92SDimitry Andric 
16*c9157d92SDimitry Andric namespace llvm {
17*c9157d92SDimitry Andric namespace gi {
18*c9157d92SDimitry Andric 
19*c9157d92SDimitry Andric StringMap<std::vector<std::string>> AllMatchDataVars;
20*c9157d92SDimitry Andric 
getVariableName() const21*c9157d92SDimitry Andric StringRef MatchDataInfo::getVariableName() const {
22*c9157d92SDimitry Andric   assert(hasVariableName());
23*c9157d92SDimitry Andric   return VarName;
24*c9157d92SDimitry Andric }
25*c9157d92SDimitry Andric 
print(raw_ostream & OS) const26*c9157d92SDimitry Andric void MatchDataInfo::print(raw_ostream &OS) const {
27*c9157d92SDimitry Andric   OS << "(MatchDataInfo pattern_symbol:" << PatternSymbol << " type:'" << Type
28*c9157d92SDimitry Andric      << "' var_name:" << (VarName.empty() ? "<unassigned>" : VarName) << ")";
29*c9157d92SDimitry Andric }
30*c9157d92SDimitry Andric 
dump() const31*c9157d92SDimitry Andric void MatchDataInfo::dump() const { print(dbgs()); }
32*c9157d92SDimitry Andric 
AssignMatchDataVariables(MutableArrayRef<MatchDataInfo> Infos)33*c9157d92SDimitry Andric void AssignMatchDataVariables(MutableArrayRef<MatchDataInfo> Infos) {
34*c9157d92SDimitry Andric   static unsigned NextVarID = 0;
35*c9157d92SDimitry Andric 
36*c9157d92SDimitry Andric   StringMap<unsigned> SeenTypes;
37*c9157d92SDimitry Andric   for (auto &Info : Infos) {
38*c9157d92SDimitry Andric     unsigned &NumSeen = SeenTypes[Info.getType()];
39*c9157d92SDimitry Andric     auto &ExistingVars = AllMatchDataVars[Info.getType()];
40*c9157d92SDimitry Andric 
41*c9157d92SDimitry Andric     if (NumSeen == ExistingVars.size())
42*c9157d92SDimitry Andric       ExistingVars.push_back("MDInfo" + std::to_string(NextVarID++));
43*c9157d92SDimitry Andric 
44*c9157d92SDimitry Andric     Info.setVariableName(ExistingVars[NumSeen++]);
45*c9157d92SDimitry Andric   }
46*c9157d92SDimitry Andric }
47*c9157d92SDimitry Andric 
48*c9157d92SDimitry Andric } // namespace gi
49*c9157d92SDimitry Andric } // namespace llvm
50