mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
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:
parent
1f30dcbd8d
commit
39482dde66
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
]>;
|
||||
|
@ -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
|
||||
|
@ -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";
|
||||
|
Loading…
x
Reference in New Issue
Block a user