Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/MLRISC/IR/mlrisc-cfg.sig
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/IR/mlrisc-cfg.sig

Parent Directory Parent Directory | Revision Log Revision Log


Revision 245 - (view) (download) (as text)
Original Path: sml/branches/SMLNJ/src/MLRISC/IR/mlrisc-cfg.sig

1 : monnier 245 (*
2 :     * Control flow graph data structure.
3 :     *)
4 :    
5 :     signature CONTROL_FLOW_GRAPH =
6 :     sig
7 :    
8 :     structure I : INSTRUCTIONS
9 :     structure B : BLOCK_NAMES
10 :     structure P : PSEUDO_OPS
11 :     structure C : CELLS
12 :     structure W : FIXED_POINT
13 :     sharing I.C = C
14 :    
15 :     type weight = W.fixed_point
16 :    
17 :     datatype block_kind =
18 :     START (* entry node *)
19 :     | STOP (* exit node *)
20 :     | FUNCTION_ENTRY (* for SSA transformations *)
21 :     | NORMAL (* normal node *)
22 :     | HYPERBLOCK (* hyperblock *)
23 :    
24 :     and data = LABEL of Label.label
25 :     | PSEUDO of P.pseudo_op
26 :    
27 :     and block =
28 :     BLOCK of
29 :     { id : int, (* block id *)
30 :     kind : block_kind, (* block kind *)
31 :     name : B.name, (* block name *)
32 :     freq : weight ref, (* execution frequency *)
33 :     data : data list ref, (* data preceeding block *)
34 :     labels : Label.label list ref, (* labels on blocks *)
35 :     insns : I.instruction list ref, (* in rev order *)
36 :     annotations : Annotations.annotations ref (* annotations *)
37 :     }
38 :    
39 :    
40 :     and edge_kind = ENTRY (* entry edge *)
41 :     | EXIT (* exit edge *)
42 :     | JUMP (* unconditional jump *)
43 :     | FALLSTHRU (* falls through to next block *)
44 :     | BRANCH of bool (* branch *)
45 :     | SWITCH of int (* computed goto *)
46 :     | SIDEEXIT of int (* the ith side exit in a hyperblock *)
47 :    
48 :     and edge_info = EDGE of { k : edge_kind, (* edge kind *)
49 :     w : weight ref, (* edge freq *)
50 :     a : Annotations.annotations ref (* annotations *)
51 :     }
52 :    
53 :     type edge = edge_info Graph.edge
54 :     type node = block Graph.node
55 :    
56 :     datatype info =
57 :     INFO of { regmap : C.regmap,
58 :     annotations : Annotations.annotations ref,
59 :     firstBlock : int ref,
60 :     reorder : bool ref
61 :     }
62 :    
63 :     type cfg = (block,edge_info,info) Graph.graph
64 :    
65 :     (*========================================================================
66 :     *
67 :     * Various kinds of annotations on basic blocks
68 :     *
69 :     *========================================================================*)
70 :     exception LIVEOUT of C.cellset (* escaping live out information *)
71 :     exception CHANGED of unit -> unit
72 :     exception CHANGEDONCE of unit -> unit
73 :    
74 :     (*========================================================================
75 :     *
76 :     * Methods for manipulating basic blocks
77 :     *
78 :     *========================================================================*)
79 :     val newBlock : int * B.name -> block (* empty *)
80 :     val newStart : int -> block (* start node *)
81 :     val newStop : int -> block (* stop node *)
82 :     val newFunctionEntry : int -> block (* fun entry node *)
83 :     val copyBlock : int * block -> block (* copy a block *)
84 :     val defineLabel : block -> Label.label (* define a label *)
85 :     val emit : C.regmap -> block -> unit (* emit assembly *)
86 :     val show_block : C.regmap -> block -> string
87 :    
88 :     (*========================================================================
89 :     *
90 :     * Methods for manipulating CFG
91 :     *
92 :     *========================================================================*)
93 :     val cfg : info -> cfg (* create a new cfg *)
94 :     val new : C.regmap -> cfg (* create a new cfg *)
95 :     val subgraph : cfg -> cfg (* mark as subgraph *)
96 :     val init : cfg -> unit (* add start/stop nodes *)
97 :     val changed : cfg -> unit (* mark cfg as changed *)
98 :    
99 :     val regmap : cfg -> C.regmap
100 :     val reglookup : cfg -> C.register -> C.register
101 :     val liveOut : block -> C.cellset
102 :     val fallsThruFrom : cfg * Graph.node_id -> Graph.node_id option
103 :     val fallsThruTo : cfg * Graph.node_id -> Graph.node_id option
104 :     val removeEdge : cfg -> edge -> unit
105 :    
106 :     (*========================================================================
107 :     *
108 :     * For viewing
109 :     *
110 :     *========================================================================*)
111 :     val viewStyle : cfg -> (block,edge_info,info) GraphLayout.style
112 :     val viewLayout : cfg -> GraphLayout.layout
113 :     val headerText : block -> string
114 :     val footerText : block -> string
115 :     val subgraphLayout : { cfg : cfg, subgraph : cfg } -> GraphLayout.layout
116 :    
117 :     (*========================================================================
118 :     *
119 :     * Miscellaneous stuff
120 :     *
121 :     *========================================================================*)
122 :     val cdgEdge : edge_info -> bool (* for building a CDG *)
123 :    
124 :     end
125 :    
126 :     (*
127 :     * $Log$
128 :     *)
129 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0