Some enhancements for the 'case' expression.
authorMikhail Glushenkov <foldr@codedgers.com>
Wed, 17 Dec 2008 02:47:01 +0000 (02:47 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Wed, 17 Dec 2008 02:47:01 +0000 (02:47 +0000)
Add (error) and (empty).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61117 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CompilerDriver/Common.td
tools/llvmc/doc/LLVMC-Reference.rst
utils/TableGen/LLVMCConfigurationEmitter.cpp

index e2d51d1984fadead96cdb4a99336d538dda3f1a8..097dd4f38ee92464b230368820b6b201441e72b6 100644 (file)
@@ -67,6 +67,7 @@ def forward;
 def forward_as;
 def stop_compilation;
 def unpack_values;
+def error;
 
 // Increase/decrease the edge weight.
 def inc_weight;
index 66253ee0dca6bac37d930891387d2886350d0ffd..6189ec21828d9dc9bde23bafd2b9c012a1cda718 100644 (file)
@@ -387,6 +387,9 @@ use TableGen inheritance instead.
     user.
     Example: ``(not_empty "o")``.
 
+  - ``empty`` - The opposite of ``not_empty``. Equivalent to ``(not (not_empty
+    X))``. Provided for convenience.
+
   - ``default`` - Always evaluates to true. Should always be the last
     test in the ``case`` expression.
 
@@ -487,7 +490,11 @@ The list of all possible actions follows.
 
    - ``append_cmd`` - append a string to the tool invocation
      command.
-     Example: ``(case (switch_on "pthread"), (append_cmd "-lpthread"))``
+     Example: ``(case (switch_on "pthread"), (append_cmd
+     "-lpthread"))``
+
+   - ``error` - exit with error.
+     Example: ``(error "Mixing -c and -S is not allowed!")``.
 
    - ``forward`` - forward an option unchanged.
      Example: ``(forward "Wall")``.
index ebf4b18aff2fae532da1bd26cd343d2ee23f2bb9..1aa0ec6bb1f4b60767412e491d7dd0b252afb7f0 100644 (file)
@@ -798,7 +798,7 @@ class ExtractOptionNames {
     if (ActionName == "forward" || ActionName == "forward_as" ||
         ActionName == "unpack_values" || ActionName == "switch_on" ||
         ActionName == "parameter_equals" || ActionName == "element_in_list" ||
-        ActionName == "not_empty") {
+        ActionName == "not_empty" || ActionName == "empty") {
       checkNumberOfArguments(&Stmt, 1);
       const std::string& Name = InitPtrToString(Stmt.getArg(0));
       OptionNames_.insert(Name);
@@ -877,6 +877,7 @@ bool EmitCaseTest1Arg(const std::string& TestName,
                       std::ostream& O) {
   checkNumberOfArguments(&d, 1);
   const std::string& OptName = InitPtrToString(d.getArg(0));
+
   if (TestName == "switch_on") {
     const OptionDescription& OptDesc = OptDescs.FindOption(OptName);
     if (!OptionType::IsSwitch(OptDesc.Type))
@@ -893,9 +894,11 @@ bool EmitCaseTest1Arg(const std::string& TestName,
     // TODO: make this work with Edge::Weight (if possible).
     O << "LangMap.GetLanguage(inFile) == \"" << OptName << '\"';
     return true;
-  } else if (TestName == "not_empty") {
+  } else if (TestName == "not_empty" || TestName == "empty") {
+    const char* Test = (TestName == "empty") ? "" : "!";
+
     if (OptName == "o") {
-      O << "!OutputFilename.empty()";
+      O << Test << "OutputFilename.empty()";
       return true;
     }
     else {
@@ -903,7 +906,7 @@ bool EmitCaseTest1Arg(const std::string& TestName,
       if (OptionType::IsSwitch(OptDesc.Type))
         throw OptName
           + ": incorrect option type - should be a list or parameter!";
-      O << '!' << OptDesc.GenVariableName() << ".empty()";
+      O << Test << OptDesc.GenVariableName() << ".empty()";
       return true;
     }
   }
@@ -1196,6 +1199,12 @@ class EmitActionHandler {
       const std::string& Cmd = InitPtrToString(Dag.getArg(0));
       O << IndentLevel << "vec.push_back(\"" << Cmd << "\");\n";
     }
+    else if (ActionName == "error") {
+      O << IndentLevel << "throw std::runtime_error(\"" <<
+        (Dag.getNumArgs() >= 1 ? InitPtrToString(Dag.getArg(0))
+         : "Unknown error!")
+        << "\");\n";
+    }
     else if (ActionName == "forward") {
       checkNumberOfArguments(&Dag, 1);
       const std::string& Name = InitPtrToString(Dag.getArg(0));
@@ -1535,12 +1544,23 @@ void IncDecWeight (const Init* i, const char* IndentLevel,
   const DagInit& d = InitPtrToDag(i);
   const std::string& OpName = d.getOperator()->getAsString();
 
-  if (OpName == "inc_weight")
+  if (OpName == "inc_weight") {
     O << IndentLevel << "ret += ";
-  else if (OpName == "dec_weight")
+  }
+  else if (OpName == "dec_weight") {
     O << IndentLevel << "ret -= ";
+  }
+  else if (OpName == "error") {
+    O << IndentLevel << "throw std::runtime_error(\"" <<
+        (d.getNumArgs() >= 1 ? InitPtrToString(d.getArg(0))
+         : "Unknown error!")
+      << "\");\n";
+    return;
+  }
+
   else
-    throw "Unknown operator in edge properties list: " + OpName + '!';
+    throw "Unknown operator in edge properties list: " + OpName + '!' +
+      "Only 'inc_weight', 'dec_weight' and 'error' are allowed.";
 
   if (d.getNumArgs() > 0)
     O << InitPtrToInt(d.getArg(0)) << ";\n";