Пример #1
0
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);
      }
   }
}
Пример #2
0
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);
            }
         }
      }
    }
  }
}