Return -1 only on failure to execute a program.

Also fix some comments.

llvm-svn: 109499
This commit is contained in:
Mikhail Glushenkov 2010-07-27 11:19:36 +00:00
parent eb58ed8b5a
commit d359cf2e44
6 changed files with 59 additions and 48 deletions

View File

@ -43,7 +43,7 @@ namespace llvmc {
}
bool IsConstructed () { return (Command_.size() != 0);}
/// Execute - Executes the represented action.
/// Execute - Executes the command. Returns -1 on error.
int Execute () const;
bool StopCompilation () const { return StopCompilation_; }
const std::string& OutFile() { return OutFile_; }

View File

@ -132,28 +132,28 @@ namespace llvmc {
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.
@ -167,12 +167,11 @@ namespace llvmc {
// 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,
@ -185,26 +184,32 @@ namespace llvmc {
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();
};

View File

@ -38,6 +38,8 @@ namespace llvmc {
virtual ~Tool() {}
/// GenerateAction - Generate an Action given particular command-line
/// options. Returns non-zero value on error.
virtual int GenerateAction (Action& Out,
const PathVector& inFiles,
const bool HasChildren,
@ -45,6 +47,8 @@ namespace llvmc {
const InputLanguagesSet& InLangs,
const LanguageMap& LangMap) const = 0;
/// GenerateAction - Generate an Action given particular command-line
/// options. Returns non-zero value on error.
virtual int GenerateAction (Action& Out,
const llvm::sys::Path& inFile,
const bool HasChildren,

View File

@ -139,7 +139,7 @@ void CompilationGraph::insertNode(Tool* V) {
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();
@ -150,7 +150,7 @@ int CompilationGraph::insertEdge(const std::string& A, Edge* Edg) {
else {
Node* N = getNode(A);
if (N == 0)
return -1;
return 1;
N->AddEdge(Edg);
}
@ -193,11 +193,11 @@ int CompilationGraph::PassThroughGraph (const sys::Path& InFile,
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();
}
@ -295,7 +295,7 @@ int CompilationGraph::BuildInitial (InputLanguagesSet& InLangs,
// 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;
@ -310,7 +310,7 @@ int CompilationGraph::TopologicalSort(std::vector<const Node*>& Out) {
Node* Root = getNode("root");
if (Root == 0)
return -1;
return 1;
Q.push(Root);
@ -322,7 +322,7 @@ int CompilationGraph::TopologicalSort(std::vector<const Node*>& Out) {
EB != EE; ++EB) {
Node* B = getNode((*EB)->ToolName());
if (B == 0)
return -1;
return 1;
B->DecrInEdges();
if (B->HasNoInEdges())
@ -389,11 +389,11 @@ int CompilationGraph::Build (const sys::Path& TempDir,
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)) {
@ -417,7 +417,7 @@ int CompilationGraph::CheckLanguageNames() const {
EB != EE; ++EB) {
const Node* N2 = this->getNode((*EB)->ToolName());
if (N2 == 0)
return -1;
return 1;
if (!N2->ToolPtr) {
++ret;
@ -497,7 +497,7 @@ int CompilationGraph::CheckCycles() {
Node* Root = getNode("root");
if (Root == 0)
return -1;
return 1;
Q.push(Root);
@ -513,7 +513,7 @@ int CompilationGraph::CheckCycles() {
EB != EE; ++EB) {
Node* B = getNode((*EB)->ToolName());
if (B == 0)
return -1;
return 1;
B->DecrInEdges();
if (B->HasNoInEdges())
@ -539,19 +539,19 @@ int CompilationGraph::Check () {
// 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;
@ -617,7 +617,7 @@ int CompilationGraph::writeGraph(const std::string& OutputFilename) {
}
else {
PrintError("Error opening file '" + OutputFilename + "' for writing!");
return -1;
return 1;
}
return 0;

View File

@ -30,7 +30,9 @@ namespace {
std::stringstream* GlobalTimeLog;
int getTempDir(sys::Path& tempDir) {
/// GetTempDir - Get the temporary directory location. Returns non-zero value
/// on error.
int GetTempDir(sys::Path& tempDir) {
// The --temp-dir option.
if (!TempDirname.empty()) {
tempDir = TempDirname;
@ -53,20 +55,20 @@ namespace {
std::string ErrMsg;
if (tempDir.createDirectoryOnDisk(true, &ErrMsg)) {
PrintError(ErrMsg);
return -1;
return 1;
}
}
return 0;
}
/// BuildTargets - A small wrapper for CompilationGraph::Build.
/// BuildTargets - A small wrapper for CompilationGraph::Build. Returns non-zero value
int BuildTargets(CompilationGraph& graph, const LanguageMap& langMap) {
int ret;
sys::Path tempDir;
bool toDelete = (SaveTemps == SaveTempsEnum::Unset);
if (int ret = getTempDir(tempDir))
if (int ret = GetTempDir(tempDir))
return ret;
ret = graph.Build(tempDir, langMap);

View File

@ -1960,7 +1960,7 @@ struct ActionHandlingCallbackBase
<< "PrintError(\""
<< (d.getNumArgs() >= 1 ? InitPtrToString(d.getArg(0)) : "Unknown error!")
<< "\");\n";
O.indent(IndentLevel) << "return -1;\n";
O.indent(IndentLevel) << "return 1;\n";
}
void onWarningDag(const DagInit& d,