2 import java.util.HashSet;
3 import java.util.Hashtable;
5 import java.util.Vector;
6 import java.util.Iterator;
7 import java.util.Collection;
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;
20 public class FlatSESEEnterNode extends FlatNode {
22 // SESE class identifiers should be numbered
23 // sequentially from 0 to 1-(total # SESE's)
24 private static int identifier=0;
27 protected FlatSESEExitNode exit;
28 protected SESENode treeNode;
29 protected FlatSESEEnterNode parent;
30 protected Integer oldestAgeToTrack;
31 protected boolean isCallerSESEplaceholder;
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;
38 protected Set<FlatSESEEnterNode> children;
40 protected Set<TempDescriptor> inVars;
41 protected Set<TempDescriptor> outVars;
43 protected Set<SESEandAgePair> needStaticNameInCode;
45 protected Set<SESEandAgePair> staticInVarSrcs;
47 protected Set<TempDescriptor> readyInVars;
48 protected Set<TempDescriptor> staticInVars;
49 protected Set<TempDescriptor> dynamicInVars;
51 protected Set<TempDescriptor> dynamicVars;
53 protected Hashtable<TempDescriptor, VariableSourceToken> staticInVar2src;
55 private SESEEffectsSet seseEffectsSet;
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;
62 // scope info for this SESE
63 protected FlatMethod fmEnclosing;
64 protected MethodDescriptor mdEnclosing;
65 protected ClassDescriptor cdEnclosing;
67 // structures that allow SESE to appear as
68 // a normal method to code generation
69 protected FlatMethod fmBogus;
70 protected MethodDescriptor mdBogus;
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;
79 // a set of sese located at the first in transitive call chain
80 // starting from the current sese
81 protected Set<FlatSESEEnterNode> seseChildren;
83 // a set of complete parent sese, not bogus one
84 protected Set<FlatSESEEnterNode> seseParent;
87 public FlatSESEEnterNode( SESENode sn ) {
88 this.id = identifier++;
91 oldestAgeToTrack = new Integer( 0 );
93 children = new HashSet<FlatSESEEnterNode>();
94 inVars = new HashSet<TempDescriptor>();
95 outVars = new HashSet<TempDescriptor>();
96 needStaticNameInCode = new HashSet<SESEandAgePair>();
97 staticInVarSrcs = new HashSet<SESEandAgePair>();
98 readyInVars = new HashSet<TempDescriptor>();
99 staticInVars = new HashSet<TempDescriptor>();
100 dynamicInVars = new HashSet<TempDescriptor>();
101 dynamicVars = new HashSet<TempDescriptor>();
102 seseChildren = new HashSet<FlatSESEEnterNode>();
103 seseParent = new HashSet<FlatSESEEnterNode>();
105 inVarsForDynamicCoarseConflictResolution = new Vector<TempDescriptor>();
107 staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
109 seseEffectsSet = new SESEEffectsSet();
115 isCallerSESEplaceholder = false;
117 isLeafSESE = ISLEAF_UNINIT;
119 firstDepRecField = null;
123 public void rewriteUse() {
126 public void rewriteDef() {
129 public void setFlatExit( FlatSESEExitNode fsexn ) {
133 public FlatSESEExitNode getFlatExit() {
138 return FKind.FlatSESEEnterNode;
141 public SESENode getTreeNode() {
145 public int getIdentifier() {
149 public String getPrettyIdentifier() {
150 if( treeNode.getID() != null ) {
151 return treeNode.getID();
156 public String toString() {
157 return "sese "+getPrettyIdentifier()+" enter";
160 public String toPrettyString() {
161 return "sese "+getPrettyIdentifier()+getIdentifier();
164 public void setParent( FlatSESEEnterNode parent ) {
165 this.parent = parent;
168 public FlatSESEEnterNode getParent() {
172 public void addChild( FlatSESEEnterNode child ) {
173 children.add( child );
176 public Set<FlatSESEEnterNode> getChildren() {
180 public void addInVar( TempDescriptor td ) {
181 if (!inVars.contains(td))
185 public void addOutVar( TempDescriptor td ) {
189 public void addInVarSet( Set<TempDescriptor> s ) {
193 public void addOutVarSet( Set<TempDescriptor> s ) {
197 public Set<TempDescriptor> getInVarSet() {
201 Vector<TempDescriptor> vecinVars;
203 HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
204 paramset.addAll(inVars);
205 paramset.addAll(outVars);
206 vecinVars=new Vector<TempDescriptor>();
207 vecinVars.addAll(paramset);
210 public TempDescriptor getParameter(int i) {
211 if (vecinVars==null) {
214 return vecinVars.get(i);
217 public int numParameters() {
218 if (vecinVars==null) {
221 return vecinVars.size();
224 public Set<FlatNode> getNodeSet() {
225 HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
226 HashSet<FlatNode> visited=new HashSet<FlatNode>();
228 while(!tovisit.isEmpty()) {
229 FlatNode fn=tovisit.iterator().next();
234 for(int i=0; i<fn.numNext(); i++) {
235 FlatNode nn=fn.getNext(i);
236 if (!visited.contains(nn))
244 public Set<TempDescriptor> getOutVarSet() {
248 public void addNeededStaticName( SESEandAgePair p ) {
249 needStaticNameInCode.add( p );
252 public Set<SESEandAgePair> getNeededStaticNames() {
253 return needStaticNameInCode;
256 public void addStaticInVarSrc( SESEandAgePair p ) {
257 staticInVarSrcs.add( p );
260 public Set<SESEandAgePair> getStaticInVarSrcs() {
261 return staticInVarSrcs;
264 public void addReadyInVar( TempDescriptor td ) {
265 readyInVars.add( td );
268 public Set<TempDescriptor> getReadyInVarSet() {
272 public void addStaticInVar( TempDescriptor td ) {
273 staticInVars.add( td );
276 public Set<TempDescriptor> getStaticInVarSet() {
280 public void putStaticInVar2src( TempDescriptor staticInVar,
281 VariableSourceToken vst ) {
282 staticInVar2src.put( staticInVar, vst );
285 public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
286 return staticInVar2src.get( staticInVar );
289 public void addDynamicInVar( TempDescriptor td ) {
290 dynamicInVars.add( td );
293 public Set<TempDescriptor> getDynamicInVarSet() {
294 return dynamicInVars;
297 public void addDynamicVar( TempDescriptor td ) {
298 dynamicVars.add( td );
301 public Set<TempDescriptor> getDynamicVarSet() {
305 public void mustTrackAtLeastAge( Integer age ) {
306 if( age > oldestAgeToTrack ) {
307 oldestAgeToTrack = new Integer( age );
311 public Integer getOldestAgeToTrack() {
312 return oldestAgeToTrack;
315 public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
316 public FlatMethod getfmEnclosing() { return fmEnclosing; }
318 public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
319 public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
321 public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
322 public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
324 public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
325 public FlatMethod getfmBogus() { return fmBogus; }
327 public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
328 public MethodDescriptor getmdBogus() { return mdBogus; }
330 public String getSESEmethodName() {
331 assert cdEnclosing != null;
332 assert mdBogus != null;
335 cdEnclosing.getSafeSymbol()+
336 mdBogus.getSafeSymbol()+
338 mdBogus.getSafeMethodDescriptor();
341 public String getSESErecordName() {
342 assert cdEnclosing != null;
343 assert mdBogus != null;
347 cdEnclosing.getSafeSymbol()+
348 mdBogus.getSafeSymbol()+
350 mdBogus.getSafeMethodDescriptor()+
354 public void setCallerSESEplaceholder() {
355 isCallerSESEplaceholder = true;
358 public boolean getIsCallerSESEplaceholder() {
359 return isCallerSESEplaceholder;
362 public void addSESEChildren(FlatSESEEnterNode child){
363 seseChildren.add(child);
366 public void addSESEChildren(Set<FlatSESEEnterNode> children){
368 seseChildren.addAll(children);
371 public Set<FlatSESEEnterNode> getSESEChildren(){
375 public boolean equals( Object o ) {
380 if( !(o instanceof FlatSESEEnterNode) ) {
384 FlatSESEEnterNode fsen = (FlatSESEEnterNode) o;
385 return id == fsen.id;
388 public int hashCode() {
392 public void writeEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn, boolean strongUpdate){
393 seseEffectsSet.addWritingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
395 seseEffectsSet.addStrongUpdateVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
399 public void readEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn ){
400 seseEffectsSet.addReadingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
403 public SESEEffectsSet getSeseEffectsSet(){
404 return seseEffectsSet;
408 public void setFirstDepRecField( String field ) {
409 firstDepRecField = field;
412 public String getFirstDepRecField() {
413 return firstDepRecField;
416 public void incNumDepRecs() {
420 public int getNumDepRecs() {
424 public Vector<TempDescriptor> getInVarsForDynamicCoarseConflictResolution() {
425 return inVarsForDynamicCoarseConflictResolution;
428 public void addInVarForDynamicCoarseConflictResolution(TempDescriptor inVar) {
429 if (!inVarsForDynamicCoarseConflictResolution.contains(inVar))
430 inVarsForDynamicCoarseConflictResolution.add(inVar);
433 public void setIsLeafSESE( boolean isLeaf ) {
435 isLeafSESE = ISLEAF_TRUE;
437 isLeafSESE = ISLEAF_FALSE;
441 public boolean getIsLeafSESE() {
442 if( isLeafSESE == ISLEAF_UNINIT ) {
443 throw new Error( "isLeafSESE uninitialized" );
446 return isLeafSESE == ISLEAF_TRUE;
449 public Set<FlatSESEEnterNode> getSESEParent() {
453 public void addSESEParent(FlatSESEEnterNode seseParent) {
454 this.seseParent.add(seseParent);