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 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;
36 protected Set<FlatSESEEnterNode> children;
38 protected Set<TempDescriptor> inVars;
39 protected Set<TempDescriptor> outVars;
41 protected Set<SESEandAgePair> needStaticNameInCode;
43 protected Set<SESEandAgePair> staticInVarSrcs;
45 protected Set<TempDescriptor> readyInVars;
46 protected Set<TempDescriptor> staticInVars;
47 protected Set<TempDescriptor> dynamicInVars;
49 protected Set<TempDescriptor> dynamicVars;
51 protected Hashtable<TempDescriptor, VariableSourceToken> staticInVar2src;
53 private SESEEffectsSet seseEffectsSet;
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;
60 // scope info for this SESE
61 protected FlatMethod fmEnclosing;
62 protected MethodDescriptor mdEnclosing;
63 protected ClassDescriptor cdEnclosing;
65 // structures that allow SESE to appear as
66 // a normal method to code generation
67 protected FlatMethod fmBogus;
68 protected MethodDescriptor mdBogus;
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;
78 public FlatSESEEnterNode( SESENode sn ) {
79 this.id = identifier++;
82 oldestAgeToTrack = new Integer( 0 );
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>();
94 inVarsForDynamicCoarseConflictResolution = new HashSet<TempDescriptor>();
96 staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
98 seseEffectsSet = new SESEEffectsSet();
104 isCallerSESEplaceholder = false;
106 isLeafSESE = ISLEAF_UNINIT;
108 firstDepRecField = null;
112 public void rewriteUse() {
115 public void rewriteDef() {
118 public void setFlatExit( FlatSESEExitNode fsexn ) {
122 public FlatSESEExitNode getFlatExit() {
127 return FKind.FlatSESEEnterNode;
130 public SESENode getTreeNode() {
134 public int getIdentifier() {
138 public String getPrettyIdentifier() {
139 if( treeNode.getID() != null ) {
140 return treeNode.getID();
145 public String toString() {
146 return "sese "+getPrettyIdentifier()+" enter";
149 public String toPrettyString() {
150 return "sese "+getPrettyIdentifier()+getIdentifier();
153 public void setParent( FlatSESEEnterNode parent ) {
154 this.parent = parent;
157 public FlatSESEEnterNode getParent() {
161 public void addChild( FlatSESEEnterNode child ) {
162 children.add( child );
165 public Set<FlatSESEEnterNode> getChildren() {
169 public void addInVar( TempDescriptor td ) {
173 public void addOutVar( TempDescriptor td ) {
177 public void addInVarSet( Set<TempDescriptor> s ) {
181 public void addOutVarSet( Set<TempDescriptor> s ) {
185 public Set<TempDescriptor> getInVarSet() {
189 Vector<TempDescriptor> vecinVars;
191 HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
192 paramset.addAll(inVars);
193 paramset.addAll(outVars);
194 vecinVars=new Vector<TempDescriptor>();
195 vecinVars.addAll(paramset);
198 public TempDescriptor getParameter(int i) {
199 if (vecinVars==null) {
202 return vecinVars.get(i);
205 public int numParameters() {
206 if (vecinVars==null) {
209 return vecinVars.size();
212 public Set<FlatNode> getNodeSet() {
213 HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
214 HashSet<FlatNode> visited=new HashSet<FlatNode>();
216 while(!tovisit.isEmpty()) {
217 FlatNode fn=tovisit.iterator().next();
222 for(int i=0; i<fn.numNext(); i++) {
223 FlatNode nn=fn.getNext(i);
224 if (!visited.contains(nn))
232 public Set<TempDescriptor> getOutVarSet() {
236 public void addNeededStaticName( SESEandAgePair p ) {
237 needStaticNameInCode.add( p );
240 public Set<SESEandAgePair> getNeededStaticNames() {
241 return needStaticNameInCode;
244 public void addStaticInVarSrc( SESEandAgePair p ) {
245 staticInVarSrcs.add( p );
248 public Set<SESEandAgePair> getStaticInVarSrcs() {
249 return staticInVarSrcs;
252 public void addReadyInVar( TempDescriptor td ) {
253 readyInVars.add( td );
256 public Set<TempDescriptor> getReadyInVarSet() {
260 public void addStaticInVar( TempDescriptor td ) {
261 staticInVars.add( td );
264 public Set<TempDescriptor> getStaticInVarSet() {
268 public void putStaticInVar2src( TempDescriptor staticInVar,
269 VariableSourceToken vst ) {
270 staticInVar2src.put( staticInVar, vst );
273 public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
274 return staticInVar2src.get( staticInVar );
277 public void addDynamicInVar( TempDescriptor td ) {
278 dynamicInVars.add( td );
281 public Set<TempDescriptor> getDynamicInVarSet() {
282 return dynamicInVars;
285 public void addDynamicVar( TempDescriptor td ) {
286 dynamicVars.add( td );
289 public Set<TempDescriptor> getDynamicVarSet() {
293 public void mustTrackAtLeastAge( Integer age ) {
294 if( age > oldestAgeToTrack ) {
295 oldestAgeToTrack = new Integer( age );
299 public Integer getOldestAgeToTrack() {
300 return oldestAgeToTrack;
303 public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
304 public FlatMethod getfmEnclosing() { return fmEnclosing; }
306 public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
307 public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
309 public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
310 public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
312 public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
313 public FlatMethod getfmBogus() { return fmBogus; }
315 public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
316 public MethodDescriptor getmdBogus() { return mdBogus; }
318 public String getSESEmethodName() {
319 assert cdEnclosing != null;
320 assert mdBogus != null;
323 cdEnclosing.getSafeSymbol()+
324 mdBogus.getSafeSymbol()+
326 mdBogus.getSafeMethodDescriptor();
329 public String getSESErecordName() {
330 assert cdEnclosing != null;
331 assert mdBogus != null;
335 cdEnclosing.getSafeSymbol()+
336 mdBogus.getSafeSymbol()+
338 mdBogus.getSafeMethodDescriptor()+
342 public void setCallerSESEplaceholder() {
343 isCallerSESEplaceholder = true;
346 public boolean getIsCallerSESEplaceholder() {
347 return isCallerSESEplaceholder;
351 public boolean equals( Object o ) {
356 if( !(o instanceof FlatSESEEnterNode) ) {
360 FlatSESEEnterNode fsen = (FlatSESEEnterNode) o;
361 return id == fsen.id;
364 public int hashCode() {
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()));
371 seseEffectsSet.addStrongUpdateVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
375 public void readEffects(TempDescriptor td, String fd, TypeDescriptor type, HeapRegionNode hrn ){
376 seseEffectsSet.addReadingVar(td, new SESEEffectsKey(fd, type, hrn.getID(), hrn.getGloballyUniqueIdentifier()));
379 public SESEEffectsSet getSeseEffectsSet(){
380 return seseEffectsSet;
384 public void setFirstDepRecField( String field ) {
385 firstDepRecField = field;
388 public String getFirstDepRecField() {
389 return firstDepRecField;
392 public void incNumDepRecs() {
396 public int getNumDepRecs() {
400 public Set<TempDescriptor> getInVarsForDynamicCoarseConflictResolution() {
401 return inVarsForDynamicCoarseConflictResolution;
404 public void addInVarForDynamicCoarseConflictResolution(TempDescriptor inVar) {
405 inVarsForDynamicCoarseConflictResolution.add(inVar);
409 public void setIsLeafSESE( boolean isLeaf ) {
411 isLeafSESE = ISLEAF_TRUE;
413 isLeafSESE = ISLEAF_FALSE;
417 public boolean getIsLeafSESE() {
418 if( isLeafSESE == ISLEAF_UNINIT ) {
419 throw new Error( "isLeafSESE uninitialized" );
422 return isLeafSESE == ISLEAF_TRUE;