comparison src/share/vm/opto/idealGraphPrinter.hpp @ 222:2a1a77d3458f

6718676: putback for 6604014 is incomplete Reviewed-by: kvn, jrose
author never
date Tue, 24 Jun 2008 16:00:14 -0700
parents a61af66fc99e
children c18cbe5936b8
comparison
equal deleted inserted replaced
221:1e026f8da827 222:2a1a77d3458f
80 static const char *BYTECODES_ELEMENT; 80 static const char *BYTECODES_ELEMENT;
81 static const char *METHOD_BCI_PROPERTY; 81 static const char *METHOD_BCI_PROPERTY;
82 static const char *METHOD_SHORT_NAME_PROPERTY; 82 static const char *METHOD_SHORT_NAME_PROPERTY;
83 static const char *ASSEMBLY_ELEMENT; 83 static const char *ASSEMBLY_ELEMENT;
84 84
85 class Property { 85 elapsedTimer _walk_time;
86 86 elapsedTimer _output_time;
87 private: 87 elapsedTimer _build_blocks_time;
88
89 const char *_name;
90 const char *_value;
91
92 public:
93
94 Property();
95 Property(const Property* p);
96 ~Property();
97 Property(const char *name, const char *value);
98 Property(const char *name, int value);
99 bool equals(Property* p);
100 void print(IdealGraphPrinter *printer);
101 void print_as_attribute(IdealGraphPrinter *printer);
102 bool is_null();
103 void clean();
104 const char *name();
105
106 static const char* dup(const char *str) {
107 char * copy = new char[strlen(str)+1];
108 strcpy(copy, str);
109 return copy;
110 }
111
112 };
113
114 class Properties {
115
116 private:
117
118 GrowableArray<Property *> *list;
119
120 public:
121
122 Properties();
123 ~Properties();
124 void add(Property *p);
125 void remove(const char *name);
126 bool equals(Properties* p);
127 void print(IdealGraphPrinter *printer);
128 void print_as_attributes(IdealGraphPrinter *printer);
129 void clean();
130
131 };
132
133
134 class Description {
135
136 private:
137
138 State _state;
139
140 public:
141
142 Description();
143
144 State state();
145 void set_state(State s);
146 void print(IdealGraphPrinter *printer);
147 virtual void print_changed(IdealGraphPrinter *printer) = 0;
148 virtual void print_removed(IdealGraphPrinter *printer) = 0;
149
150 };
151
152 class NodeDescription : public Description{
153
154 public:
155
156 static int count;
157
158 private:
159
160 GrowableArray<NodeDescription *> _succs;
161 int _block_index;
162 uintptr_t _id;
163 Properties _properties;
164 Node* _node;
165
166 public:
167
168 NodeDescription(Node* node);
169 ~NodeDescription();
170 Node* node();
171
172 // void set_node(Node* node);
173 GrowableArray<NodeDescription *>* succs();
174 void init_succs();
175 void clear_succs();
176 void add_succ(NodeDescription *desc);
177 int block_index();
178 void set_block_index(int i);
179 Properties* properties();
180 virtual void print_changed(IdealGraphPrinter *printer);
181 virtual void print_removed(IdealGraphPrinter *printer);
182 bool equals(NodeDescription *desc);
183 uint id();
184
185 };
186
187 class Block {
188
189 private:
190
191 NodeDescription *_start;
192 NodeDescription *_proj;
193 GrowableArray<int> _succs;
194 GrowableArray<NodeDescription *> _nodes;
195 GrowableArray<int> _dominates;
196 GrowableArray<int> _children;
197 int _semi;
198 int _parent;
199 GrowableArray<int> _pred;
200 GrowableArray<int> _bucket;
201 int _index;
202 int _dominator;
203 int _ancestor;
204 int _label;
205
206 public:
207
208 Block();
209 Block(int index);
210
211 void add_node(NodeDescription *n);
212 GrowableArray<NodeDescription *>* nodes();
213 GrowableArray<int>* children();
214 void add_child(int i);
215 void add_succ(int index);
216 GrowableArray<int>* succs();
217 GrowableArray<int>* dominates();
218 void add_dominates(int i);
219 NodeDescription *start();
220 NodeDescription *proj();
221 void set_start(NodeDescription *n);
222 void set_proj(NodeDescription *n);
223
224 int label();
225 void set_label(int i);
226 int ancestor();
227 void set_ancestor(int i);
228 int index();
229 int dominator();
230 void set_dominator(int i);
231 int parent();
232 void set_parent(int i);
233 int semi();
234 GrowableArray<int>* bucket();
235 void add_to_bucket(int i);
236 void clear_bucket();
237 GrowableArray<int>* pred();
238 void set_semi(int i);
239 void add_pred(int i);
240
241 };
242
243 class EdgeDescription : public Description {
244
245 private:
246
247 int _from;
248 int _to;
249 int _index;
250 public:
251
252 EdgeDescription(int from, int to, int index);
253 ~EdgeDescription();
254
255 virtual void print_changed(IdealGraphPrinter *printer);
256 virtual void print_removed(IdealGraphPrinter *printer);
257 bool equals(EdgeDescription *desc);
258 int from();
259 int to();
260 };
261
262 88
263 static int _file_count; 89 static int _file_count;
264 networkStream *_stream; 90 networkStream *_stream;
91 xmlStream *_xml;
265 outputStream *_output; 92 outputStream *_output;
266 ciMethod *_current_method; 93 ciMethod *_current_method;
267 GrowableArray<NodeDescription *> _nodes;
268 GrowableArray<EdgeDescription *> _edges;
269 int _depth; 94 int _depth;
270 Arena *_arena;
271 char buffer[128]; 95 char buffer[128];
272 bool _should_send_method; 96 bool _should_send_method;
273 PhaseChaitin* _chaitin; 97 PhaseChaitin* _chaitin;
274 bool _clear_nodes;
275 Matcher* _matcher;
276 bool _traverse_outs; 98 bool _traverse_outs;
277 99 Compile *C;
278 void start_element_helper(const char *name, Properties *properties, bool endElement, bool print_indent = false, bool print_return = true);
279 NodeDescription *create_node_description(Node* node);
280 100
281 static void pre_node(Node* node, void *env); 101 static void pre_node(Node* node, void *env);
282 static void post_node(Node* node, void *env); 102 static void post_node(Node* node, void *env);
283 103
284 void schedule_latest(int **common_dominator, GrowableArray<Block>* blocks);
285 void build_common_dominator(int **common_dominator, int index, GrowableArray<Block>* blocks);
286 void compress(int index, GrowableArray<Block>* blocks);
287 int eval(int index, GrowableArray<Block>* blocks);
288 void link(int index1, int index2, GrowableArray<Block>* blocks);
289 void build_dominators(GrowableArray<Block>* blocks);
290 void build_blocks(Node *node);
291 void walk(Node *n);
292 void start_element(const char *name, Properties *properties = NULL, bool print_indent = false, bool print_return = true);
293 void simple_element(const char *name, Properties *properties = NULL, bool print_indent = false);
294 void end_element(const char *name, bool print_indent = false, bool print_return = true);
295 void print_edge(int from, int to, int index);
296 void print_indent(); 104 void print_indent();
297 void print_method(ciMethod *method, int bci, InlineTree *tree); 105 void print_method(ciMethod *method, int bci, InlineTree *tree);
298 void print_inline_tree(InlineTree *tree); 106 void print_inline_tree(InlineTree *tree);
299 void clear_nodes(); 107 void visit_node(Node *n, void *param);
300 108 void walk_nodes(Node *start, void *param);
109 void begin_elem(const char *s);
110 void end_elem();
111 void begin_head(const char *s);
112 void end_head();
113 void print_attr(const char *name, const char *val);
114 void print_attr(const char *name, intptr_t val);
115 void print_prop(const char *name, const char *val);
116 void print_prop(const char *name, int val);
117 void tail(const char *name);
118 void head(const char *name);
119 void text(const char *s);
120 intptr_t get_node_id(Node *n);
301 IdealGraphPrinter(); 121 IdealGraphPrinter();
302 ~IdealGraphPrinter(); 122 ~IdealGraphPrinter();
303 123
304 public: 124 public:
305 125
306 static void clean_up(); 126 static void clean_up();
307 static IdealGraphPrinter *printer(); 127 static IdealGraphPrinter *printer();
308 128
309 bool traverse_outs(); 129 bool traverse_outs();
310 void set_traverse_outs(bool b); 130 void set_traverse_outs(bool b);
311 void print_ifg(PhaseIFG* ifg);
312 outputStream *output(); 131 outputStream *output();
313 void print_inlining(Compile* compile); 132 void print_inlining(Compile* compile);
314 void begin_method(Compile* compile); 133 void begin_method(Compile* compile);
315 void end_method(); 134 void end_method();
316 void print_method(Compile* compile, const char *name, int level=1, bool clear_nodes = false); 135 void print_method(Compile* compile, const char *name, int level=1, bool clear_nodes = false);