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