c77a5cfeac866cc366541c4d76ab923e19803ca4
[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 Set<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 Vector<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   // a set of sese located at the first in transitive call chain 
80   // starting from the current sese 
81   protected Set<FlatSESEEnterNode> seseChildren;
82
83   public FlatSESEEnterNode( SESENode sn ) {
84     this.id              = identifier++;
85     treeNode             = sn;
86     parent               = null;
87     oldestAgeToTrack     = new Integer( 0 );
88
89     children             = new HashSet<FlatSESEEnterNode>();
90     inVars               = new HashSet<TempDescriptor>();
91     outVars              = new HashSet<TempDescriptor>();
92     needStaticNameInCode = new HashSet<SESEandAgePair>();
93     staticInVarSrcs      = new HashSet<SESEandAgePair>();
94     readyInVars          = new HashSet<TempDescriptor>();
95     staticInVars         = new HashSet<TempDescriptor>();
96     dynamicInVars        = new HashSet<TempDescriptor>();
97     dynamicVars          = new HashSet<TempDescriptor>();
98     seseChildren         = new HashSet<FlatSESEEnterNode>();
99
100     inVarsForDynamicCoarseConflictResolution = new Vector<TempDescriptor>();
101     
102     staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
103     
104     seseEffectsSet = new SESEEffectsSet();
105
106     fmEnclosing = null;
107     mdEnclosing = null;
108     cdEnclosing = null;
109
110     isCallerSESEplaceholder = false;
111
112     isLeafSESE = ISLEAF_UNINIT;
113
114     firstDepRecField = null;
115     numDepRecs       = 0;
116   }
117
118   public void rewriteUse() {
119   }
120
121   public void rewriteDef() {
122   }
123
124   public void setFlatExit( FlatSESEExitNode fsexn ) {
125     exit = fsexn;
126   }
127
128   public FlatSESEExitNode getFlatExit() {
129     return exit;
130   }
131
132   public int kind() {
133     return FKind.FlatSESEEnterNode;
134   }
135
136   public SESENode getTreeNode() {
137     return treeNode;
138   }
139
140   public int getIdentifier() {
141     return id;
142   }
143
144   public String getPrettyIdentifier() {
145     if( treeNode.getID() != null ) {
146       return treeNode.getID();
147     }     
148     return ""+id;
149   }
150
151   public String toString() {
152     return "sese "+getPrettyIdentifier()+" enter";
153   }
154   
155   public String toPrettyString() {
156     return "sese "+getPrettyIdentifier()+getIdentifier();
157   }
158
159   public void setParent( FlatSESEEnterNode parent ) {
160     this.parent = parent;
161   }
162
163   public FlatSESEEnterNode getParent() {
164     return parent;
165   }
166
167   public void addChild( FlatSESEEnterNode child ) {
168     children.add( child );
169   }
170
171   public Set<FlatSESEEnterNode> getChildren() {
172     return children;
173   }
174
175   public void addInVar( TempDescriptor td ) {
176     if (!inVars.contains(td))
177       inVars.add( td );
178   }
179
180   public void addOutVar( TempDescriptor td ) {
181     outVars.add( td );
182   }
183
184   public void addInVarSet( Set<TempDescriptor> s ) {
185     inVars.addAll(s);
186   }
187
188   public void addOutVarSet( Set<TempDescriptor> s ) {
189     outVars.addAll( s );
190   }
191
192   public Set<TempDescriptor> getInVarSet() {
193     return inVars;
194   }
195
196   Vector<TempDescriptor> vecinVars;
197   void buildvarVec() {
198     HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
199     paramset.addAll(inVars);
200     paramset.addAll(outVars);
201     vecinVars=new Vector<TempDescriptor>();
202     vecinVars.addAll(paramset);
203   }
204
205   public TempDescriptor getParameter(int i) {
206     if (vecinVars==null) {
207       buildvarVec();
208     }
209     return vecinVars.get(i);
210   }
211
212   public int numParameters() {
213     if (vecinVars==null) {
214       buildvarVec();
215     }
216     return vecinVars.size();
217   }
218
219   public Set<FlatNode> getNodeSet() {
220     HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
221     HashSet<FlatNode> visited=new HashSet<FlatNode>();
222     tovisit.add(this);
223     while(!tovisit.isEmpty()) {
224       FlatNode fn=tovisit.iterator().next();
225       tovisit.remove(fn);
226       visited.add(fn);
227       
228       if (fn!=exit) {
229         for(int i=0; i<fn.numNext(); i++) {
230           FlatNode nn=fn.getNext(i);
231           if (!visited.contains(nn))
232             tovisit.add(nn);
233         }
234       }
235     }
236     return visited;
237   }
238
239   public Set<TempDescriptor> getOutVarSet() {
240     return outVars;
241   }
242
243   public void addNeededStaticName( SESEandAgePair p ) {
244     needStaticNameInCode.add( p );
245   }
246
247   public Set<SESEandAgePair> getNeededStaticNames() {
248     return needStaticNameInCode;
249   }
250
251   public void addStaticInVarSrc( SESEandAgePair p ) {
252     staticInVarSrcs.add( p );
253   }
254
255   public Set<SESEandAgePair> getStaticInVarSrcs() {
256     return staticInVarSrcs;
257   }
258
259   public void addReadyInVar( TempDescriptor td ) {
260     readyInVars.add( td );
261   }
262
263   public Set<TempDescriptor> getReadyInVarSet() {
264     return readyInVars;
265   }
266
267   public void addStaticInVar( TempDescriptor td ) {
268     staticInVars.add( td );
269   }
270
271   public Set<TempDescriptor> getStaticInVarSet() {
272     return staticInVars;
273   }
274
275   public void putStaticInVar2src( TempDescriptor staticInVar,
276                                   VariableSourceToken vst ) {
277     staticInVar2src.put( staticInVar, vst );
278   }
279
280   public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
281     return staticInVar2src.get( staticInVar );
282   }
283
284   public void addDynamicInVar( TempDescriptor td ) {
285     dynamicInVars.add( td );
286   }
287
288   public Set<TempDescriptor> getDynamicInVarSet() {
289     return dynamicInVars;
290   }
291
292   public void addDynamicVar( TempDescriptor td ) {
293     dynamicVars.add( td );
294   }
295
296   public Set<TempDescriptor> getDynamicVarSet() {
297     return dynamicVars;
298   }
299
300   public void mustTrackAtLeastAge( Integer age ) {
301     if( age > oldestAgeToTrack ) {
302       oldestAgeToTrack = new Integer( age );
303     }    
304   }
305
306   public Integer getOldestAgeToTrack() {
307     return oldestAgeToTrack;
308   }
309
310   public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
311   public FlatMethod getfmEnclosing() { return fmEnclosing; }
312
313   public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
314   public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
315
316   public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
317   public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
318
319   public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
320   public FlatMethod getfmBogus() { return fmBogus; }
321
322   public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
323   public MethodDescriptor getmdBogus() { return mdBogus; }
324
325   public String getSESEmethodName() {
326     assert cdEnclosing != null;
327     assert mdBogus != null;
328
329     return 
330       cdEnclosing.getSafeSymbol()+
331       mdBogus.getSafeSymbol()+
332       "_"+
333       mdBogus.getSafeMethodDescriptor();
334   }
335
336   public String getSESErecordName() {
337     assert cdEnclosing != null;
338     assert mdBogus != null;
339
340     return
341       "struct "+
342       cdEnclosing.getSafeSymbol()+
343       mdBogus.getSafeSymbol()+
344       "_"+
345       mdBogus.getSafeMethodDescriptor()+
346       "_SESErec";
347   }
348
349   public void setCallerSESEplaceholder() {
350     isCallerSESEplaceholder = true;
351   }
352
353   public boolean getIsCallerSESEplaceholder() {
354     return isCallerSESEplaceholder;
355   }
356
357   public void addSESEChildren(FlatSESEEnterNode child){
358     seseChildren.add(child);
359   }
360   
361   public void addSESEChildren(Set<FlatSESEEnterNode> children){
362     seseChildren.addAll(children);
363   }
364   
365   public Set<FlatSESEEnterNode> getSESEChildren(){
366     return seseChildren;
367   }
368
369   public boolean equals( Object o ) {
370     if( o == null ) {
371       return false;
372     }
373
374     if( !(o instanceof FlatSESEEnterNode) ) {
375       return false;
376     }
377
378     FlatSESEEnterNode fsen = (FlatSESEEnterNode) o;
379     return id == fsen.id;
380   }
381
382   public int hashCode() {
383     return 31*id;
384   }
385   
386   public void writeEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn, boolean strongUpdate){
387           seseEffectsSet.addWritingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
388           if(strongUpdate){
389                   seseEffectsSet.addStrongUpdateVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
390           }
391   }
392   
393   public void readEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn ){
394           seseEffectsSet.addReadingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
395   }
396   
397   public SESEEffectsSet getSeseEffectsSet(){
398           return seseEffectsSet;
399   }
400
401
402   public void setFirstDepRecField( String field ) {
403     firstDepRecField = field;
404   }
405
406   public String getFirstDepRecField() {
407     return firstDepRecField;
408   }
409
410   public void incNumDepRecs() {
411     ++numDepRecs;
412   }
413
414   public int getNumDepRecs() {
415     return numDepRecs;
416   }
417   
418   public Vector<TempDescriptor> getInVarsForDynamicCoarseConflictResolution() {
419     return inVarsForDynamicCoarseConflictResolution;
420   }
421   
422   public void addInVarForDynamicCoarseConflictResolution(TempDescriptor inVar) {
423     if (!inVarsForDynamicCoarseConflictResolution.contains(inVar))
424       inVarsForDynamicCoarseConflictResolution.add(inVar);
425   }
426   
427   public void setIsLeafSESE( boolean isLeaf ) {
428     if( isLeaf ) {
429       isLeafSESE = ISLEAF_TRUE;
430     } else {
431       isLeafSESE = ISLEAF_FALSE;
432     }
433   }
434
435   public boolean getIsLeafSESE() {
436     if( isLeafSESE == ISLEAF_UNINIT ) {
437       throw new Error( "isLeafSESE uninitialized" );
438     }
439
440     return isLeafSESE == ISLEAF_TRUE;
441   }
442 }