parent
							
								
									af15882a5a
								
							
						
					
					
						commit
						be23113e93
					
				| 
						 | 
					@ -109,9 +109,61 @@ void CompilationGraph::insertEdge(const std::string& A, Edge* E) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Pass input file through the chain until we bump into a Join node or
 | 
				
			||||||
 | 
					// a node that says that it is the last.
 | 
				
			||||||
 | 
					const Tool* CompilationGraph::PassThroughGraph (sys::Path& In,
 | 
				
			||||||
 | 
					                                                sys::Path Out,
 | 
				
			||||||
 | 
					                                                const sys::Path& TempDir,
 | 
				
			||||||
 | 
					                                                PathVector& JoinList) const {
 | 
				
			||||||
 | 
					  bool Last = false;
 | 
				
			||||||
 | 
					  const Tool* ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get to the head of the toolchain.
 | 
				
			||||||
 | 
					  const tools_vector_type& TV = getToolsVector(getLanguage(In));
 | 
				
			||||||
 | 
					  if (TV.empty())
 | 
				
			||||||
 | 
					    throw std::runtime_error("Tool names vector is empty!");
 | 
				
			||||||
 | 
					  const Node* N = &getNode(*TV.begin());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while(!Last) {
 | 
				
			||||||
 | 
					    const Tool* CurTool = N->ToolPtr.getPtr();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (CurTool->IsJoin()) {
 | 
				
			||||||
 | 
					      JoinList.push_back(In);
 | 
				
			||||||
 | 
					      ret = CurTool;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Is this the last tool?
 | 
				
			||||||
 | 
					    if (!N->HasChildren() || CurTool->IsLast()) {
 | 
				
			||||||
 | 
					      // Check if the first tool is also the last
 | 
				
			||||||
 | 
					      if (Out.empty())
 | 
				
			||||||
 | 
					        Out.set(In.getBasename());
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        Out.appendComponent(In.getBasename());
 | 
				
			||||||
 | 
					      Out.appendSuffix(CurTool->OutputSuffix());
 | 
				
			||||||
 | 
					      Last = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      Out = TempDir;
 | 
				
			||||||
 | 
					      Out.appendComponent(In.getBasename());
 | 
				
			||||||
 | 
					      Out.appendSuffix(CurTool->OutputSuffix());
 | 
				
			||||||
 | 
					      Out.makeUnique(true, NULL);
 | 
				
			||||||
 | 
					      Out.eraseFromDisk();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (CurTool->GenerateAction(In, Out).Execute() != 0)
 | 
				
			||||||
 | 
					      throw std::runtime_error("Tool returned error code!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    N = &getNode(N->ChooseEdge()->ToolName());
 | 
				
			||||||
 | 
					    In = Out; Out.clear();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TOFIX: support more interesting graph topologies. We will need to
 | 
					// TOFIX: support more interesting graph topologies. We will need to
 | 
				
			||||||
// do topological sorting to process multiple Join nodes correctly.
 | 
					// do topological sorting to process multiple Join nodes correctly.
 | 
				
			||||||
int CompilationGraph::Build (const sys::Path& tempDir) const {
 | 
					int CompilationGraph::Build (const sys::Path& TempDir) const {
 | 
				
			||||||
  PathVector JoinList;
 | 
					  PathVector JoinList;
 | 
				
			||||||
  const Tool* JoinTool = 0;
 | 
					  const Tool* JoinTool = 0;
 | 
				
			||||||
  sys::Path In, Out;
 | 
					  sys::Path In, Out;
 | 
				
			||||||
| 
						 | 
					@ -121,48 +173,12 @@ int CompilationGraph::Build (const sys::Path& tempDir) const {
 | 
				
			||||||
        E = InputFilenames.end(); B != E; ++B) {
 | 
					        E = InputFilenames.end(); B != E; ++B) {
 | 
				
			||||||
    In = sys::Path(*B);
 | 
					    In = sys::Path(*B);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get to the head of the toolchain.
 | 
					    const Tool* NewJoin = PassThroughGraph(In, Out, TempDir, JoinList);
 | 
				
			||||||
    const tools_vector_type& TV = getToolsVector(getLanguage(In));
 | 
					    if (JoinTool && NewJoin && JoinTool != NewJoin)
 | 
				
			||||||
    if (TV.empty())
 | 
					      throw std::runtime_error("Graphs with multiple Join nodes"
 | 
				
			||||||
      throw std::runtime_error("Tool names vector is empty!");
 | 
					                               "are not yet supported!");
 | 
				
			||||||
    const Node* N = &getNode(*TV.begin());
 | 
					    else if (NewJoin)
 | 
				
			||||||
 | 
					      JoinTool = NewJoin;
 | 
				
			||||||
    // Pass file through the chain until we bump into a Join node or a
 | 
					 | 
				
			||||||
    // node that says that it is the last.
 | 
					 | 
				
			||||||
    bool Last = false;
 | 
					 | 
				
			||||||
    while(!Last) {
 | 
					 | 
				
			||||||
      const Tool* CurTool = N->ToolPtr.getPtr();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (CurTool->IsJoin()) {
 | 
					 | 
				
			||||||
        JoinList.push_back(In);
 | 
					 | 
				
			||||||
        JoinTool = CurTool;
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Is this the last tool?
 | 
					 | 
				
			||||||
      if (!N->HasChildren() || CurTool->IsLast()) {
 | 
					 | 
				
			||||||
        // Check if the first tool is also the last
 | 
					 | 
				
			||||||
        if (Out.empty())
 | 
					 | 
				
			||||||
          Out.set(In.getBasename());
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          Out.appendComponent(In.getBasename());
 | 
					 | 
				
			||||||
        Out.appendSuffix(CurTool->OutputSuffix());
 | 
					 | 
				
			||||||
        Last = true;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else {
 | 
					 | 
				
			||||||
        Out = tempDir;
 | 
					 | 
				
			||||||
        Out.appendComponent(In.getBasename());
 | 
					 | 
				
			||||||
        Out.appendSuffix(CurTool->OutputSuffix());
 | 
					 | 
				
			||||||
        Out.makeUnique(true, NULL);
 | 
					 | 
				
			||||||
        Out.eraseFromDisk();
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (CurTool->GenerateAction(In, Out).Execute() != 0)
 | 
					 | 
				
			||||||
        throw std::runtime_error("Tool returned error code!");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      N = &getNode(N->ChooseEdge()->ToolName());
 | 
					 | 
				
			||||||
      In = Out; Out.clear();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (JoinTool) {
 | 
					  if (JoinTool) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,6 +141,12 @@ namespace llvmcc {
 | 
				
			||||||
    // Return a reference to the list of tool names corresponding to
 | 
					    // Return a reference to the list of tool names corresponding to
 | 
				
			||||||
    // the given language name. Throws std::runtime_error.
 | 
					    // the given language name. Throws std::runtime_error.
 | 
				
			||||||
    const tools_vector_type& getToolsVector(const std::string& LangName) const;
 | 
					    const tools_vector_type& getToolsVector(const std::string& LangName) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Pass the input file through the toolchain.
 | 
				
			||||||
 | 
					    const Tool* PassThroughGraph (llvm::sys::Path& In, llvm::sys::Path Out,
 | 
				
			||||||
 | 
					                                  const llvm::sys::Path& TempDir,
 | 
				
			||||||
 | 
					                                  PathVector& JoinList) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// GraphTraits support code.
 | 
					  /// GraphTraits support code.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue