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
This commit is contained in:
Mikhail Glushenkov 2009-12-18 11:27:26 +00:00
parent 97b087c778
commit 9503b49462
2 changed files with 29 additions and 11 deletions

View 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;

View 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