changes...plus a little optimization
[IRC.git] / Robust / src / IR / Flat / FlatSESEEnterNode.java
1 package IR.Flat;
2 import java.util.HashSet;
3 import java.util.Hashtable;
4 import java.util.Set;
5 import java.util.Vector;
6 import java.util.Iterator;
7 import java.util.Collection;
8
9 import Analysis.MLP.SESEEffectsKey;
10 import Analysis.MLP.SESEEffectsSet;
11 import Analysis.MLP.SESEandAgePair;
12 import Analysis.MLP.VariableSourceToken;
13 import Analysis.OwnershipAnalysis.HeapRegionNode;
14 import IR.ClassDescriptor;
15 import IR.FieldDescriptor;
16 import IR.MethodDescriptor;
17 import IR.TypeDescriptor;
18 import IR.Tree.SESENode;
19
20 public class FlatSESEEnterNode extends FlatNode {
21   
22   // SESE class identifiers should be numbered
23   // sequentially from 0 to 1-(total # SESE's)
24   private static int identifier=0;
25
26   private   int               id;
27   protected FlatSESEExitNode  exit;
28   protected SESENode          treeNode;
29   protected FlatSESEEnterNode parent;
30   protected Integer           oldestAgeToTrack;
31   protected boolean           isCallerSESEplaceholder;
32
33   protected static final int ISLEAF_UNINIT = 1;
34   protected static final int ISLEAF_FALSE  = 2;
35   protected static final int ISLEAF_TRUE   = 3;
36   protected int isLeafSESE;
37
38   protected Set<FlatSESEEnterNode> children;
39
40   protected Vector<TempDescriptor> inVars;
41   protected Set<TempDescriptor> outVars;
42
43   protected Set<SESEandAgePair> needStaticNameInCode;
44
45   protected Set<SESEandAgePair> staticInVarSrcs;
46
47   protected Set<TempDescriptor> readyInVars;
48   protected Set<TempDescriptor> staticInVars;
49   protected Set<TempDescriptor> dynamicInVars;  
50
51   protected Set<TempDescriptor> dynamicVars;
52
53   protected Hashtable<TempDescriptor, VariableSourceToken> staticInVar2src;
54   
55   private SESEEffectsSet seseEffectsSet;
56
57   // a subset of the in-set variables that shouuld be traversed during
58   // the dynamic coarse grained conflict strategy, remember them here so
59   // buildcode can be dumb and just gen the traversals
60   protected Set<TempDescriptor> inVarsForDynamicCoarseConflictResolution;
61
62   // scope info for this SESE
63   protected FlatMethod       fmEnclosing;
64   protected MethodDescriptor mdEnclosing;
65   protected ClassDescriptor  cdEnclosing;
66
67   // structures that allow SESE to appear as
68   // a normal method to code generation
69   protected FlatMethod       fmBogus;
70   protected MethodDescriptor mdBogus;
71
72   // used during code generation to calculate an offset
73   // into the SESE-specific record, specifically to the
74   // first field in a sequence of pointers to other SESE
75   // records which is relevant to garbage collection
76   protected String firstDepRecField;
77   protected int    numDepRecs;
78
79
80   public FlatSESEEnterNode( SESENode sn ) {
81     this.id              = identifier++;
82     treeNode             = sn;
83     parent               = null;
84     oldestAgeToTrack     = new Integer( 0 );
85
86     children             = new HashSet<FlatSESEEnterNode>();
87     inVars               = new Vector<TempDescriptor>();
88     outVars              = new HashSet<TempDescriptor>();
89     needStaticNameInCode = new HashSet<SESEandAgePair>();
90     staticInVarSrcs      = new HashSet<SESEandAgePair>();
91     readyInVars          = new HashSet<TempDescriptor>();
92     staticInVars         = new HashSet<TempDescriptor>();
93     dynamicInVars        = new HashSet<TempDescriptor>();
94     dynamicVars          = new HashSet<TempDescriptor>();
95
96     inVarsForDynamicCoarseConflictResolution = new HashSet<TempDescriptor>();
97     
98     staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
99     
100     seseEffectsSet = new SESEEffectsSet();
101
102     fmEnclosing = null;
103     mdEnclosing = null;
104     cdEnclosing = null;
105
106     isCallerSESEplaceholder = false;
107
108     isLeafSESE = ISLEAF_UNINIT;
109
110     firstDepRecField = null;
111     numDepRecs       = 0;
112   }
113
114   public void rewriteUse() {
115   }
116
117   public void rewriteDef() {
118   }
119
120   public void setFlatExit( FlatSESEExitNode fsexn ) {
121     exit = fsexn;
122   }
123
124   public FlatSESEExitNode getFlatExit() {
125     return exit;
126   }
127
128   public int kind() {
129     return FKind.FlatSESEEnterNode;
130   }
131
132   public SESENode getTreeNode() {
133     return treeNode;
134   }
135
136   public int getIdentifier() {
137     return id;
138   }
139
140   public String getPrettyIdentifier() {
141     if( treeNode.getID() != null ) {
142       return treeNode.getID();
143     }     
144     return ""+id;
145   }
146
147   public String toString() {
148     return "sese "+getPrettyIdentifier()+" enter";
149   }
150   
151   public String toPrettyString() {
152     return "sese "+getPrettyIdentifier()+getIdentifier();
153   }
154
155   public void setParent( FlatSESEEnterNode parent ) {
156     this.parent = parent;
157   }
158
159   public FlatSESEEnterNode getParent() {
160     return parent;
161   }
162
163   public void addChild( FlatSESEEnterNode child ) {
164     children.add( child );
165   }
166
167   public Set<FlatSESEEnterNode> getChildren() {
168     return children;
169   }
170
171   public void addInVar( TempDescriptor td ) {
172     if (!inVars.contains(td))
173       inVars.add( td );
174   }
175
176   public void addOutVar( TempDescriptor td ) {
177     outVars.add( td );
178   }
179
180   public void addInVarSet( Set<TempDescriptor> s ) {
181     for(Iterator<TempDescriptor> sit=s.iterator();sit.hasNext();) {
182       TempDescriptor tmp=sit.next();
183       if (!inVars.contains(tmp))
184         inVars.add(tmp);
185     }
186   }
187
188   public void addOutVarSet( Set<TempDescriptor> s ) {
189     outVars.addAll( s );
190   }
191
192   public Collection<TempDescriptor> getInVarSet() {
193     return inVars;
194   }
195
196   public Vector<TempDescriptor> getInVarVector() {
197     return inVars;
198   }
199
200   Vector<TempDescriptor> vecinVars;
201   void buildvarVec() {
202     HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
203     paramset.addAll(inVars);
204     paramset.addAll(outVars);
205     vecinVars=new Vector<TempDescriptor>();
206     vecinVars.addAll(paramset);
207   }
208
209   public TempDescriptor getParameter(int i) {
210     if (vecinVars==null) {
211       buildvarVec();
212     }
213     return vecinVars.get(i);
214   }
215
216   public int numParameters() {
217     if (vecinVars==null) {
218       buildvarVec();
219     }
220     return vecinVars.size();
221   }
222
223   public Set<FlatNode> getNodeSet() {
224     HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
225     HashSet<FlatNode> visited=new HashSet<FlatNode>();
226     tovisit.add(this);
227     while(!tovisit.isEmpty()) {
228       FlatNode fn=tovisit.iterator().next();
229       tovisit.remove(fn);
230       visited.add(fn);
231       
232       if (fn!=exit) {
233         for(int i=0; i<fn.numNext(); i++) {
234           FlatNode nn=fn.getNext(i);
235           if (!visited.contains(nn))
236             tovisit.add(nn);
237         }
238       }
239     }
240     return visited;
241   }
242
243   public Set<TempDescriptor> getOutVarSet() {
244     return outVars;
245   }
246
247   public void addNeededStaticName( SESEandAgePair p ) {
248     needStaticNameInCode.add( p );
249   }
250
251   public Set<SESEandAgePair> getNeededStaticNames() {
252     return needStaticNameInCode;
253   }
254
255   public void addStaticInVarSrc( SESEandAgePair p ) {
256     staticInVarSrcs.add( p );
257   }
258
259   public Set<SESEandAgePair> getStaticInVarSrcs() {
260     return staticInVarSrcs;
261   }
262
263   public void addReadyInVar( TempDescriptor td ) {
264     readyInVars.add( td );
265   }
266
267   public Set<TempDescriptor> getReadyInVarSet() {
268     return readyInVars;
269   }
270
271   public void addStaticInVar( TempDescriptor td ) {
272     staticInVars.add( td );
273   }
274
275   public Set<TempDescriptor> getStaticInVarSet() {
276     return staticInVars;
277   }
278
279   public void putStaticInVar2src( TempDescriptor staticInVar,
280                                   VariableSourceToken vst ) {
281     staticInVar2src.put( staticInVar, vst );
282   }
283
284   public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
285     return staticInVar2src.get( staticInVar );
286   }
287
288   public void addDynamicInVar( TempDescriptor td ) {
289     dynamicInVars.add( td );
290   }
291
292   public Set<TempDescriptor> getDynamicInVarSet() {
293     return dynamicInVars;
294   }
295
296   public void addDynamicVar( TempDescriptor td ) {
297     dynamicVars.add( td );
298   }
299
300   public Set<TempDescriptor> getDynamicVarSet() {
301     return dynamicVars;
302   }
303
304   public void mustTrackAtLeastAge( Integer age ) {
305     if( age > oldestAgeToTrack ) {
306       oldestAgeToTrack = new Integer( age );
307     }    
308   }
309
310   public Integer getOldestAgeToTrack() {
311     return oldestAgeToTrack;
312   }
313
314   public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
315   public FlatMethod getfmEnclosing() { return fmEnclosing; }
316
317   public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
318   public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
319
320   public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
321   public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
322
323   public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
324   public FlatMethod getfmBogus() { return fmBogus; }
325
326   public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
327   public MethodDescriptor getmdBogus() { return mdBogus; }
328
329   public String getSESEmethodName() {
330     assert cdEnclosing != null;
331     assert mdBogus != null;
332
333     return 
334       cdEnclosing.getSafeSymbol()+
335       mdBogus.getSafeSymbol()+
336       "_"+
337       mdBogus.getSafeMethodDescriptor();
338   }
339
340   public String getSESErecordName() {
341     assert cdEnclosing != null;
342     assert mdBogus != null;
343
344     return
345       "struct "+
346       cdEnclosing.getSafeSymbol()+
347       mdBogus.getSafeSymbol()+
348       "_"+
349       mdBogus.getSafeMethodDescriptor()+
350       "_SESErec";
351   }
352
353   public void setCallerSESEplaceholder() {
354     isCallerSESEplaceholder = true;
355   }
356
357   public boolean getIsCallerSESEplaceholder() {
358     return isCallerSESEplaceholder;
359   }
360
361
362   public boolean equals( Object o ) {
363     if( o == null ) {
364       return false;
365     }
366
367     if( !(o instanceof FlatSESEEnterNode) ) {
368       return false;
369     }
370
371     FlatSESEEnterNode fsen = (FlatSESEEnterNode) o;
372     return id == fsen.id;
373   }
374
375   public int hashCode() {
376     return 31*id;
377   }
378   
379   public void writeEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn, boolean strongUpdate){
380           seseEffectsSet.addWritingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
381           if(strongUpdate){
382                   seseEffectsSet.addStrongUpdateVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
383           }
384   }
385   
386   public void readEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn ){
387           seseEffectsSet.addReadingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
388   }
389   
390   public SESEEffectsSet getSeseEffectsSet(){
391           return seseEffectsSet;
392   }
393
394
395   public void setFirstDepRecField( String field ) {
396     firstDepRecField = field;
397   }
398
399   public String getFirstDepRecField() {
400     return firstDepRecField;
401   }
402
403   public void incNumDepRecs() {
404     ++numDepRecs;
405   }
406
407   public int getNumDepRecs() {
408     return numDepRecs;
409   }
410   
411   public Set<TempDescriptor> getInVarsForDynamicCoarseConflictResolution() {
412     return inVarsForDynamicCoarseConflictResolution;
413   }
414   
415   public void addInVarForDynamicCoarseConflictResolution(TempDescriptor inVar) {
416     inVarsForDynamicCoarseConflictResolution.add(inVar);
417   }
418
419   
420   public void setIsLeafSESE( boolean isLeaf ) {
421     if( isLeaf ) {
422       isLeafSESE = ISLEAF_TRUE;
423     } else {
424       isLeafSESE = ISLEAF_FALSE;
425     }
426   }
427
428   public boolean getIsLeafSESE() {
429     if( isLeafSESE == ISLEAF_UNINIT ) {
430       throw new Error( "isLeafSESE uninitialized" );
431     }
432
433     return isLeafSESE == ISLEAF_TRUE;
434   }
435 }