2 import IR.MethodDescriptor;
3 import IR.TaskDescriptor;
6 public class FlatMethod extends FlatNode {
7 MethodDescriptor method;
11 Hashtable tagtointmap;
14 public FlatMethod(MethodDescriptor md, FlatExit fe) {
17 parameterTemps=new Vector();
18 tagTemps=new Vector();
19 tagtointmap=new Hashtable();
23 FlatMethod(TaskDescriptor td, FlatExit fe) {
26 parameterTemps=new Vector();
27 tagTemps=new Vector();
28 tagtointmap=new Hashtable();
32 public String toString() {
33 String ret = "FlatMethod_";
34 if( method != null ) {
35 ret += method.toString();
37 ret += task.toString();
41 for(int i=0;i<numParameters();i++) {
52 public MethodDescriptor getMethod() {
56 public TaskDescriptor getTask() {
61 return FKind.FlatMethod;
64 public void addParameterTemp(TempDescriptor t) {
65 parameterTemps.add(t);
68 public int numParameters() {
69 return parameterTemps.size();
72 public void addTagTemp(TempDescriptor t) {
73 tagtointmap.put(t, new Integer(tagTemps.size()));
77 public int getTagInt(TempDescriptor t) {
78 return ((Integer)tagtointmap.get(t)).intValue();
81 public int numTags() {
82 return tagTemps.size();
85 public TempDescriptor getTag(int i) {
86 return (TempDescriptor) tagTemps.get(i);
89 public TempDescriptor getParameter(int i) {
90 return (TempDescriptor) parameterTemps.get(i);
93 public FlatExit getFlatExit() {
98 Set<FlatNode> set=getNodeSet();
99 for(Iterator<FlatNode> setit=set.iterator();setit.hasNext();) {
100 FlatNode fn=setit.next();
101 for(int i=0;i<fn.numPrev();i++) {
102 FlatNode fnprev=fn.getPrev(i);
103 if (!set.contains(fnprev)) {
104 System.out.println(fn+" has unreachable parent:"+i+" "+fnprev);
105 System.out.println(printMethod());
113 /** This method returns a set of the nodes in this flat representation */
115 public Set<FlatNode> getNodeSet() {
116 HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
117 HashSet<FlatNode> visited=new HashSet<FlatNode>();
119 while(!tovisit.isEmpty()) {
120 FlatNode fn=tovisit.iterator().next();
123 for(int i=0; i<fn.numNext(); i++) {
124 FlatNode nn=fn.getNext(i);
127 if (!visited.contains(nn))
134 public String printMethod() {
135 return printMethod(null);
138 /** This method returns a string that is a human readable
139 * representation of this method. */
141 public String printMethod(Hashtable map) {
142 String st=method+" {\n";
143 HashSet tovisit=new HashSet();
144 HashSet visited=new HashSet();
146 Hashtable nodetolabel=new Hashtable();
148 FlatNode current_node=null;
150 //Node needs a label if it is
151 while(!tovisit.isEmpty()) {
152 FlatNode fn=(FlatNode)tovisit.iterator().next();
156 for(int i=0; i<fn.numNext(); i++) {
157 FlatNode nn=fn.getNext(i);
160 nodetolabel.put(nn,new Integer(labelindex++));
162 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
166 nodetolabel.put(nn,new Integer(labelindex++));
171 //Do the actual printing
172 tovisit=new HashSet();
173 visited=new HashSet();
175 while(current_node!=null||!tovisit.isEmpty()) {
176 if (current_node==null) {
177 current_node=(FlatNode)tovisit.iterator().next();
178 tovisit.remove(current_node);
180 if (tovisit.contains(current_node))
181 tovisit.remove(current_node);
183 visited.add(current_node);
184 if (nodetolabel.containsKey(current_node)) {
185 st+="L"+nodetolabel.get(current_node)+":\n";
186 for(int i=0;i<current_node.numPrev();i++) {
187 st+="i="+i+" "+current_node.getPrev(i);
191 if (current_node.numNext()==0) {
193 st+=" "+current_node.toString()+"\n";
195 st+=" "+current_node.toString()+"["+map.get(current_node)+"]\n";
197 } else if(current_node.numNext()==1) {
199 st+=" "+current_node.toString()+"\n";
201 st+=" "+current_node.toString()+"["+map.get(current_node)+"]\n";
202 FlatNode nextnode=current_node.getNext(0);
203 if (visited.contains(nextnode)) {
204 st+="goto L"+nodetolabel.get(nextnode)+"\n";
207 current_node=nextnode;
208 } else if (current_node.numNext()==2) {
210 st+=" "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
211 if (!visited.contains(current_node.getNext(1)))
212 tovisit.add(current_node.getNext(1));
213 if (visited.contains(current_node.getNext(0))) {
214 st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
217 current_node=current_node.getNext(0);
218 } else throw new Error();
223 public TempDescriptor [] writesTemps() {
224 return (TempDescriptor[])parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);