Input files should go before all other options.
authorMikhail Glushenkov <foldr@codedgers.com>
Thu, 8 Oct 2009 04:40:08 +0000 (04:40 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Thu, 8 Oct 2009 04:40:08 +0000 (04:40 +0000)
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

test/LLVMC/ExternOptions.td
test/LLVMC/ForwardAs.td
test/LLVMC/MultiValuedOption.td
test/LLVMC/NoActions.td
test/LLVMC/OneOrMore.td
utils/TableGen/LLVMCConfigurationEmitter.cpp

index 7d71e91551cdf9e1b469a0a9485e5174da27d031..5c69af7d8054d0ed21dcb246c6ab74024e6cd917 100644 (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
index 28c2a0aae75e447bbec2b12ab32de7aac40a21d1..51bd494610eae6991a64b1b542ab2cf67e900366 100644 (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
index 0272e082be1c6618371d4e9361775fd762ee1d37..bd1e0338f7555d17f7fc7ccd83283b246460001b 100644 (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
index 298b6e23b59a3c5f7f309beb498d24d9e1dcf8b6..2a4a7495ab0b4486c9926a67472c73a70d630802 100644 (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")
 ]>;
index d6bc38b9b594823e83d47492d7b69101358d4794..38b7eb7dffea310afb4979a51949e95299c006d5 100644 (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
index f9a447adffa6971ca1dfcb4f3333566033733d04..bcf7613e94f875add9cf421b34c151192701b8da 100644 (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";