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