Working towards dynamic source variables in MLP, not quite ready
[IRC.git] / Robust / src / IR / Flat / FlatSESEEnterNode.java
1 package IR.Flat;
2 import Analysis.MLP.VariableSourceToken;
3 import Analysis.MLP.VarSrcTokTable;
4 import Analysis.MLP.SESEandAgePair;
5 import IR.MethodDescriptor;
6 import IR.ClassDescriptor;
7 import IR.TypeDescriptor;
8 import IR.Tree.SESENode;
9 import java.util.*;
10
11 public class FlatSESEEnterNode extends FlatNode {
12   
13   // SESE class identifiers should be numbered
14   // sequentially from 0 to 1-(total # SESE's)
15   private static int identifier=0;
16
17   private   int               id;
18   protected FlatSESEExitNode  exit;
19   protected SESENode          treeNode;
20   protected FlatSESEEnterNode parent;
21   protected Integer           oldestAgeToTrack;
22
23   protected Set<FlatSESEEnterNode> children;
24
25   protected Set<TempDescriptor> inVars;
26   protected Set<TempDescriptor> outVars;
27
28   protected Set<SESEandAgePair> needStaticNameInCode;
29
30   protected Set<SESEandAgePair> staticInVarSrcs;
31
32   protected Set<TempDescriptor> readyInVars;
33   protected Set<TempDescriptor> staticInVars;
34   protected Set<TempDescriptor> dynamicInVars;  
35
36   protected Set<TempDescriptor> dynamicStallVars;
37
38   protected Hashtable<TempDescriptor, VariableSourceToken> staticInVar2src;
39   
40
41   // scope info for this SESE
42   protected FlatMethod       fmEnclosing;
43   protected MethodDescriptor mdEnclosing;
44   protected ClassDescriptor  cdEnclosing;
45
46   // structures that allow SESE to appear as
47   // a normal method to code generation
48   protected FlatMethod       fmBogus;
49   protected MethodDescriptor mdBogus;
50
51
52   public FlatSESEEnterNode( SESENode sn ) {
53     this.id              = identifier++;
54     treeNode             = sn;
55     parent               = null;
56     oldestAgeToTrack     = new Integer( 0 );
57
58     children             = new HashSet<FlatSESEEnterNode>();
59     inVars               = new HashSet<TempDescriptor>();
60     outVars              = new HashSet<TempDescriptor>();
61     needStaticNameInCode = new HashSet<SESEandAgePair>();
62     staticInVarSrcs      = new HashSet<SESEandAgePair>();
63     readyInVars          = new HashSet<TempDescriptor>();
64     staticInVars         = new HashSet<TempDescriptor>();
65     dynamicInVars        = new HashSet<TempDescriptor>();
66     dynamicStallVars     = new HashSet<TempDescriptor>();
67
68     staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
69   }
70
71   public void rewriteUse() {
72   }
73
74   public void rewriteDef() {
75   }
76
77   public void setFlatExit( FlatSESEExitNode fsexn ) {
78     exit = fsexn;
79   }
80
81   public FlatSESEExitNode getFlatExit() {
82     return exit;
83   }
84
85   public int kind() {
86     return FKind.FlatSESEEnterNode;
87   }
88
89   public SESENode getTreeNode() {
90     return treeNode;
91   }
92
93   public int getIdentifier() {
94     return id;
95   }
96
97   public String getPrettyIdentifier() {    
98     if( treeNode.getID() != null ) {
99       return treeNode.getID();
100     }     
101     return ""+id;
102   }
103
104   public String toString() {
105     return "sese "+getPrettyIdentifier()+" enter";
106   }
107
108   public void setParent( FlatSESEEnterNode parent ) {
109     this.parent = parent;
110   }
111
112   public FlatSESEEnterNode getParent() {
113     return parent;
114   }
115
116   public void addChild( FlatSESEEnterNode child ) {
117     children.add( child );
118   }
119
120   public Set<FlatSESEEnterNode> getChildren() {
121     return children;
122   }
123
124   public void addInVar( TempDescriptor td ) {
125     inVars.add( td );
126   }
127
128   public void addOutVar( TempDescriptor td ) {
129     outVars.add( td );
130   }
131
132   public void addInVarSet( Set<TempDescriptor> s ) {
133     inVars.addAll( s );
134   }
135
136   public void addOutVarSet( Set<TempDescriptor> s ) {
137     outVars.addAll( s );
138   }
139
140   public Set<TempDescriptor> getInVarSet() {
141     return inVars;
142   }
143
144   Vector<TempDescriptor> vecinVars;
145   void buildvarVec() {
146     HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
147     paramset.addAll(inVars);
148     paramset.addAll(outVars);
149     vecinVars=new Vector<TempDescriptor>();
150     vecinVars.addAll(paramset);
151   }
152
153   public TempDescriptor getParameter(int i) {
154     if (vecinVars==null) {
155       buildvarVec();
156     }
157     return vecinVars.get(i);
158   }
159
160   public int numParameters() {
161     if (vecinVars==null) {
162       buildvarVec();
163     }
164     return vecinVars.size();
165   }
166
167   public Set<FlatNode> getNodeSet() {
168     HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
169     HashSet<FlatNode> visited=new HashSet<FlatNode>();
170     tovisit.add(this);
171     while(!tovisit.isEmpty()) {
172       FlatNode fn=tovisit.iterator().next();
173       tovisit.remove(fn);
174       visited.add(fn);
175       
176       if (fn!=exit) {
177         for(int i=0; i<fn.numNext(); i++) {
178           FlatNode nn=fn.getNext(i);
179           if (!visited.contains(nn))
180             tovisit.add(nn);
181         }
182       }
183     }
184     return visited;
185   }
186
187   public Set<TempDescriptor> getOutVarSet() {
188     return outVars;
189   }
190
191   public void addNeededStaticName( SESEandAgePair p ) {
192     needStaticNameInCode.add( p );
193   }
194
195   public Set<SESEandAgePair> getNeededStaticNames() {
196     return needStaticNameInCode;
197   }
198
199   public void addStaticInVarSrc( SESEandAgePair p ) {
200     staticInVarSrcs.add( p );
201   }
202
203   public Set<SESEandAgePair> getStaticInVarSrcs() {
204     return staticInVarSrcs;
205   }
206
207   public void addReadyInVar( TempDescriptor td ) {
208     readyInVars.add( td );
209   }
210
211   public Set<TempDescriptor> getReadyInVarSet() {
212     return readyInVars;
213   }
214
215   public void addStaticInVar( TempDescriptor td ) {
216     staticInVars.add( td );
217   }
218
219   public Set<TempDescriptor> getStaticInVarSet() {
220     return staticInVars;
221   }
222
223   public void putStaticInVar2src( TempDescriptor staticInVar,
224                                   VariableSourceToken vst ) {
225     staticInVar2src.put( staticInVar, vst );
226   }
227
228   public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
229     return staticInVar2src.get( staticInVar );
230   }
231
232   public void addDynamicInVar( TempDescriptor td ) {
233     dynamicInVars.add( td );
234   }
235
236   public Set<TempDescriptor> getDynamicInVarSet() {
237     return dynamicInVars;
238   }
239
240   public void addDynamicStallVar( TempDescriptor td ) {
241     dynamicStallVars.add( td );
242   }
243
244   public Set<TempDescriptor> getDynamicStallVarSet() {
245     return dynamicStallVars;
246   }
247
248   public void mustTrackAtLeastAge( Integer age ) {
249     if( age > oldestAgeToTrack ) {
250       oldestAgeToTrack = new Integer( age );
251     }    
252   }
253
254   public Integer getOldestAgeToTrack() {
255     return oldestAgeToTrack;
256   }
257
258   public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
259   public FlatMethod getfmEnclosing() { return fmEnclosing; }
260
261   public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
262   public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
263
264   public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
265   public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
266
267   public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
268   public FlatMethod getfmBogus() { return fmBogus; }
269
270   public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
271   public MethodDescriptor getmdBogus() { return mdBogus; }
272
273   public String getSESEmethodName() {
274     assert cdEnclosing != null;
275     assert mdBogus != null;
276
277     return 
278       cdEnclosing.getSafeSymbol()+
279       mdBogus.getSafeSymbol()+
280       "_"+
281       mdBogus.getSafeMethodDescriptor();
282   }
283
284   public String getSESErecordName() {
285     assert cdEnclosing != null;
286     assert mdBogus != null;
287
288     return
289       "struct "+
290       cdEnclosing.getSafeSymbol()+
291       mdBogus.getSafeSymbol()+
292       "_"+
293       mdBogus.getSafeMethodDescriptor()+
294       "_SESErec";
295   }
296 }