// Print current ideal graph void IdealGraphPrinter::print(Compile* compile, const char *name, Node *node, int level, bool clear_nodes) { if (!_current_method || !_should_send_method || level > PrintIdealGraphLevel) return; this->C = compile; // Warning, unsafe cast? _chaitin = (PhaseChaitin *)C->regalloc(); begin_head(GRAPH_ELEMENT); print_attr(GRAPH_NAME_PROPERTY, (const char *)name); end_head(); VectorSet temp_set(Thread::current()->resource_area()); head(NODES_ELEMENT); walk_nodes(node, false, &temp_set); tail(NODES_ELEMENT); head(EDGES_ELEMENT); walk_nodes(node, true, &temp_set); tail(EDGES_ELEMENT); if (C->cfg() != NULL) { head(CONTROL_FLOW_ELEMENT); for (uint i = 0; i < C->cfg()->number_of_blocks(); i++) { Block* block = C->cfg()->get_block(i); begin_head(BLOCK_ELEMENT); print_attr(BLOCK_NAME_PROPERTY, block->_pre_order); end_head(); head(SUCCESSORS_ELEMENT); for (uint s = 0; s < block->_num_succs; s++) { begin_elem(SUCCESSOR_ELEMENT); print_attr(BLOCK_NAME_PROPERTY, block->_succs[s]->_pre_order); end_elem(); } tail(SUCCESSORS_ELEMENT); head(NODES_ELEMENT); for (uint s = 0; s < block->number_of_nodes(); s++) { begin_elem(NODE_ELEMENT); print_attr(NODE_ID_PROPERTY, get_node_id(block->get_node(s))); end_elem(); } tail(NODES_ELEMENT); tail(BLOCK_ELEMENT); } tail(CONTROL_FLOW_ELEMENT); } tail(GRAPH_ELEMENT); output()->flush(); }
void walk_nodes(struct node *n, int level) { while (n) { switch (n->type) { case NODE_IMM: { struct imm_node *p = (struct imm_node *)n; show(";== imm %s\n", p->value); break; } case NODE_LVAL: { struct lval_node *p = (struct lval_node *)n; show(";== lval %s%s\n", p->deref ? "*" : "", p->name); break; } case NODE_CALL: { struct call_node *p = (struct call_node *)n; show(";== %s(\n", p->func); if (p->parm) { walk_nodes(p->parm, level + 1); } show(")\n"); break; } case NODE_ADD: { struct add_node *p = (struct add_node *)n; if (p->list) { show(";== +(\n"); walk_nodes(p->list, level + 1); show(")\n"); } break; } } n = n->next; } }
void run_test() { total = 0; node* head = new_node(42); append_node(head, new_node(24)); append_node(head, new_node(89)); append_node(head, new_node(11)); walk_nodes(total_nodes, head); free_node_list(head); if (total == 166) { printf("passed\n"); } else { printf("expected total = 166, got %d\n", total); } }
void free_node_list(node* n) { walk_nodes(free, n); }