Lots of bug fixes, stable system, parallelized binary computes incorrect answer
[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   protected boolean           isCallerSESEplaceholder;
23
24   protected Set<FlatSESEEnterNode> children;
25
26   protected Set<TempDescriptor> inVars;
27   protected Set<TempDescriptor> outVars;
28
29   protected Set<SESEandAgePair> needStaticNameInCode;
30
31   protected Set<SESEandAgePair> staticInVarSrcs;
32
33   protected Set<TempDescriptor> readyInVars;
34   protected Set<TempDescriptor> staticInVars;
35   protected Set<TempDescriptor> dynamicInVars;  
36
37   protected Set<TempDescriptor> dynamicVars;
38
39   protected Hashtable<TempDescriptor, VariableSourceToken> staticInVar2src;
40   
41
42   // scope info for this SESE
43   protected FlatMethod       fmEnclosing;
44   protected MethodDescriptor mdEnclosing;
45   protected ClassDescriptor  cdEnclosing;
46
47   // structures that allow SESE to appear as
48   // a normal method to code generation
49   protected FlatMethod       fmBogus;
50   protected MethodDescriptor mdBogus;
51
52
53   public FlatSESEEnterNode( SESENode sn ) {
54     this.id              = identifier++;
55     treeNode             = sn;
56     parent               = null;
57     oldestAgeToTrack     = new Integer( 0 );
58
59     children             = new HashSet<FlatSESEEnterNode>();
60     inVars               = new HashSet<TempDescriptor>();
61     outVars              = new HashSet<TempDescriptor>();
62     needStaticNameInCode = new HashSet<SESEandAgePair>();
63     staticInVarSrcs      = new HashSet<SESEandAgePair>();
64     readyInVars          = new HashSet<TempDescriptor>();
65     staticInVars         = new HashSet<TempDescriptor>();
66     dynamicInVars        = new HashSet<TempDescriptor>();
67     dynamicVars          = new HashSet<TempDescriptor>();
68
69     staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
70
71     fmEnclosing = null;
72     mdEnclosing = null;
73     cdEnclosing = null;
74
75     isCallerSESEplaceholder = false;
76   }
77
78   public void rewriteUse() {
79   }
80
81   public void rewriteDef() {
82   }
83
84   public void setFlatExit( FlatSESEExitNode fsexn ) {
85     exit = fsexn;
86   }
87
88   public FlatSESEExitNode getFlatExit() {
89     return exit;
90   }
91
92   public int kind() {
93     return FKind.FlatSESEEnterNode;
94   }
95
96   public SESENode getTreeNode() {
97     return treeNode;
98   }
99
100   public int getIdentifier() {
101     return id;
102   }
103
104   public String getPrettyIdentifier() {    
105     if( treeNode.getID() != null ) {
106       return treeNode.getID();
107     }     
108     return ""+id;
109   }
110
111   public String toString() {
112     return "sese "+getPrettyIdentifier()+" enter";
113   }
114
115   public void setParent( FlatSESEEnterNode parent ) {
116     this.parent = parent;
117   }
118
119   public FlatSESEEnterNode getParent() {
120     return parent;
121   }
122
123   public void addChild( FlatSESEEnterNode child ) {
124     children.add( child );
125   }
126
127   public Set<FlatSESEEnterNode> getChildren() {
128     return children;
129   }
130
131   public void addInVar( TempDescriptor td ) {
132     inVars.add( td );
133   }
134
135   public void addOutVar( TempDescriptor td ) {
136     outVars.add( td );
137   }
138
139   public void addInVarSet( Set<TempDescriptor> s ) {
140     inVars.addAll( s );
141   }
142
143   public void addOutVarSet( Set<TempDescriptor> s ) {
144     outVars.addAll( s );
145   }
146
147   public Set<TempDescriptor> getInVarSet() {
148     return inVars;
149   }
150
151   Vector<TempDescriptor> vecinVars;
152   void buildvarVec() {
153     HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
154     paramset.addAll(inVars);
155     paramset.addAll(outVars);
156     vecinVars=new Vector<TempDescriptor>();
157     vecinVars.addAll(paramset);
158   }
159
160   public TempDescriptor getParameter(int i) {
161     if (vecinVars==null) {
162       buildvarVec();
163     }
164     return vecinVars.get(i);
165   }
166
167   public int numParameters() {
168     if (vecinVars==null) {
169       buildvarVec();
170     }
171     return vecinVars.size();
172   }
173
174   public Set<FlatNode> getNodeSet() {
175     HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
176     HashSet<FlatNode> visited=new HashSet<FlatNode>();
177     tovisit.add(this);
178     while(!tovisit.isEmpty()) {
179       FlatNode fn=tovisit.iterator().next();
180       tovisit.remove(fn);
181       visited.add(fn);
182       
183       if (fn!=exit) {
184         for(int i=0; i<fn.numNext(); i++) {
185           FlatNode nn=fn.getNext(i);
186           if (!visited.contains(nn))
187             tovisit.add(nn);
188         }
189       }
190     }
191     return visited;
192   }
193
194   public Set<TempDescriptor> getOutVarSet() {
195     return outVars;
196   }
197
198   public void addNeededStaticName( SESEandAgePair p ) {
199     needStaticNameInCode.add( p );
200   }
201
202   public Set<SESEandAgePair> getNeededStaticNames() {
203     return needStaticNameInCode;
204   }
205
206   public void addStaticInVarSrc( SESEandAgePair p ) {
207     staticInVarSrcs.add( p );
208   }
209
210   public Set<SESEandAgePair> getStaticInVarSrcs() {
211     return staticInVarSrcs;
212   }
213
214   public void addReadyInVar( TempDescriptor td ) {
215     readyInVars.add( td );
216   }
217
218   public Set<TempDescriptor> getReadyInVarSet() {
219     return readyInVars;
220   }
221
222   public void addStaticInVar( TempDescriptor td ) {
223     staticInVars.add( td );
224   }
225
226   public Set<TempDescriptor> getStaticInVarSet() {
227     return staticInVars;
228   }
229
230   public void putStaticInVar2src( TempDescriptor staticInVar,
231                                   VariableSourceToken vst ) {
232     staticInVar2src.put( staticInVar, vst );
233   }
234
235   public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
236     return staticInVar2src.get( staticInVar );
237   }
238
239   public void addDynamicInVar( TempDescriptor td ) {
240     dynamicInVars.add( td );
241   }
242
243   public Set<TempDescriptor> getDynamicInVarSet() {
244     return dynamicInVars;
245   }
246
247   public void addDynamicVar( TempDescriptor td ) {
248     dynamicVars.add( td );
249   }
250
251   public Set<TempDescriptor> getDynamicVarSet() {
252     return dynamicVars;
253   }
254
255   public void mustTrackAtLeastAge( Integer age ) {
256     if( age > oldestAgeToTrack ) {
257       oldestAgeToTrack = new Integer( age );
258     }    
259   }
260
261   public Integer getOldestAgeToTrack() {
262     return oldestAgeToTrack;
263   }
264
265   public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
266   public FlatMethod getfmEnclosing() { return fmEnclosing; }
267
268   public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
269   public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
270
271   public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
272   public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
273
274   public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
275   public FlatMethod getfmBogus() { return fmBogus; }
276
277   public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
278   public MethodDescriptor getmdBogus() { return mdBogus; }
279
280   public String getSESEmethodName() {
281     assert cdEnclosing != null;
282     assert mdBogus != null;
283
284     return 
285       cdEnclosing.getSafeSymbol()+
286       mdBogus.getSafeSymbol()+
287       "_"+
288       mdBogus.getSafeMethodDescriptor();
289   }
290
291   public String getSESErecordName() {
292     assert cdEnclosing != null;
293     assert mdBogus != null;
294
295     return
296       "struct "+
297       cdEnclosing.getSafeSymbol()+
298       mdBogus.getSafeSymbol()+
299       "_"+
300       mdBogus.getSafeMethodDescriptor()+
301       "_SESErec";
302   }
303
304   public void setCallerSESEplaceholder() {
305     isCallerSESEplaceholder = true;
306   }
307
308   public boolean getIsCallerSESEplaceholder() {
309     return isCallerSESEplaceholder;
310   }
311
312
313   public boolean equals( Object o ) {
314     if( o == null ) {
315       return false;
316     }
317
318     if( !(o instanceof FlatSESEEnterNode) ) {
319       return false;
320     }
321
322     FlatSESEEnterNode fsen = (FlatSESEEnterNode) o;
323     return id == fsen.id;
324   }
325
326   public int hashCode() {
327     return 31*id;
328   }
329 }