labelindex = 0;
labelFlatNodes( fm );
+ // add method parameters to the list of heap regions
+ // and remember names for analysis
+ OwnershipGraph og = getGraphFromFlat( fm );
+ for( int i = 0; i < fm.numParameters(); ++i ) {
+ TempDescriptor tdParam = fm.getParameter( i );
+ og.newHeapRegion( tdParam );
+ og.addAnalysisRegion( tdParam );
+ }
+
String taskname = td.getSymbol();
analyzeFlatIRGraph( fm, taskname );
}
// get this node's ownership graph, or create a new one
OwnershipGraph og = getGraphFromFlat( fn );
- if( fn.kind() == FKind.FlatMethod ) {
- FlatMethod fmd = (FlatMethod) fn;
- // the FlatMethod is the top-level node, so generate
- // regions of the heap for each parameter to start the
- // analysis
- for( int i = 0; i < fmd.numParameters(); ++i ) {
- TempDescriptor tdParam = fmd.getParameter( i );
- og.newHeapRegion( tdParam );
- }
- }
-
TempDescriptor src;
TempDescriptor dst;
FieldDescriptor fld;
+
switch(fn.kind()) {
case FKind.FlatMethod:
case FKind.FlatReturnNode:
og.writeGraph( makeNodeName( taskname, flatnodetolabel.get(fn), "Return" ) );
+ og.writeCondensedAnalysis( makeCondensedAnalysisName( taskname, flatnodetolabel.get(fn) ) );
break;
}
String s = String.format( "%05d", id );
return "task"+taskname+"_FN"+s+"_"+type;
}
+
+ private String makeCondensedAnalysisName( String taskname, Integer id ) {
+ return "task"+taskname+"_Ownership_from"+id;
+ }
}
protected int labelNodeIDs;
protected Hashtable<TempDescriptor, OwnershipLabelNode> td2ln;
+
+ protected Vector<TempDescriptor> analysisRegionLabels;
+ protected Hashtable<TempDescriptor, TempDescriptor> linkedRegions;
public OwnershipGraph() {
heapRegionNodeIDs = 0;
labelNodeIDs = 0;
td2ln = new Hashtable<TempDescriptor, OwnershipLabelNode>();
+
+ analysisRegionLabels = new Vector<TempDescriptor>();
+ linkedRegions = new Hashtable<TempDescriptor, TempDescriptor>();
}
public void assignTempToTemp( TempDescriptor src,
heapRoots.add( hrn );
}
+ public void addAnalysisRegion( TempDescriptor td ) {
+ analysisRegionLabels.add( td );
+ }
+
protected OwnershipHeapRegionNode allocate( TypeDescriptor typeDesc ) {
OwnershipHeapRegionNode hrn =
new OwnershipHeapRegionNode( heapRegionNodeIDs );
}
/*
- public void addEdge( TempDescriptor tu, TempDescriptor tv ) {
- OwnershipLabelNode nu = getOwnershipFromTemp( tu );
- OwnershipLabelNode nv = getOwnershipFromTemp( tv );
-
- nu.addOutEdge( nv );
- nv.addInEdge( nu );
- }
-
public OwnershipGraph copy() {
OwnershipGraph newog = new OwnershipGraph();
}
return newog;
- }
+ }
*/
-
-
+
public void writeGraph( String graphName ) throws java.io.IOException {
BufferedWriter bw = new BufferedWriter( new FileWriter( graphName+".dot" ) );
bw.write( "digraph "+graphName+" {\n" );
visitHeapNodes( bw, childhrn );
}
}
+
+ public void writeCondensedAnalysis( String graphName ) throws java.io.IOException {
+ BufferedWriter bw = new BufferedWriter( new FileWriter( graphName+".dot" ) );
+ bw.write( "graph "+graphName+" {\n" );
+
+ // find linked regions
+ for( int i = 0; i < analysisRegionLabels.size(); ++i ) {
+ TempDescriptor td = analysisRegionLabels.get( i );
+ bw.write( " "+td.getSymbol()+";\n" );
+
+ OwnershipLabelNode oln = getLabelNodeFromTemp( td );
+ OwnershipHeapRegionNode hrn = oln.getOwnershipHeapRegionNode();
+ condensedVisitHeapNodes( bw, hrn, td );
+ }
+
+ // write out linked regions
+ Set s = linkedRegions.entrySet();
+ Iterator lri = s.iterator();
+ while( lri.hasNext() ) {
+ Map.Entry me = (Map.Entry) lri.next();
+ TempDescriptor t1 = (TempDescriptor) me.getKey();
+ TempDescriptor t2 = (TempDescriptor) me.getValue();
+ bw.write( " "+t1.getSymbol()+" -- "+t2.getSymbol()+";\n" );
+ }
+
+ bw.write( "}\n" );
+ bw.close();
+ }
+
+ protected void condensedVisitHeapNodes( BufferedWriter bw,
+ OwnershipHeapRegionNode hrn,
+ TempDescriptor td ) throws java.io.IOException {
+ hrn.addAnalysisRegionAlias( td );
+
+ Iterator fitr = hrn.getFieldIterator();
+ while( fitr.hasNext() ) {
+ Map.Entry me = (Map.Entry) fitr.next();
+ FieldDescriptor fd = (FieldDescriptor) me.getKey();
+ OwnershipHeapRegionNode childhrn = (OwnershipHeapRegionNode) me.getValue();
+
+ Vector<TempDescriptor> aliases = childhrn.getAnalysisRegionAliases();
+ for( int i = 0; i < aliases.size(); ++i ) {
+ TempDescriptor tdn = aliases.get( i );
+
+ // only add this alias if it has not been already added
+ TempDescriptor tdAlias = null;
+ if( linkedRegions.containsKey( td ) ) {
+ tdAlias = linkedRegions.get( td );
+ }
+
+ TempDescriptor tdnAlias = null;
+ if( linkedRegions.containsKey( tdn ) ) {
+ tdnAlias = linkedRegions.get( tdn );
+ }
+
+ if( tdn != tdAlias && td != tdnAlias ) {
+ linkedRegions.put( td, tdn );
+ }
+ }
+
+ condensedVisitHeapNodes( bw, childhrn, td );
+ }
+ }
}
protected int id;
protected Hashtable<FieldDescriptor, OwnershipHeapRegionNode> fields;
+ protected Vector<TempDescriptor> analysisRegionAliases;
public OwnershipHeapRegionNode( int id ) {
this.id = id;
fields = new Hashtable<FieldDescriptor, OwnershipHeapRegionNode>();
+ analysisRegionAliases = new Vector<TempDescriptor>();
}
public void setField( FieldDescriptor fd,
public String toString() {
return "OHRN"+getIDString();
}
-}
\ No newline at end of file
+
+ public void addAnalysisRegionAlias( TempDescriptor td ) {
+ analysisRegionAliases.add( td );
+ }
+
+ public Vector<TempDescriptor> getAnalysisRegionAliases() {
+ return analysisRegionAliases;
+ }
+}