diff options
| author | Mikhail Glushenkov <foldr@codedgers.com> | 2009-10-08 04:40:08 +0000 | 
|---|---|---|
| committer | Mikhail Glushenkov <foldr@codedgers.com> | 2009-10-08 04:40:08 +0000 | 
| commit | 182765004e261fc81c53135b5ff66c69b7256c77 (patch) | |
| tree | ac0fba7bf778e43372407eb5ff992f6c1de9e425 | |
| parent | 534ea5ae328e3f0193c923c5fbe414067b742a24 (diff) | |
| download | bcm5719-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.td | 2 | ||||
| -rw-r--r-- | llvm/test/LLVMC/ForwardAs.td | 2 | ||||
| -rw-r--r-- | llvm/test/LLVMC/MultiValuedOption.td | 2 | ||||
| -rw-r--r-- | llvm/test/LLVMC/NoActions.td | 2 | ||||
| -rw-r--r-- | llvm/test/LLVMC/OneOrMore.td | 2 | ||||
| -rw-r--r-- | llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp | 38 | 
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";  | 

