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