2 import java.util.HashSet;
3 import java.util.Hashtable;
5 import java.util.Vector;
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;
18 public class FlatSESEEnterNode extends FlatNode {
20 // SESE class identifiers should be numbered
21 // sequentially from 0 to 1-(total # SESE's)
22 private static int identifier=0;
25 protected FlatSESEExitNode exit;
26 protected SESENode treeNode;
27 protected FlatSESEEnterNode parent;
28 protected Integer oldestAgeToTrack;
29 protected boolean isCallerSESEplaceholder;
31 protected Set<FlatSESEEnterNode> children;
33 protected Set<TempDescriptor> inVars;
34 protected Set<TempDescriptor> outVars;
36 protected Set<SESEandAgePair> needStaticNameInCode;
38 protected Set<SESEandAgePair> staticInVarSrcs;
40 protected Set<TempDescriptor> readyInVars;
41 protected Set<TempDescriptor> staticInVars;
42 protected Set<TempDescriptor> dynamicInVars;
44 protected Set<TempDescriptor> dynamicVars;
46 protected Hashtable<TempDescriptor, VariableSourceToken> staticInVar2src;
48 private SESEEffectsSet seseEffectsSet;
51 // scope info for this SESE
52 protected FlatMethod fmEnclosing;
53 protected MethodDescriptor mdEnclosing;
54 protected ClassDescriptor cdEnclosing;
56 // structures that allow SESE to appear as
57 // a normal method to code generation
58 protected FlatMethod fmBogus;
59 protected MethodDescriptor mdBogus;
62 public FlatSESEEnterNode( SESENode sn ) {
63 this.id = identifier++;
66 oldestAgeToTrack = new Integer( 0 );
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>();
78 staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
80 seseEffectsSet = new SESEEffectsSet();
86 isCallerSESEplaceholder = false;
89 public void rewriteUse() {
92 public void rewriteDef() {
95 public void setFlatExit( FlatSESEExitNode fsexn ) {
99 public FlatSESEExitNode getFlatExit() {
104 return FKind.FlatSESEEnterNode;
107 public SESENode getTreeNode() {
111 public int getIdentifier() {
115 public String getPrettyIdentifier() {
116 if( treeNode.getID() != null ) {
117 return treeNode.getID();
122 public String toString() {
123 return "sese "+getPrettyIdentifier()+" enter";
126 public String toPrettyString() {
127 return "sese "+getPrettyIdentifier()+getIdentifier();
130 public void setParent( FlatSESEEnterNode parent ) {
131 this.parent = parent;
134 public FlatSESEEnterNode getParent() {
138 public void addChild( FlatSESEEnterNode child ) {
139 children.add( child );
142 public Set<FlatSESEEnterNode> getChildren() {
146 public void addInVar( TempDescriptor td ) {
150 public void addOutVar( TempDescriptor td ) {
154 public void addInVarSet( Set<TempDescriptor> s ) {
158 public void addOutVarSet( Set<TempDescriptor> s ) {
162 public Set<TempDescriptor> getInVarSet() {
166 Vector<TempDescriptor> vecinVars;
168 HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
169 paramset.addAll(inVars);
170 paramset.addAll(outVars);
171 vecinVars=new Vector<TempDescriptor>();
172 vecinVars.addAll(paramset);
175 public TempDescriptor getParameter(int i) {
176 if (vecinVars==null) {
179 return vecinVars.get(i);
182 public int numParameters() {
183 if (vecinVars==null) {
186 return vecinVars.size();
189 public Set<FlatNode> getNodeSet() {
190 HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
191 HashSet<FlatNode> visited=new HashSet<FlatNode>();
193 while(!tovisit.isEmpty()) {
194 FlatNode fn=tovisit.iterator().next();
199 for(int i=0; i<fn.numNext(); i++) {
200 FlatNode nn=fn.getNext(i);
201 if (!visited.contains(nn))
209 public Set<TempDescriptor> getOutVarSet() {
213 public void addNeededStaticName( SESEandAgePair p ) {
214 needStaticNameInCode.add( p );
217 public Set<SESEandAgePair> getNeededStaticNames() {
218 return needStaticNameInCode;
221 public void addStaticInVarSrc( SESEandAgePair p ) {
222 staticInVarSrcs.add( p );
225 public Set<SESEandAgePair> getStaticInVarSrcs() {
226 return staticInVarSrcs;
229 public void addReadyInVar( TempDescriptor td ) {
230 readyInVars.add( td );
233 public Set<TempDescriptor> getReadyInVarSet() {
237 public void addStaticInVar( TempDescriptor td ) {
238 staticInVars.add( td );
241 public Set<TempDescriptor> getStaticInVarSet() {
245 public void putStaticInVar2src( TempDescriptor staticInVar,
246 VariableSourceToken vst ) {
247 staticInVar2src.put( staticInVar, vst );
250 public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
251 return staticInVar2src.get( staticInVar );
254 public void addDynamicInVar( TempDescriptor td ) {
255 dynamicInVars.add( td );
258 public Set<TempDescriptor> getDynamicInVarSet() {
259 return dynamicInVars;
262 public void addDynamicVar( TempDescriptor td ) {
263 dynamicVars.add( td );
266 public Set<TempDescriptor> getDynamicVarSet() {
270 public void mustTrackAtLeastAge( Integer age ) {
271 if( age > oldestAgeToTrack ) {
272 oldestAgeToTrack = new Integer( age );
276 public Integer getOldestAgeToTrack() {
277 return oldestAgeToTrack;
280 public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
281 public FlatMethod getfmEnclosing() { return fmEnclosing; }
283 public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
284 public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
286 public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
287 public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
289 public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
290 public FlatMethod getfmBogus() { return fmBogus; }
292 public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
293 public MethodDescriptor getmdBogus() { return mdBogus; }
295 public String getSESEmethodName() {
296 assert cdEnclosing != null;
297 assert mdBogus != null;
300 cdEnclosing.getSafeSymbol()+
301 mdBogus.getSafeSymbol()+
303 mdBogus.getSafeMethodDescriptor();
306 public String getSESErecordName() {
307 assert cdEnclosing != null;
308 assert mdBogus != null;
312 cdEnclosing.getSafeSymbol()+
313 mdBogus.getSafeSymbol()+
315 mdBogus.getSafeMethodDescriptor()+
319 public void setCallerSESEplaceholder() {
320 isCallerSESEplaceholder = true;
323 public boolean getIsCallerSESEplaceholder() {
324 return isCallerSESEplaceholder;
328 public boolean equals( Object o ) {
333 if( !(o instanceof FlatSESEEnterNode) ) {
337 FlatSESEEnterNode fsen = (FlatSESEEnterNode) o;
338 return id == fsen.id;
341 public int hashCode() {
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()));
348 seseEffectsSet.addStrongUpdateVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
352 public void readEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn ){
353 seseEffectsSet.addReadingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
356 public SESEEffectsSet getSeseEffectsSet(){
357 return seseEffectsSet;