Add a way to enable '-opt=foo' forwarding.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96916 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mikhail Glushenkov
2010-02-23 09:04:13 +00:00
parent a3f173237d
commit a04d4ed690
2 changed files with 31 additions and 3 deletions

View File

@@ -46,6 +46,7 @@ def optional;
def really_hidden; def really_hidden;
def required; def required;
def comma_separated; def comma_separated;
def forward_not_split;
// The 'case' construct. // The 'case' construct.
def case; def case;

View File

@@ -229,7 +229,7 @@ namespace OptionDescriptionFlags {
enum OptionDescriptionFlags { Required = 0x1, Hidden = 0x2, enum OptionDescriptionFlags { Required = 0x1, Hidden = 0x2,
ReallyHidden = 0x4, Extern = 0x8, ReallyHidden = 0x4, Extern = 0x8,
OneOrMore = 0x10, Optional = 0x20, OneOrMore = 0x10, Optional = 0x20,
CommaSeparated = 0x40 }; CommaSeparated = 0x40, ForwardNotSplit = 0x80 };
} }
/// OptionDescription - Represents data contained in a single /// OptionDescription - Represents data contained in a single
@@ -271,6 +271,9 @@ struct OptionDescription {
bool isExtern() const; bool isExtern() const;
void setExtern(); void setExtern();
bool isForwardNotSplit() const;
void setForwardNotSplit();
bool isRequired() const; bool isRequired() const;
void setRequired(); void setRequired();
@@ -327,6 +330,13 @@ void OptionDescription::setCommaSeparated() {
Flags |= OptionDescriptionFlags::CommaSeparated; Flags |= OptionDescriptionFlags::CommaSeparated;
} }
bool OptionDescription::isForwardNotSplit() const {
return Flags & OptionDescriptionFlags::ForwardNotSplit;
}
void OptionDescription::setForwardNotSplit() {
Flags |= OptionDescriptionFlags::ForwardNotSplit;
}
bool OptionDescription::isExtern() const { bool OptionDescription::isExtern() const {
return Flags & OptionDescriptionFlags::Extern; return Flags & OptionDescriptionFlags::Extern;
} }
@@ -586,6 +596,8 @@ public:
AddHandler("required", &CollectOptionProperties::onRequired); AddHandler("required", &CollectOptionProperties::onRequired);
AddHandler("optional", &CollectOptionProperties::onOptional); AddHandler("optional", &CollectOptionProperties::onOptional);
AddHandler("comma_separated", &CollectOptionProperties::onCommaSeparated); AddHandler("comma_separated", &CollectOptionProperties::onCommaSeparated);
AddHandler("forward_not_split",
&CollectOptionProperties::onForwardNotSplit);
staticMembersInitialized_ = true; staticMembersInitialized_ = true;
} }
@@ -629,6 +641,13 @@ private:
optDesc_.setCommaSeparated(); optDesc_.setCommaSeparated();
} }
void onForwardNotSplit (const DagInit& d) {
CheckNumberOfArguments(d, 0);
if (!optDesc_.isParameter())
throw "'forward_not_split' is valid only for parameter options!";
optDesc_.setForwardNotSplit();
}
void onRequired (const DagInit& d) { void onRequired (const DagInit& d) {
CheckNumberOfArguments(d, 0); CheckNumberOfArguments(d, 0);
if (optDesc_.isOneOrMore() || optDesc_.isOptional()) if (optDesc_.isOneOrMore() || optDesc_.isOptional())
@@ -1792,8 +1811,16 @@ void EmitForwardOptionPropertyHandlingCode (const OptionDescription& D,
O.indent(IndentLevel) << "vec.push_back(\"" << Name << "\");\n"; O.indent(IndentLevel) << "vec.push_back(\"" << Name << "\");\n";
break; break;
case OptionType::Parameter: case OptionType::Parameter:
O.indent(IndentLevel) << "vec.push_back(\"" << Name << "\");\n"; O.indent(IndentLevel) << "vec.push_back(\"" << Name;
O.indent(IndentLevel) << "vec.push_back(" << D.GenVariableName() << ");\n";
if (!D.isForwardNotSplit()) {
O << "\");\n";
O.indent(IndentLevel) << "vec.push_back("
<< D.GenVariableName() << ");\n";
}
else {
O << "=\" + " << D.GenVariableName() << ");\n";
}
break; break;
case OptionType::Prefix: case OptionType::Prefix:
O.indent(IndentLevel) << "vec.push_back(\"" << Name << "\" + " O.indent(IndentLevel) << "vec.push_back(\"" << Name << "\" + "