ROSE  0.9.9.109
uniqueNameTraversal.h
1 #pragma once
2 
3 // DQ (10/5/2014): This is more strict now that we include rose_config.h in the sage3basic.h.
4 // #include "rose.h"
5 // rose.h and sage3basic.h should not be included in librose header files. [Robb P. Matzke 2014-10-15]
6 // #include "sage3basic.h"
7 
8 #include <vector>
9 
10 namespace ssa_private
11 {
12 
16 class VarUniqueName : public AstAttribute
17 {
18 private:
19 
23  std::vector<SgInitializedName*> key;
24 
25  bool usesThis;
26 
27 public:
28 
31  VarUniqueName() : key(), usesThis(false)
32  {
33  }
34 
41  VarUniqueName(SgInitializedName* thisNode) : usesThis(false)
42  {
43  key.push_back(thisNode);
44  }
45 
54  VarUniqueName(const std::vector<SgInitializedName*>& prefix, SgInitializedName* thisNode) : usesThis(false)
55  {
56  key.assign(prefix.begin(), prefix.end());
57  key.push_back(thisNode);
58  }
59 
64  VarUniqueName(const VarUniqueName& other) : AstAttribute(other), usesThis(false)
65  {
66  key.assign(other.key.begin(), other.key.end());
67  }
68 
69  VarUniqueName* copy() const
70  {
71  VarUniqueName* newName = new VarUniqueName(*this);
72  return newName;
73  }
74 
79  const std::vector<SgInitializedName*>& getKey()
80  {
81  return key;
82  }
83 
88  void setKey(const std::vector<SgInitializedName*>& newKey)
89  {
90  key.assign(newKey.begin(), newKey.end());
91  }
92 
93  bool getUsesThis()
94  {
95  return usesThis;
96  }
97 
98  void setUsesThis(bool uses)
99  {
100  usesThis = uses;
101  }
102 
107  std::string getNameString()
108  {
109  std::string name = "";
110  std::vector<SgInitializedName*>::iterator iter;
111  if (usesThis)
112  name += "this->";
113  for (iter = key.begin(); iter != key.end(); ++iter)
114  {
115  if (iter != key.begin())
116  {
117  name += ":";
118  }
119  name += (*iter)->get_name().getString();
120  }
121 
122  return name;
123  }
124 };
125 
128 {
132  SgNode* currentVar;
133 
134 public:
135 
137 
138  VariableReferenceSet() : currentVar(NULL)
139  {
140  }
141 
143  {
144  currentVar = var;
145  }
146 
147  SgNode* getCurrentVar()
148  {
149  return currentVar;
150  }
151 };
152 
154 class UniqueNameTraversal : public AstBottomUpProcessing<VariableReferenceSet>
155 {
157  std::vector<SgInitializedName*> allInitNames;
158 
161  SgInitializedName* resolveTemporaryInitNames(SgInitializedName* name);
162 
165  const bool treatPointersAsStructs;
166 
169  const bool propagateNamesThroughComma;
170 
171 public:
172 
174  static std::string varKeyTag;
175 
177  typedef std::vector<SgInitializedName*> VarName;
178 
181 
182  UniqueNameTraversal(const std::vector<SgInitializedName*>& allNames,
183  bool treatPointersAsStructs = true, bool propagateNamesThroughComma = true) : allInitNames(allNames),
184  treatPointersAsStructs(treatPointersAsStructs), propagateNamesThroughComma(propagateNamesThroughComma)
185  {
186  }
187 
196  virtual VariableReferenceSet evaluateSynthesizedAttribute(SgNode* node, SynthesizedAttributesList attrs);
197 };
198 
199 } //namespace ssa_private
VarUniqueName()
Constructs the attribute with an empty key.
Class to traverse the AST and assign unique names to every varRef.
VarUniqueName(SgInitializedName *thisNode)
Constructs the attribute with value thisNode.
VariableReferenceSet()
Default constructor.
Attribute Evaluator for synthesized attributes.
static std::string varKeyTag
Tag to use to retrieve unique naming key from node.
This class represents the notion of a declared variable.
VarUniqueName(const VarUniqueName &other)
Copy the attribute.
std::string getNameString()
Get the string representing this uniqueName.
This class represents the base class for all IR nodes within Sage III.
Definition: Cxx_Grammar.h:8322
void setKey(const std::vector< SgInitializedName * > &newKey)
Set the value of the name.
virtual VariableReferenceSet evaluateSynthesizedAttribute(SgNode *node, SynthesizedAttributesList attrs)
Called to evaluate the synthesized attribute on every node.
VarUniqueName(const std::vector< SgInitializedName * > &prefix, SgInitializedName *thisNode)
Constructs the attribute using the prefix vector and thisNode.
UniqueNameTraversal(const std::vector< SgInitializedName * > &allNames, bool treatPointersAsStructs=true, bool propagateNamesThroughComma=true)
const std::vector< SgInitializedName * > & getKey()
Get a constant reference to the name.
Class holding a unique name for a variable.
std::vector< SgInitializedName * > VarName
A compound variable name as used by the variable renaming.
Attribute that describes the variables modified by a given expression.