idealGraphPrinter.hpp revision 0:a61af66fc99e
1/* 2 * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 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 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 20 * CA 95054 USA or visit www.sun.com if you need additional information or 21 * have any questions. 22 * 23 */ 24 25#ifndef PRODUCT 26 27class Compile; 28class PhaseIFG; 29class PhaseChaitin; 30class Matcher; 31class Node; 32class InlineTree; 33class ciMethod; 34 35class IdealGraphPrinter 36{ 37private: 38 39 enum State 40 { 41 Invalid, 42 Valid, 43 New 44 }; 45 46private: 47 48 static const char *INDENT; 49 static const char *TOP_ELEMENT; 50 static const char *GROUP_ELEMENT; 51 static const char *GRAPH_ELEMENT; 52 static const char *PROPERTIES_ELEMENT; 53 static const char *EDGES_ELEMENT; 54 static const char *PROPERTY_ELEMENT; 55 static const char *EDGE_ELEMENT; 56 static const char *NODE_ELEMENT; 57 static const char *NODES_ELEMENT; 58 static const char *CONTROL_FLOW_ELEMENT; 59 static const char *REMOVE_EDGE_ELEMENT; 60 static const char *REMOVE_NODE_ELEMENT; 61 static const char *METHOD_NAME_PROPERTY; 62 static const char *BLOCK_NAME_PROPERTY; 63 static const char *BLOCK_DOMINATOR_PROPERTY; 64 static const char *BLOCK_ELEMENT; 65 static const char *SUCCESSORS_ELEMENT; 66 static const char *SUCCESSOR_ELEMENT; 67 static const char *METHOD_IS_PUBLIC_PROPERTY; 68 static const char *METHOD_IS_STATIC_PROPERTY; 69 static const char *TRUE_VALUE; 70 static const char *NODE_NAME_PROPERTY; 71 static const char *EDGE_NAME_PROPERTY; 72 static const char *NODE_ID_PROPERTY; 73 static const char *FROM_PROPERTY; 74 static const char *TO_PROPERTY; 75 static const char *PROPERTY_NAME_PROPERTY; 76 static const char *GRAPH_NAME_PROPERTY; 77 static const char *INDEX_PROPERTY; 78 static const char *METHOD_ELEMENT; 79 static const char *INLINE_ELEMENT; 80 static const char *BYTECODES_ELEMENT; 81 static const char *METHOD_BCI_PROPERTY; 82 static const char *METHOD_SHORT_NAME_PROPERTY; 83 static const char *ASSEMBLY_ELEMENT; 84 85 class Property { 86 87 private: 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 263 static int _file_count; 264 networkStream *_stream; 265 outputStream *_output; 266 ciMethod *_current_method; 267 GrowableArray<NodeDescription *> _nodes; 268 GrowableArray<EdgeDescription *> _edges; 269 int _depth; 270 Arena *_arena; 271 char buffer[128]; 272 bool _should_send_method; 273 PhaseChaitin* _chaitin; 274 bool _clear_nodes; 275 Matcher* _matcher; 276 bool _traverse_outs; 277 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 281 static void pre_node(Node* node, void *env); 282 static void post_node(Node* node, void *env); 283 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(); 297 void print_method(ciMethod *method, int bci, InlineTree *tree); 298 void print_inline_tree(InlineTree *tree); 299 void clear_nodes(); 300 301 IdealGraphPrinter(); 302 ~IdealGraphPrinter(); 303 304public: 305 306 static void clean_up(); 307 static IdealGraphPrinter *printer(); 308 309 bool traverse_outs(); 310 void set_traverse_outs(bool b); 311 void print_ifg(PhaseIFG* ifg); 312 outputStream *output(); 313 void print_inlining(Compile* compile); 314 void begin_method(Compile* compile); 315 void end_method(); 316 void print_method(Compile* compile, const char *name, int level=1, bool clear_nodes = false); 317 void print(Compile* compile, const char *name, Node *root, int level=1, bool clear_nodes = false); 318 void print_xml(const char *name); 319 320 321}; 322 323#endif 324