Input files should go before all other options.

Important, for example, when calling 'gcc a.o b.o c.o -lD -lE -lF'.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83524 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mikhail Glushenkov 2009-10-08 04:40:08 +00:00
parent 1f30dcbd8d
commit 39482dde66
6 changed files with 29 additions and 19 deletions

View File

@ -10,7 +10,7 @@ def OptList : OptionList<[(switch_option "Wall", (extern)),
(prefix_list_option "L", (extern))]>;
def dummy_tool : Tool<[
(cmd_line "dummy_cmd"),
(cmd_line "dummy_cmd $INFILE"),
(in_language "dummy"),
(out_language "dummy"),
(actions (case

View File

@ -8,7 +8,7 @@ include "llvm/CompilerDriver/Common.td"
def OptList : OptionList<[(parameter_option "dummy", (extern))]>;
def dummy_tool : Tool<[
(cmd_line "dummy_cmd"),
(cmd_line "dummy_cmd $INFILE"),
(in_language "dummy"),
(out_language "dummy"),
(actions (case

View File

@ -10,7 +10,7 @@ def OptList : OptionList<[
(parameter_list_option "baz", (multi_val 2), (extern))]>;
def dummy_tool : Tool<[
(cmd_line "dummy_cmd"),
(cmd_line "dummy_cmd $INFILE"),
(in_language "dummy"),
(out_language "dummy"),
(actions (case

View File

@ -4,7 +4,7 @@
include "llvm/CompilerDriver/Common.td"
def dummy_tool : Tool<[
(cmd_line "dummy_cmd"),
(cmd_line "dummy_cmd $INFILE"),
(in_language "dummy"),
(out_language "dummy")
]>;

View File

@ -11,7 +11,7 @@ def OptList : OptionList<[
(parameter_list_option "baz", (zero_or_one))]>;
def dummy_tool : Tool<[
(cmd_line "dummy_cmd"),
(cmd_line "dummy_cmd $INFILE"),
(in_language "dummy"),
(out_language "dummy"),
(actions (case

View File

@ -1352,12 +1352,15 @@ void EmitCmdLineVecFill(const Init* CmdLine, const std::string& ToolName,
++I;
}
bool hasINFILE = false;
for (; I != E; ++I) {
const std::string& cmd = *I;
assert(!cmd.empty());
O.indent(IndentLevel);
if (cmd.at(0) == '$') {
if (cmd == "$INFILE") {
hasINFILE = true;
if (IsJoin) {
O << "for (PathVector::const_iterator B = inFiles.begin()"
<< ", E = inFiles.end();\n";
@ -1369,7 +1372,8 @@ void EmitCmdLineVecFill(const Init* CmdLine, const std::string& ToolName,
}
}
else if (cmd == "$OUTFILE") {
O << "vec.push_back(out_file);\n";
O << "vec.push_back(\"\");\n";
O.indent(IndentLevel) << "out_file_index = vec.size()-1;\n";
}
else {
O << "vec.push_back(";
@ -1381,8 +1385,10 @@ void EmitCmdLineVecFill(const Init* CmdLine, const std::string& ToolName,
O << "vec.push_back(\"" << cmd << "\");\n";
}
}
O.indent(IndentLevel) << "cmd = ";
if (!hasINFILE)
throw "Tool '" + ToolName + "' doesn't take any input!";
O.indent(IndentLevel) << "cmd = ";
if (StrVec[0][0] == '$')
SubstituteSpecialCommands(StrVec.begin(), StrVec.end(), O);
else
@ -1566,7 +1572,7 @@ class EmitActionHandler {
}
};
// EmitGenerateActionMethod - Emit one of two versions of the
// EmitGenerateActionMethod - Emit either a normal or a "join" version of the
// Tool::GenerateAction() method.
void EmitGenerateActionMethod (const ToolDescription& D,
const OptionDescriptions& OptDescs,
@ -1586,17 +1592,7 @@ void EmitGenerateActionMethod (const ToolDescription& D,
O.indent(Indent2) << "bool stop_compilation = !HasChildren;\n";
O.indent(Indent2) << "const char* output_suffix = \""
<< D.OutputSuffix << "\";\n";
O.indent(Indent2) << "std::string out_file;\n\n";
// For every understood option, emit handling code.
if (D.Actions)
EmitCaseConstructHandler(D.Actions, Indent2, EmitActionHandler(OptDescs),
false, OptDescs, O);
O << '\n';
O.indent(Indent2)
<< "out_file = OutFilename(" << (IsJoin ? "sys::Path(),\n" : "inFile,\n");
O.indent(Indent3) << "TempDir, stop_compilation, output_suffix).str();\n\n";
O.indent(Indent2) << "int out_file_index = -1;\n\n";
// cmd_line is either a string or a 'case' construct.
if (!D.CmdLine)
@ -1608,6 +1604,20 @@ void EmitGenerateActionMethod (const ToolDescription& D,
EmitCmdLineVecFillCallback(IsJoin, D.Name),
true, OptDescs, O);
// For every understood option, emit handling code.
if (D.Actions)
EmitCaseConstructHandler(D.Actions, Indent2, EmitActionHandler(OptDescs),
false, OptDescs, O);
O << '\n';
O.indent(Indent2)
<< "std::string out_file = OutFilename("
<< (IsJoin ? "sys::Path(),\n" : "inFile,\n");
O.indent(Indent3) << "TempDir, stop_compilation, output_suffix).str();\n\n";
// TODO: emit this check only when necessary.
O.indent(Indent2) << "if (out_file_index != -1)\n";
O.indent(Indent3) << "vec[out_file_index] = out_file;\n";
// Handle the Sink property.
if (D.isSink()) {
O.indent(Indent2) << "if (!" << SinkOptionName << ".empty()) {\n";