Option: Propagate flags from groups to options in each group

This should make it easy to set a flag for a whole group of clang driver
options.

llvm-svn: 212865
This commit is contained in:
Reid Kleckner 2014-07-12 00:18:58 +00:00
parent 5d10284238
commit 9ef63b2836
2 changed files with 16 additions and 11 deletions

View File

@ -75,6 +75,7 @@ class OptionGroup<string name> {
string Name = name;
string HelpText = ?;
OptionGroup Group = ?;
list<OptionFlag> Flags = [];
}
// Define the option class.

View File

@ -221,9 +221,11 @@ void EmitOptParser(RecordKeeper &Records, raw_ostream &OS) {
// The containing option group (if any).
OS << ", ";
if (const DefInit *DI = dyn_cast<DefInit>(R.getValueInit("Group")))
const ListInit *GroupFlags = nullptr;
if (const DefInit *DI = dyn_cast<DefInit>(R.getValueInit("Group"))) {
GroupFlags = DI->getDef()->getValueAsListInit("Flags");
OS << getOptionName(*DI->getDef());
else
} else
OS << "INVALID";
// The option alias (if any).
@ -249,17 +251,19 @@ void EmitOptParser(RecordKeeper &Records, raw_ostream &OS) {
}
// The option flags.
OS << ", ";
int NumFlags = 0;
const ListInit *LI = R.getValueAsListInit("Flags");
if (LI->empty()) {
OS << ", 0";
} else {
OS << ", ";
for (unsigned i = 0, e = LI->size(); i != e; ++i) {
if (i)
OS << " | ";
OS << cast<DefInit>(LI->getElement(i))->getDef()->getName();
}
for (Init *I : *LI)
OS << (NumFlags++ ? " | " : "")
<< cast<DefInit>(I)->getDef()->getName();
if (GroupFlags) {
for (Init *I : *GroupFlags)
OS << (NumFlags++ ? " | " : "")
<< cast<DefInit>(I)->getDef()->getName();
}
if (NumFlags == 0)
OS << '0';
// The option parameter field.
OS << ", " << R.getValueAsInt("NumArgs");