1 /* |
1 /* |
2 * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
56 const char *IdealGraphPrinter::TO_PROPERTY = "to"; |
56 const char *IdealGraphPrinter::TO_PROPERTY = "to"; |
57 const char *IdealGraphPrinter::PROPERTY_NAME_PROPERTY = "name"; |
57 const char *IdealGraphPrinter::PROPERTY_NAME_PROPERTY = "name"; |
58 const char *IdealGraphPrinter::GRAPH_NAME_PROPERTY = "name"; |
58 const char *IdealGraphPrinter::GRAPH_NAME_PROPERTY = "name"; |
59 const char *IdealGraphPrinter::INDEX_PROPERTY = "index"; |
59 const char *IdealGraphPrinter::INDEX_PROPERTY = "index"; |
60 const char *IdealGraphPrinter::METHOD_ELEMENT = "method"; |
60 const char *IdealGraphPrinter::METHOD_ELEMENT = "method"; |
61 const char *IdealGraphPrinter::INLINE_ELEMENT = "inline"; |
61 const char *IdealGraphPrinter::INLINE_ELEMENT = "inlined"; |
62 const char *IdealGraphPrinter::BYTECODES_ELEMENT = "bytecodes"; |
62 const char *IdealGraphPrinter::BYTECODES_ELEMENT = "bytecodes"; |
63 const char *IdealGraphPrinter::METHOD_BCI_PROPERTY = "bci"; |
63 const char *IdealGraphPrinter::METHOD_BCI_PROPERTY = "bci"; |
64 const char *IdealGraphPrinter::METHOD_SHORT_NAME_PROPERTY = "shortName"; |
64 const char *IdealGraphPrinter::METHOD_SHORT_NAME_PROPERTY = "shortName"; |
65 const char *IdealGraphPrinter::CONTROL_FLOW_ELEMENT = "controlFlow"; |
65 const char *IdealGraphPrinter::CONTROL_FLOW_ELEMENT = "controlFlow"; |
66 const char *IdealGraphPrinter::BLOCK_NAME_PROPERTY = "name"; |
66 const char *IdealGraphPrinter::BLOCK_NAME_PROPERTY = "name"; |
234 void IdealGraphPrinter::text(const char *s) { |
234 void IdealGraphPrinter::text(const char *s) { |
235 _xml->text("%s", s); |
235 _xml->text("%s", s); |
236 } |
236 } |
237 |
237 |
238 void IdealGraphPrinter::print_prop(const char *name, int val) { |
238 void IdealGraphPrinter::print_prop(const char *name, int val) { |
239 |
|
240 stringStream stream; |
239 stringStream stream; |
241 stream.print("%d", val); |
240 stream.print("%d", val); |
242 print_prop(name, stream.as_string()); |
241 print_prop(name, stream.as_string()); |
243 } |
242 } |
244 |
243 |
264 print_attr(METHOD_BCI_PROPERTY, bci); |
263 print_attr(METHOD_BCI_PROPERTY, bci); |
265 |
264 |
266 end_head(); |
265 end_head(); |
267 |
266 |
268 head(BYTECODES_ELEMENT); |
267 head(BYTECODES_ELEMENT); |
269 output()->print_cr("<![CDATA["); |
268 _xml->print_cr("<![CDATA["); |
270 method->print_codes_on(output()); |
269 method->print_codes_on(_xml); |
271 output()->print_cr("]]>"); |
270 _xml->print_cr("]]>"); |
272 tail(BYTECODES_ELEMENT); |
271 tail(BYTECODES_ELEMENT); |
273 |
272 |
274 head(INLINE_ELEMENT); |
273 if (tree != NULL && tree->subtrees().length() > 0) { |
275 if (tree != NULL) { |
274 head(INLINE_ELEMENT); |
276 GrowableArray<InlineTree *> subtrees = tree->subtrees(); |
275 GrowableArray<InlineTree *> subtrees = tree->subtrees(); |
277 for (int i = 0; i < subtrees.length(); i++) { |
276 for (int i = 0; i < subtrees.length(); i++) { |
278 print_inline_tree(subtrees.at(i)); |
277 print_inline_tree(subtrees.at(i)); |
279 } |
278 } |
280 } |
279 tail(INLINE_ELEMENT); |
281 tail(INLINE_ELEMENT); |
280 } |
282 |
281 |
283 tail(METHOD_ELEMENT); |
282 tail(METHOD_ELEMENT); |
284 output()->flush(); |
283 _xml->flush(); |
285 } |
284 } |
286 |
285 |
287 void IdealGraphPrinter::print_inline_tree(InlineTree *tree) { |
286 void IdealGraphPrinter::print_inline_tree(InlineTree *tree) { |
288 |
287 |
289 if (tree == NULL) return; |
288 if (tree == NULL) return; |
332 print_prop(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE); |
331 print_prop(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE); |
333 } |
332 } |
334 |
333 |
335 tail(PROPERTIES_ELEMENT); |
334 tail(PROPERTIES_ELEMENT); |
336 |
335 |
337 if (_stream) { |
336 _should_send_method = true; |
338 char answer = 0; |
|
339 _xml->flush(); |
|
340 int result = _stream->read(&answer, 1); |
|
341 _should_send_method = (answer == 'y'); |
|
342 } |
|
343 |
|
344 this->_current_method = method; |
337 this->_current_method = method; |
345 |
338 |
346 _xml->flush(); |
339 _xml->flush(); |
347 } |
340 } |
348 |
341 |
370 |
363 |
371 void IdealGraphPrinter::set_traverse_outs(bool b) { |
364 void IdealGraphPrinter::set_traverse_outs(bool b) { |
372 _traverse_outs = b; |
365 _traverse_outs = b; |
373 } |
366 } |
374 |
367 |
375 intptr_t IdealGraphPrinter::get_node_id(Node *n) { |
|
376 return (intptr_t)(n); |
|
377 } |
|
378 |
|
379 void IdealGraphPrinter::visit_node(Node *n, bool edges, VectorSet* temp_set) { |
368 void IdealGraphPrinter::visit_node(Node *n, bool edges, VectorSet* temp_set) { |
380 |
369 |
381 if (edges) { |
370 if (edges) { |
382 |
371 |
383 // Output edge |
372 // Output edge |
384 intptr_t dest_id = get_node_id(n); |
373 node_idx_t dest_id = n->_idx; |
385 for ( uint i = 0; i < n->len(); i++ ) { |
374 for ( uint i = 0; i < n->len(); i++ ) { |
386 if ( n->in(i) ) { |
375 if ( n->in(i) ) { |
387 Node *source = n->in(i); |
376 Node *source = n->in(i); |
388 begin_elem(EDGE_ELEMENT); |
377 begin_elem(EDGE_ELEMENT); |
389 intptr_t source_id = get_node_id(source); |
378 print_attr(FROM_PROPERTY, source->_idx); |
390 print_attr(FROM_PROPERTY, source_id); |
|
391 print_attr(TO_PROPERTY, dest_id); |
379 print_attr(TO_PROPERTY, dest_id); |
392 print_attr(INDEX_PROPERTY, i); |
380 print_attr(INDEX_PROPERTY, i); |
393 end_elem(); |
381 end_elem(); |
394 } |
382 } |
395 } |
383 } |
396 |
384 |
397 } else { |
385 } else { |
398 |
386 |
399 // Output node |
387 // Output node |
400 begin_head(NODE_ELEMENT); |
388 begin_head(NODE_ELEMENT); |
401 print_attr(NODE_ID_PROPERTY, get_node_id(n)); |
389 print_attr(NODE_ID_PROPERTY, n->_idx); |
402 end_head(); |
390 end_head(); |
403 |
391 |
404 head(PROPERTIES_ELEMENT); |
392 head(PROPERTIES_ELEMENT); |
405 |
393 |
406 Node *node = n; |
394 Node *node = n; |
718 tail(SUCCESSORS_ELEMENT); |
706 tail(SUCCESSORS_ELEMENT); |
719 |
707 |
720 head(NODES_ELEMENT); |
708 head(NODES_ELEMENT); |
721 for (uint s = 0; s < block->number_of_nodes(); s++) { |
709 for (uint s = 0; s < block->number_of_nodes(); s++) { |
722 begin_elem(NODE_ELEMENT); |
710 begin_elem(NODE_ELEMENT); |
723 print_attr(NODE_ID_PROPERTY, get_node_id(block->get_node(s))); |
711 print_attr(NODE_ID_PROPERTY, block->get_node(s)->_idx); |
724 end_elem(); |
712 end_elem(); |
725 } |
713 } |
726 tail(NODES_ELEMENT); |
714 tail(NODES_ELEMENT); |
727 |
715 |
728 tail(BLOCK_ELEMENT); |
716 tail(BLOCK_ELEMENT); |
729 } |
717 } |
730 tail(CONTROL_FLOW_ELEMENT); |
718 tail(CONTROL_FLOW_ELEMENT); |
731 } |
719 } |
732 tail(GRAPH_ELEMENT); |
720 tail(GRAPH_ELEMENT); |
733 output()->flush(); |
721 _xml->flush(); |
734 } |
722 } |
735 |
723 |
736 // Should method be printed? |
724 // Should method be printed? |
737 bool IdealGraphPrinter::should_print(ciMethod* method, int level) { |
725 bool IdealGraphPrinter::should_print(ciMethod* method, int level) { |
738 intx ideal_graph_level = PrintIdealGraphLevel; |
726 intx ideal_graph_level = PrintIdealGraphLevel; |