Make 'set_option' work with list options.
authorMikhail Glushenkov <foldr@codedgers.com>
Fri, 18 Dec 2009 11:27:26 +0000 (11:27 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Fri, 18 Dec 2009 11:27:26 +0000 (11:27 +0000)
This works now: (set_option "list_opt", ["val_1", "val_2", "val_3"])

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

test/LLVMC/OptionPreprocessor.td
utils/TableGen/LLVMCConfigurationEmitter.cpp

index 44ebfa49bbda8a98a8bde3c0020d76ac009fa301..e5d6bbb383a09d7c4d16606b6c7e8e88b7b8e648 100644 (file)
@@ -27,8 +27,13 @@ def Preprocess : OptionPreprocessor<
       // CHECK: W2
       // CHECK: foo = true;
       // CHECK: foo_p = "asdf";
+      // CHECK: foo_l.clear();
+      // CHECK: foo_l.push_back("qwert");
+      // CHECK: foo_l.push_back("yuiop");
+      // CHECK: foo_l.push_back("asdf");
       (and (switch_on ["foo", "bar"]), (any_empty ["foo_p", "bar_p"])),
-           [(warning "W2"), (set_option "foo"), (set_option "foo_p", "asdf")],
+           [(warning "W2"), (set_option "foo"), (set_option "foo_p", "asdf"),
+                            (set_option "foo_l", ["qwert", "yuiop", "asdf"])],
       // CHECK: W3
       // CHECK: foo = true;
       // CHECK: bar = true;
index 3ff7bc4d2efa8e3f3ad7d3d6f54bd0de953446bb..8b04b6fecc7176c2223ca48cbbb9f4488c904e03 100644 (file)
@@ -2354,19 +2354,31 @@ class EmitPreprocessOptionsCallback :
                       d, IndentLevel, O);
   }
 
-  void onSetParameter(const DagInit& d,
+  void onSetListOrParameter(const DagInit& d,
                       unsigned IndentLevel, raw_ostream& O) const {
     checkNumberOfArguments(d, 2);
     const std::string& OptName = InitPtrToString(d.getArg(0));
-    const std::string& Value = InitPtrToString(d.getArg(1));
+    const Init* Value = d.getArg(1);
     const OptionDescription& OptDesc = OptDescs_.FindOption(OptName);
 
-    if (OptDesc.isParameter())
+    if (OptDesc.isList()) {
+      const ListInit& List = InitPtrToList(Value);
+
+      O.indent(IndentLevel) << OptDesc.GenVariableName() << ".clear();\n";
+      for (ListInit::const_iterator B = List.begin(), E = List.end();
+           B != E; ++B) {
+        O.indent(IndentLevel) << OptDesc.GenVariableName() << ".push_back(\""
+                              << InitPtrToString(*B) << "\");\n";
+      }
+    }
+    else if (OptDesc.isParameter()) {
+      const std::string& Str = InitPtrToString(Value);
       O.indent(IndentLevel) << OptDesc.GenVariableName()
-                            << " = \"" << Value << "\";\n";
-    else
-      throw "Two-argument 'set_option' "
-        "can be only applied to parameter options!";
+                            << " = \"" << Str << "\";\n";
+    }
+    else {
+      throw "set_option: -" + OptName + ": is not a list or parameter option!";
+    }
   }
 
   void onSetSwitch(const Init* I,
@@ -2377,7 +2389,7 @@ class EmitPreprocessOptionsCallback :
     if (OptDesc.isSwitch())
       O.indent(IndentLevel) << OptDesc.GenVariableName() << " = true;\n";
     else
-      throw "One-argument 'set_option' can be only applied to switch options!";
+      throw "set_option: -" + OptName + " is not a switch option!";
   }
 
   void onSetOption(const DagInit& d,
@@ -2385,9 +2397,10 @@ class EmitPreprocessOptionsCallback :
   {
     checkNumberOfArguments(d, 1);
 
-    // Two arguments: (set_option "parameter", "value")
+    // Two arguments: (set_option "parameter", VALUE), where VALUE is either a
+    // string or a string list.
     if (d.getNumArgs() > 1)
-      this->onSetParameter(d, IndentLevel, O);
+      this->onSetListOrParameter(d, IndentLevel, O);
     // One argument: (set_option "switch")
     // or (set_option ["switch1", "switch2", ...])
     else