From 9503b49462a482d7566077d6bbb368d798611390 Mon Sep 17 00:00:00 2001 From: Mikhail Glushenkov Date: Fri, 18 Dec 2009 11:27:26 +0000 Subject: Make 'set_option' work with list options. 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 | 7 +++++- utils/TableGen/LLVMCConfigurationEmitter.cpp | 33 +++++++++++++++++++--------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/test/LLVMC/OptionPreprocessor.td b/test/LLVMC/OptionPreprocessor.td index 44ebfa4..e5d6bbb 100644 --- a/test/LLVMC/OptionPreprocessor.td +++ b/test/LLVMC/OptionPreprocessor.td @@ -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; diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index 3ff7bc4..8b04b6f 100644 --- a/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/utils/TableGen/LLVMCConfigurationEmitter.cpp @@ -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 -- cgit v1.1