[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