// 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();
}
Ejemplo n.º 2
0
Archivo: emit.c Proyecto: xerub/ropc
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;
    }
}
Ejemplo n.º 3
0
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);
	}
}
Ejemplo n.º 4
0
void free_node_list(node* n) {
	walk_nodes(free, n);
}