void Node::Dump ( int indent ) { for (int i = 0; i < indent; i++) { printf(" "); } printf("Node %s ", this->Name); this->AttributeList->Dump(); if (this->Data != NULL) { for (int i = 0; i <= indent; i++) { printf(" "); } printf("Data: %s\n", this->Data); } else { for (Node * child = this->ChildList; child != NULL; child = child->Next) { child->Dump(indent + 1); } } }
void PropagateDefUseChainUpdate( DefUseChain<Node> *graph, UpdateDefUseChainNode<Node>& update) { std::set<Node*> worklist; AppendWorkListWrap<Node> append(worklist); update.init(append); while (worklist.size()) { Node* cur = *worklist.begin(); worklist.erase(worklist.begin()); if (cur->is_definition()) { for (GraphNodeSuccessorIterator<DefUseChain<Node> > usep(graph,cur); !usep.ReachEnd(); ++usep) { Node* use = *usep; if (use->is_definition()) continue; GraphNodePredecessorIterator<DefUseChain<Node> > defp(graph,use); Node *tmp = *defp; ++defp; if (defp.ReachEnd()) { assert( tmp == cur); update.update_use_node(use, cur, append); } } } else { GraphNodePredecessorIterator<DefUseChain<Node> > defp(graph,cur); if (defp.ReachEnd()) { if (DebugDefUseChain()) { std::cerr << "Error: use of reference with no definition: "; cur->Dump(); std::cerr << std::endl; } } else { // Node* def = *defp; if (!defp.ReachEnd()) { Node* def = *defp; ++defp; if (defp.ReachEnd()) { if (update.update_def_node(def, cur, append)) append(def); } } } } } }