1 cananian 1.1.2.2 package harpoon.Backend.CSAHack.FlowGraph;
 2 cananian 1.1.2.2 
 3 cananian 1.1.2.2 import harpoon.Temp.TempList;
 4 cananian 1.1.2.2 import harpoon.Temp.Temp;
 5 cananian 1.1.2.2 import harpoon.Backend.CSAHack.Graph.NodeList;
 6 cananian 1.1.2.2 import harpoon.Backend.CSAHack.Graph.Node;
 7 cananian 1.1.2.1 
 8 cananian 1.1.2.1 /**
 9 cananian 1.1.2.1  * A control flow graph is a directed graph in which each edge
10 cananian 1.1.2.1  * indicates a possible flow of control.  Also, each node in
11 cananian 1.1.2.1  * the graph defines a set of temporaries; each node uses a set of
12 cananian 1.1.2.1  * temporaries; and each node is, or is not, a <strong>move</strong>
13 cananian 1.1.2.1  * instruction.
14 cananian 1.1.2.1  *
15 cananian 1.1.2.1  * @see AssemFlowGraph
16 cananian 1.1.2.1  */
17 cananian 1.1.2.1 
18 cananian 1.1.2.2 public abstract class FlowGraph extends harpoon.Backend.CSAHack.Graph.Graph {
19 cananian 1.1.2.1  /**
20 cananian 1.1.2.1   * The set of temporaries defined by this instruction or block 
21 cananian 1.1.2.1   */
22 cananian 1.1.2.1         public abstract TempList def(Node node);
23 cananian 1.1.2.1 
24 cananian 1.1.2.1  /**
25 cananian 1.1.2.1   * The set of temporaries used by this instruction or block 
26 cananian 1.1.2.1   */
27 cananian 1.1.2.1         public abstract TempList use(Node node);
28 cananian 1.1.2.1 
29 cananian 1.1.2.1  /**
30 cananian 1.1.2.1   * True if this node represents a <strong>move</strong> instruction,
31 cananian 1.1.2.1   * i.e. one that can be deleted if def=use. 
32 cananian 1.1.2.1   */
33 cananian 1.1.2.1         public abstract boolean isMove(Node node);
34 cananian 1.1.2.1 
35 cananian 1.1.2.1  /**
36 cananian 1.1.2.1   * Print a human-readable dump for debugging.
37 cananian 1.1.2.1   */
38 cananian 1.1.2.1      public void show(java.io.PrintStream out) {
39 cananian 1.1.2.1         for (NodeList p=nodes(); p!=null; p=p.tail) {
40 cananian 1.1.2.1           Node n = p.head;
41 cananian 1.1.2.1           out.print(n.toString());
42 cananian 1.1.2.1           out.print(": ");
43 cananian 1.1.2.1           for(TempList q=def(n); q!=null; q=q.tail) {
44 cananian 1.1.2.1              out.print(q.head.toString());
45 cananian 1.1.2.1              out.print(" ");
46 cananian 1.1.2.1           }
47 cananian 1.1.2.1           out.print(isMove(n) ? "<= " : "<- ");
48 cananian 1.1.2.1           for(TempList q=use(n); q!=null; q=q.tail) {
49 cananian 1.1.2.1              out.print(q.head.toString());
50 cananian 1.1.2.1              out.print(" ");
51 cananian 1.1.2.1           }
52 cananian 1.1.2.1           out.print("; goto ");
53 cananian 1.1.2.1           for(NodeList q=n.succ(); q!=null; q=q.tail) {
54 cananian 1.1.2.1              out.print(q.head.toString());
55 cananian 1.1.2.1              out.print(" ");
56 cananian 1.1.2.1           }
57 cananian 1.1.2.1           out.println();
58 cananian 1.1.2.1         }
59 cananian 1.1.2.1      }
60 cananian 1.1.2.1 
61 cananian 1.2     }