[llvm-commits] [llvm] r91402 - in /llvm/trunk: test/LLVMC/HookWithInFile.td utils/TableGen/LLVMCConfigurationEmitter.cpp

Mikhail Glushenkov foldr at codedgers.com
Mon Dec 14 19:04:02 PST 2009


Author: foldr
Date: Mon Dec 14 21:04:02 2009
New Revision: 91402

URL: http://llvm.org/viewvc/llvm-project?rev=91402&view=rev
Log:
Allow $CALL(Hook, '$INFILE') for non-join tools.

Added:
    llvm/trunk/test/LLVMC/HookWithInFile.td
Modified:
    llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp

Added: llvm/trunk/test/LLVMC/HookWithInFile.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/LLVMC/HookWithInFile.td?rev=91402&view=auto

==============================================================================
--- llvm/trunk/test/LLVMC/HookWithInFile.td (added)
+++ llvm/trunk/test/LLVMC/HookWithInFile.td Mon Dec 14 21:04:02 2009
@@ -0,0 +1,13 @@
+// Check that a hook can be given $INFILE as an argument.
+// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
+// RUN: grep Hook\\(inFile.c_str\\(\\)\\) %t | count 1
+
+include "llvm/CompilerDriver/Common.td"
+
+def dummy_tool : Tool<[
+(cmd_line "$CALL(Hook, '$INFILE')/path $INFILE"),
+(in_language "dummy"),
+(out_language "dummy")
+]>;
+
+def DummyGraph : CompilationGraph<[SimpleEdge<"root", "dummy_tool">]>;

Modified: llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp?rev=91402&r1=91401&r2=91402&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/LLVMCConfigurationEmitter.cpp Mon Dec 14 21:04:02 2009
@@ -1537,62 +1537,99 @@
   }
 }
 
-/// SubstituteSpecialCommands - Perform string substitution for $CALL
-/// and $ENV. Helper function used by EmitCmdLineVecFill().
-StrVector::const_iterator SubstituteSpecialCommands
-(StrVector::const_iterator Pos, StrVector::const_iterator End, raw_ostream& O)
+/// SubstituteCall - Given "$CALL(HookName, [Arg1 [, Arg2 [...]]])", output
+/// "hooks::HookName([Arg1 [, Arg2 [, ...]]])". Helper function used by
+/// SubstituteSpecialCommands().
+StrVector::const_iterator
+SubstituteCall (StrVector::const_iterator Pos,
+                StrVector::const_iterator End,
+                bool IsJoin, raw_ostream& O)
 {
+  const char* errorMessage = "Syntax error in $CALL invocation!";
+  checkedIncrement(Pos, End, errorMessage);
+  const std::string& CmdName = *Pos;
 
-  const std::string& cmd = *Pos;
-
-  if (cmd == "$CALL") {
-    checkedIncrement(Pos, End, "Syntax error in $CALL invocation!");
-    const std::string& CmdName = *Pos;
+  if (CmdName == ")")
+    throw "$CALL invocation: empty argument list!";
 
-    if (CmdName == ")")
-      throw "$CALL invocation: empty argument list!";
+  O << "hooks::";
+  O << CmdName << "(";
 
-    O << "hooks::";
-    O << CmdName << "(";
 
+  bool firstIteration = true;
+  while (true) {
+    checkedIncrement(Pos, End, errorMessage);
+    const std::string& Arg = *Pos;
+    assert(Arg.size() != 0);
 
-    bool firstIteration = true;
-    while (true) {
-      checkedIncrement(Pos, End, "Syntax error in $CALL invocation!");
-      const std::string& Arg = *Pos;
-      assert(Arg.size() != 0);
+    if (Arg[0] == ')')
+      break;
 
-      if (Arg[0] == ')')
-        break;
+    if (firstIteration)
+      firstIteration = false;
+    else
+      O << ", ";
 
-      if (firstIteration)
-        firstIteration = false;
+    if (Arg == "$INFILE") {
+      if (IsJoin)
+        throw "$CALL(Hook, $INFILE) can't be used with a Join tool!";
       else
-        O << ", ";
-
+        O << "inFile.c_str()";
+    }
+    else {
       O << '"' << Arg << '"';
     }
+  }
 
-    O << ')';
+  O << ')';
 
-  }
-  else if (cmd == "$ENV") {
-    checkedIncrement(Pos, End, "Syntax error in $ENV invocation!");
-    const std::string& EnvName = *Pos;
+  return Pos;
+}
 
-    if (EnvName == ")")
-      throw "$ENV invocation: empty argument list!";
+/// SubstituteEnv - Given '$ENV(VAR_NAME)', output 'getenv("VAR_NAME")'. Helper
+/// function used by SubstituteSpecialCommands().
+StrVector::const_iterator
+SubstituteEnv (StrVector::const_iterator Pos,
+               StrVector::const_iterator End, raw_ostream& O)
+{
+  const char* errorMessage = "Syntax error in $ENV invocation!";
+  checkedIncrement(Pos, End, errorMessage);
+  const std::string& EnvName = *Pos;
+
+  if (EnvName == ")")
+    throw "$ENV invocation: empty argument list!";
+
+  O << "checkCString(std::getenv(\"";
+  O << EnvName;
+  O << "\"))";
+
+  checkedIncrement(Pos, End, errorMessage);
+
+  return Pos;
+}
 
-    O << "checkCString(std::getenv(\"";
-    O << EnvName;
-    O << "\"))";
+/// SubstituteSpecialCommands - Given an invocation of $CALL or $ENV, output
+/// handler code. Helper function used by EmitCmdLineVecFill().
+StrVector::const_iterator
+SubstituteSpecialCommands (StrVector::const_iterator Pos,
+                           StrVector::const_iterator End,
+                           bool IsJoin, raw_ostream& O)
+{
 
-    checkedIncrement(Pos, End, "Syntax error in $ENV invocation!");
+  const std::string& cmd = *Pos;
+
+  // Perform substitution.
+  if (cmd == "$CALL") {
+    Pos = SubstituteCall(Pos, End, IsJoin, O);
+  }
+  else if (cmd == "$ENV") {
+    Pos = SubstituteEnv(Pos, End, O);
   }
   else {
     throw "Unknown special command: " + cmd;
   }
 
+  // Handle '$CMD(ARG)/additional/text'.
   const std::string& Leftover = *Pos;
   assert(Leftover.at(0) == ')');
   if (Leftover.size() != 1)
@@ -1652,7 +1689,7 @@
       }
       else {
         O << "vec.push_back(";
-        I = SubstituteSpecialCommands(I, E, O);
+        I = SubstituteSpecialCommands(I, E, IsJoin, O);
         O << ");\n";
       }
     }
@@ -1665,7 +1702,7 @@
 
   O.indent(IndentLevel) << "cmd = ";
   if (StrVec[0][0] == '$')
-    SubstituteSpecialCommands(StrVec.begin(), StrVec.end(), O);
+    SubstituteSpecialCommands(StrVec.begin(), StrVec.end(), IsJoin, O);
   else
     O << '"' << StrVec[0] << '"';
   O << ";\n";





More information about the llvm-commits mailing list