changes
[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
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 HashSet<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 Vector<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     inVars.addAll(s);
182   }
183
184   public void addOutVarSet( Set<TempDescriptor> s ) {
185     outVars.addAll( s );
186   }
187
188   public Set<TempDescriptor> getInVarSet() {
189     return inVars;
190   }
191
192   Vector<TempDescriptor> vecinVars;
193   void buildvarVec() {
194     HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
195     paramset.addAll(inVars);
196     paramset.addAll(outVars);
197     vecinVars=new Vector<TempDescriptor>();
198     vecinVars.addAll(paramset);
199   }
200
201   public TempDescriptor getParameter(int i) {
202     if (vecinVars==null) {
203       buildvarVec();
204     }
205     return vecinVars.get(i);
206   }
207
208   public int numParameters() {
209     if (vecinVars==null) {
210       buildvarVec();
211     }
212     return vecinVars.size();
213   }
214
215   public Set<FlatNode> getNodeSet() {
216     HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
217     HashSet<FlatNode> visited=new HashSet<FlatNode>();
218     tovisit.add(this);
219     while(!tovisit.isEmpty()) {
220       FlatNode fn=tovisit.iterator().next();
221       tovisit.remove(fn);
222       visited.add(fn);
223       
224       if (fn!=exit) {
225         for(int i=0; i<fn.numNext(); i++) {
226           FlatNode nn=fn.getNext(i);
227           if (!visited.contains(nn))
228             tovisit.add(nn);
229         }
230       }
231     }
232     return visited;
233   }
234
235   public Set<TempDescriptor> getOutVarSet() {
236     return outVars;
237   }
238
239   public void addNeededStaticName( SESEandAgePair p ) {
240     needStaticNameInCode.add( p );
241   }
242
243   public Set<SESEandAgePair> getNeededStaticNames() {
244     return needStaticNameInCode;
245   }
246
247   public void addStaticInVarSrc( SESEandAgePair p ) {
248     staticInVarSrcs.add( p );
249   }
250
251   public Set<SESEandAgePair> getStaticInVarSrcs() {
252     return staticInVarSrcs;
253   }
254
255   public void addReadyInVar( TempDescriptor td ) {
256     readyInVars.add( td );
257   }
258
259   public Set<TempDescriptor> getReadyInVarSet() {
260     return readyInVars;
261   }
262
263   public void addStaticInVar( TempDescriptor td ) {
264     staticInVars.add( td );
265   }
266
267   public Set<TempDescriptor> getStaticInVarSet() {
268     return staticInVars;
269   }
270
271   public void putStaticInVar2src( TempDescriptor staticInVar,
272                                   VariableSourceToken vst ) {
273     staticInVar2src.put( staticInVar, vst );
274   }
275
276   public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
277     return staticInVar2src.get( staticInVar );
278   }
279
280   public void addDynamicInVar( TempDescriptor td ) {
281     dynamicInVars.add( td );
282   }
283
284   public Set<TempDescriptor> getDynamicInVarSet() {
285     return dynamicInVars;
286   }
287
288   public void addDynamicVar( TempDescriptor td ) {
289     dynamicVars.add( td );
290   }
291
292   public Set<TempDescriptor> getDynamicVarSet() {
293     return dynamicVars;
294   }
295
296   public void mustTrackAtLeastAge( Integer age ) {
297     if( age > oldestAgeToTrack ) {
298       oldestAgeToTrack = new Integer( age );
299     }    
300   }
301
302   public Integer getOldestAgeToTrack() {
303     return oldestAgeToTrack;
304   }
305
306   public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
307   public FlatMethod getfmEnclosing() { return fmEnclosing; }
308
309   public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
310   public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
311
312   public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
313   public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
314
315   public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
316   public FlatMethod getfmBogus() { return fmBogus; }
317
318   public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
319   public MethodDescriptor getmdBogus() { return mdBogus; }
320
321   public String getSESEmethodName() {
322     assert cdEnclosing != null;
323     assert mdBogus != null;
324
325     return 
326       cdEnclosing.getSafeSymbol()+
327       mdBogus.getSafeSymbol()+
328       "_"+
329       mdBogus.getSafeMethodDescriptor();
330   }
331
332   public String getSESErecordName() {
333     assert cdEnclosing != null;
334     assert mdBogus != null;
335
336     return
337       "struct "+
338       cdEnclosing.getSafeSymbol()+
339       mdBogus.getSafeSymbol()+
340       "_"+
341       mdBogus.getSafeMethodDescriptor()+
342       "_SESErec";
343   }
344
345   public void setCallerSESEplaceholder() {
346     isCallerSESEplaceholder = true;
347   }
348
349   public boolean getIsCallerSESEplaceholder() {
350     return isCallerSESEplaceholder;
351   }
352
353
354   public boolean equals( Object o ) {
355     if( o == null ) {
356       return false;
357     }
358
359     if( !(o instanceof FlatSESEEnterNode) ) {
360       return false;
361     }
362
363     FlatSESEEnterNode fsen = (FlatSESEEnterNode) o;
364     return id == fsen.id;
365   }
366
367   public int hashCode() {
368     return 31*id;
369   }
370   
371   public void writeEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn, boolean strongUpdate){
372           seseEffectsSet.addWritingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
373           if(strongUpdate){
374                   seseEffectsSet.addStrongUpdateVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
375           }
376   }
377   
378   public void readEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn ){
379           seseEffectsSet.addReadingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
380   }
381   
382   public SESEEffectsSet getSeseEffectsSet(){
383           return seseEffectsSet;
384   }
385
386
387   public void setFirstDepRecField( String field ) {
388     firstDepRecField = field;
389   }
390
391   public String getFirstDepRecField() {
392     return firstDepRecField;
393   }
394
395   public void incNumDepRecs() {
396     ++numDepRecs;
397   }
398
399   public int getNumDepRecs() {
400     return numDepRecs;
401   }
402   
403   public Vector<TempDescriptor> getInVarsForDynamicCoarseConflictResolution() {
404     return inVarsForDynamicCoarseConflictResolution;
405   }
406   
407   public void addInVarForDynamicCoarseConflictResolution(TempDescriptor inVar) {
408     if (!inVarsForDynamicCoarseConflictResolution.contains(inVar))
409       inVarsForDynamicCoarseConflictResolution.add(inVar);
410   }
411   
412   public void setIsLeafSESE( boolean isLeaf ) {
413     if( isLeaf ) {
414       isLeafSESE = ISLEAF_TRUE;
415     } else {
416       isLeafSESE = ISLEAF_FALSE;
417     }
418   }
419
420   public boolean getIsLeafSESE() {
421     if( isLeafSESE == ISLEAF_UNINIT ) {
422       throw new Error( "isLeafSESE uninitialized" );
423     }
424
425     return isLeafSESE == ISLEAF_TRUE;
426   }
427 }