void insertNode(Tool* T);
/// insertEdge - Insert a new edge into the graph. Takes ownership
- /// of the Edge object.
+ /// of the Edge object. Returns non-zero value on error.
int insertEdge(const std::string& A, Edge* E);
- /// Build - Build target(s) from the input file set. Command-line
- /// options are passed implicitly as global variables.
+ /// Build - Build target(s) from the input file set. Command-line options
+ /// are passed implicitly as global variables. Returns non-zero value on
+ /// error (usually the failed program's exit code).
int Build(llvm::sys::Path const& TempDir, const LanguageMap& LangMap);
- /// Check - Check the compilation graph for common errors like
- /// cycles, input/output language mismatch and multiple default
- /// edges. Prints error messages and in case it finds any errors.
+ /// Check - Check the compilation graph for common errors like cycles,
+ /// input/output language mismatch and multiple default edges. Prints error
+ /// messages and in case it finds any errors.
int Check();
- /// getNode - Return a reference to the node correponding to the
- /// given tool name. Throws std::runtime_error.
+ /// getNode - Return a reference to the node corresponding to the given tool
+ /// name. Returns 0 on error.
Node* getNode(const std::string& ToolName);
const Node* getNode(const std::string& ToolName) const;
- /// viewGraph - This function is meant for use from the debugger.
- /// You can just say 'call G->viewGraph()' and a ghostview window
- /// should pop up from the program, displaying the compilation
- /// graph. This depends on there being a 'dot' and 'gv' program
- /// in your path.
+ /// viewGraph - This function is meant for use from the debugger. You can
+ /// just say 'call G->viewGraph()' and a ghostview window should pop up from
+ /// the program, displaying the compilation graph. This depends on there
+ /// being a 'dot' and 'gv' program in your path.
void viewGraph();
/// writeGraph - Write Graphviz .dot source file to the current direcotry.
// Helper functions.
/// getToolsVector - Return a reference to the list of tool names
- /// corresponding to the given language name. Throws
- /// std::runtime_error.
+ /// corresponding to the given language name. Returns 0 on error.
const tools_vector_type* getToolsVector(const std::string& LangName) const;
- /// PassThroughGraph - Pass the input file through the toolchain
- /// starting at StartNode.
+ /// PassThroughGraph - Pass the input file through the toolchain starting at
+ /// StartNode.
int PassThroughGraph (const llvm::sys::Path& In, const Node* StartNode,
const InputLanguagesSet& InLangs,
const llvm::sys::Path& TempDir,
InputLanguagesSet& InLangs,
const LanguageMap& LangMap) const;
- /// BuildInitial - Traverse the initial parts of the toolchains.
+ /// BuildInitial - Traverse the initial parts of the toolchains. Returns
+ /// non-zero value on error.
int BuildInitial(InputLanguagesSet& InLangs,
const llvm::sys::Path& TempDir,
const LanguageMap& LangMap);
- /// TopologicalSort - Sort the nodes in topological order.
+ /// TopologicalSort - Sort the nodes in topological order. Returns non-zero
+ /// value on error.
int TopologicalSort(std::vector<const Node*>& Out);
- /// TopologicalSortFilterJoinNodes - Call TopologicalSort and
- /// filter the resulting list to include only Join nodes.
+ /// TopologicalSortFilterJoinNodes - Call TopologicalSort and filter the
+ /// resulting list to include only Join nodes. Returns non-zero value on
+ /// error.
int TopologicalSortFilterJoinNodes(std::vector<const Node*>& Out);
// Functions used to implement Check().
- /// CheckLanguageNames - Check that output/input language names
- /// match for all nodes.
+ /// CheckLanguageNames - Check that output/input language names match for
+ /// all nodes. Returns non-zero value on error (number of errors
+ /// encountered).
int CheckLanguageNames() const;
- /// CheckMultipleDefaultEdges - check that there are no multiple
- /// default default edges.
+ /// CheckMultipleDefaultEdges - check that there are no multiple default
+ /// default edges. Returns non-zero value on error (number of errors
+ /// encountered).
int CheckMultipleDefaultEdges() const;
- /// CheckCycles - Check that there are no cycles in the graph.
+ /// CheckCycles - Check that there are no cycles in the graph. Returns
+ /// non-zero value on error (number of errors encountered).
int CheckCycles();
};
int CompilationGraph::insertEdge(const std::string& A, Edge* Edg) {
Node* B = getNode(Edg->ToolName());
if (B == 0)
- return -1;
+ return 1;
if (A == "root") {
const char** InLangs = B->ToolPtr->InputLanguages();
else {
Node* N = getNode(A);
if (N == 0)
- return -1;
+ return 1;
N->AddEdge(Edg);
}
const Edge* Edg = ChooseEdge(CurNode->OutEdges, InLangs, CurNode->Name());
if (Edg == 0)
- return -1;
+ return 1;
CurNode = getNode(Edg->ToolName());
if (CurNode == 0)
- return -1;
+ return 1;
In = CurAction.OutFile();
}
// Find the toolchain corresponding to this file.
const Node* N = FindToolChain(In, xLanguage, InLangs, LangMap);
if (N == 0)
- return -1;
+ return 1;
// Pass file through the chain starting at head.
if (int ret = PassThroughGraph(In, N, InLangs, TempDir, LangMap))
return ret;
Node* Root = getNode("root");
if (Root == 0)
- return -1;
+ return 1;
Q.push(Root);
EB != EE; ++EB) {
Node* B = getNode((*EB)->ToolName());
if (B == 0)
- return -1;
+ return 1;
B->DecrInEdges();
if (B->HasNoInEdges())
const Edge* Edg = ChooseEdge(CurNode->OutEdges, InLangs, CurNode->Name());
if (Edg == 0)
- return -1;
+ return 1;
const Node* NextNode = getNode(Edg->ToolName());
if (NextNode == 0)
- return -1;
+ return 1;
if (int ret = PassThroughGraph(sys::Path(CurAction.OutFile()), NextNode,
InLangs, TempDir, LangMap)) {
EB != EE; ++EB) {
const Node* N2 = this->getNode((*EB)->ToolName());
if (N2 == 0)
- return -1;
+ return 1;
if (!N2->ToolPtr) {
++ret;
Node* Root = getNode("root");
if (Root == 0)
- return -1;
+ return 1;
Q.push(Root);
EB != EE; ++EB) {
Node* B = getNode((*EB)->ToolName());
if (B == 0)
- return -1;
+ return 1;
B->DecrInEdges();
if (B->HasNoInEdges())
// Check that output/input language names match.
ret = this->CheckLanguageNames();
if (ret < 0)
- return -1;
+ return 1;
errs += ret;
// Check for multiple default edges.
ret = this->CheckMultipleDefaultEdges();
if (ret < 0)
- return -1;
+ return 1;
errs += ret;
// Check for cycles.
ret = this->CheckCycles();
if (ret < 0)
- return -1;
+ return 1;
errs += ret;
return errs;
}
else {
PrintError("Error opening file '" + OutputFilename + "' for writing!");
- return -1;
+ return 1;
}
return 0;