hotspot/src/share/vm/opto/idealGraphPrinter.cpp
changeset 30591 b32fcc177417
parent 27147 ed83dc5777e6
child 33105 294e48b4f704
equal deleted inserted replaced
30589:4722e25bfd6d 30591:b32fcc177417
     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 
   356   _xml->flush();
   349   _xml->flush();
   357 }
   350 }
   358 
   351 
   359 // Print indent
   352 // Print indent
   360 void IdealGraphPrinter::print_indent() {
   353 void IdealGraphPrinter::print_indent() {
   361   tty->print_cr("printing ident %d", _depth);
   354   tty->print_cr("printing indent %d", _depth);
   362   for (int i = 0; i < _depth; i++) {
   355   for (int i = 0; i < _depth; i++) {
   363     _xml->print("%s", INDENT);
   356     _xml->print("%s", INDENT);
   364   }
   357   }
   365 }
   358 }
   366 
   359 
   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;
   740   return ideal_graph_level >= level;
   728   return ideal_graph_level >= level;
   741 }
   729 }
   742 
   730 
   743 extern const char *NodeClassNames[];
   731 extern const char *NodeClassNames[];
   744 
   732 
   745 outputStream *IdealGraphPrinter::output() {
       
   746   return _xml;
       
   747 }
       
   748 
       
   749 #endif
   733 #endif