summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Glushenkov <foldr@codedgers.com>2009-10-08 04:40:08 +0000
committerMikhail Glushenkov <foldr@codedgers.com>2009-10-08 04:40:08 +0000
commit182765004e261fc81c53135b5ff66c69b7256c77 (patch)
treeac0fba7bf778e43372407eb5ff992f6c1de9e425
parent534ea5ae328e3f0193c923c5fbe414067b742a24 (diff)
downloadbcm5719-llvm-182765004e261fc81c53135b5ff66c69b7256c77.tar.gz
bcm5719-llvm-182765004e261fc81c53135b5ff66c69b7256c77.zip
Input files should go before all other options.
Important, for example, when calling 'gcc a.o b.o c.o -lD -lE -lF'. llvm-svn: 83524
-rw-r--r--llvm/test/LLVMC/ExternOptions.td2
-rw-r--r--llvm/test/LLVMC/ForwardAs.td2
-rw-r--r--llvm/test/LLVMC/MultiValuedOption.td2
-rw-r--r--llvm/test/LLVMC/NoActions.td2
-rw-r--r--llvm/test/LLVMC/OneOrMore.td2
-rw-r--r--llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp38
6 files changed, 29 insertions, 19 deletions
diff --git a/llvm/test/LLVMC/ExternOptions.td b/llvm/test/LLVMC/ExternOptions.td
index 7d71e91551c..5c69af7d805 100644
--- a/llvm/test/LLVMC/ExternOptions.td
+++ b/llvm/test/LLVMC/ExternOptions.td
@@ -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
diff --git a/llvm/test/LLVMC/ForwardAs.td b/llvm/test/LLVMC/ForwardAs.td
index 28c2a0aae75..51bd494610e 100644
--- a/llvm/test/LLVMC/ForwardAs.td
+++ b/llvm/test/LLVMC/ForwardAs.td
@@ -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
diff --git a/llvm/test/LLVMC/MultiValuedOption.td b/llvm/test/LLVMC/MultiValuedOption.td
index 0272e082be1..bd1e0338f75 100644
--- a/llvm/test/LLVMC/MultiValuedOption.td
+++ b/llvm/test/LLVMC/MultiValuedOption.td
@@ -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
diff --git a/llvm/test/LLVMC/NoActions.td b/llvm/test/LLVMC/NoActions.td
index 298b6e23b59..2a4a7495ab0 100644
--- a/llvm/test/LLVMC/NoActions.td
+++ b/llvm/test/LLVMC/NoActions.td
@@ -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")
]>;
diff --git a/llvm/test/LLVMC/OneOrMore.td b/llvm/test/LLVMC/OneOrMore.td
index d6bc38b9b59..38b7eb7dffe 100644
--- a/llvm/test/LLVMC/OneOrMore.td
+++ b/llvm/test/LLVMC/OneOrMore.td
@@ -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
diff --git a/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp b/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp
index f9a447adffa..bcf7613e94f 100644
--- a/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp
+++ b/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp
@@ -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";
OpenPOWER on IntegriCloud