forked from OSchip/llvm-project
Simplify llvm:🆑:Option by using a bit field instead of manual bit packing.
This still preserves the same total layout. Previously it looked like: *** Dumping AST Record Layout 0 | class llvm:🆑:Option 0 | (Option vtable pointer) 8 | int NumOccurrences 12 | int Flags 16 | unsigned int Position 20 | unsigned int AdditionalVals 24 | class llvm:🆑:Option * NextRegistered 32 | const char * ArgStr 40 | const char * HelpStr 48 | const char * ValueStr sizeof=56, dsize=56, align=8 nvsize=56, nvalign=8 Now it looks like: *** Dumping AST Record Layout 0 | class llvm:🆑:Option 0 | (Option vtable pointer) 8 | int NumOccurrences 12 | enum NumOccurrencesFlag Occurrences 12 | unsigned int Value 12 | enum OptionHidden HiddenFlag 12 | enum FormattingFlags Formatting 13 | unsigned int Misc 16 | unsigned int Position 20 | unsigned int AdditionalVals 24 | class llvm:🆑:Option * NextRegistered 32 | const char * ArgStr 40 | const char * HelpStr 48 | const char * ValueStr sizeof=56, dsize=56, align=8 nvsize=56, nvalign=8 llvm-svn: 148736
This commit is contained in:
parent
09edce0400
commit
3dc3af8ff2
|
@ -83,10 +83,10 @@ void MarkOptionsChanged();
|
|||
//
|
||||
|
||||
enum NumOccurrencesFlag { // Flags for the number of occurrences allowed
|
||||
Optional = 0x01, // Zero or One occurrence
|
||||
ZeroOrMore = 0x02, // Zero or more occurrences allowed
|
||||
Required = 0x03, // One occurrence required
|
||||
OneOrMore = 0x04, // One or more occurrences required
|
||||
Optional = 0x00, // Zero or One occurrence
|
||||
ZeroOrMore = 0x01, // Zero or more occurrences allowed
|
||||
Required = 0x02, // One occurrence required
|
||||
OneOrMore = 0x03, // One or more occurrences required
|
||||
|
||||
// ConsumeAfter - Indicates that this option is fed anything that follows the
|
||||
// last positional argument required by the application (it is an error if
|
||||
|
@ -95,23 +95,20 @@ enum NumOccurrencesFlag { // Flags for the number of occurrences allowed
|
|||
// found. Once a filename is found, all of the succeeding arguments are
|
||||
// passed, unprocessed, to the ConsumeAfter option.
|
||||
//
|
||||
ConsumeAfter = 0x05,
|
||||
|
||||
OccurrencesMask = 0x07
|
||||
ConsumeAfter = 0x04
|
||||
};
|
||||
|
||||
enum ValueExpected { // Is a value required for the option?
|
||||
ValueOptional = 0x08, // The value can appear... or not
|
||||
ValueRequired = 0x10, // The value is required to appear!
|
||||
ValueDisallowed = 0x18, // A value may not be specified (for flags)
|
||||
ValueMask = 0x18
|
||||
// zero reserved for the unspecified value
|
||||
ValueOptional = 0x01, // The value can appear... or not
|
||||
ValueRequired = 0x02, // The value is required to appear!
|
||||
ValueDisallowed = 0x03 // A value may not be specified (for flags)
|
||||
};
|
||||
|
||||
enum OptionHidden { // Control whether -help shows this option
|
||||
NotHidden = 0x20, // Option included in -help & -help-hidden
|
||||
Hidden = 0x40, // -help doesn't, but -help-hidden does
|
||||
ReallyHidden = 0x60, // Neither -help nor -help-hidden show this arg
|
||||
HiddenMask = 0x60
|
||||
NotHidden = 0x00, // Option included in -help & -help-hidden
|
||||
Hidden = 0x01, // -help doesn't, but -help-hidden does
|
||||
ReallyHidden = 0x02 // Neither -help nor -help-hidden show this arg
|
||||
};
|
||||
|
||||
// Formatting flags - This controls special features that the option might have
|
||||
|
@ -130,18 +127,16 @@ enum OptionHidden { // Control whether -help shows this option
|
|||
//
|
||||
|
||||
enum FormattingFlags {
|
||||
NormalFormatting = 0x000, // Nothing special
|
||||
Positional = 0x080, // Is a positional argument, no '-' required
|
||||
Prefix = 0x100, // Can this option directly prefix its value?
|
||||
Grouping = 0x180, // Can this option group with other options?
|
||||
FormattingMask = 0x180 // Union of the above flags.
|
||||
NormalFormatting = 0x00, // Nothing special
|
||||
Positional = 0x01, // Is a positional argument, no '-' required
|
||||
Prefix = 0x02, // Can this option directly prefix its value?
|
||||
Grouping = 0x03 // Can this option group with other options?
|
||||
};
|
||||
|
||||
enum MiscFlags { // Miscellaneous flags to adjust argument
|
||||
CommaSeparated = 0x200, // Should this cl::list split between commas?
|
||||
PositionalEatsArgs = 0x400, // Should this positional cl::list eat -args?
|
||||
Sink = 0x800, // Should this cl::list eat all unknown options?
|
||||
MiscMask = 0xE00 // Union of the above flags.
|
||||
CommaSeparated = 0x01, // Should this cl::list split between commas?
|
||||
PositionalEatsArgs = 0x02, // Should this positional cl::list eat -args?
|
||||
Sink = 0x04 // Should this cl::list eat all unknown options?
|
||||
};
|
||||
|
||||
|
||||
|
@ -168,7 +163,13 @@ class Option {
|
|||
virtual void anchor();
|
||||
|
||||
int NumOccurrences; // The number of times specified
|
||||
int Flags; // Flags for the argument
|
||||
enum NumOccurrencesFlag Occurrences : 3;
|
||||
// not using the enum type for 'Value' because zero is an implementation
|
||||
// detail representing the non-value
|
||||
unsigned Value : 2;
|
||||
enum OptionHidden HiddenFlag : 2;
|
||||
enum FormattingFlags Formatting : 2;
|
||||
unsigned Misc : 3;
|
||||
unsigned Position; // Position of last occurrence of the option
|
||||
unsigned AdditionalVals;// Greater than 0 for multi-valued option.
|
||||
Option *NextRegistered; // Singly linked list of registered options.
|
||||
|
@ -178,21 +179,20 @@ public:
|
|||
const char *ValueStr; // String describing what the value of this option is
|
||||
|
||||
inline enum NumOccurrencesFlag getNumOccurrencesFlag() const {
|
||||
return static_cast<enum NumOccurrencesFlag>(Flags & OccurrencesMask);
|
||||
return Occurrences;
|
||||
}
|
||||
inline enum ValueExpected getValueExpectedFlag() const {
|
||||
int VE = Flags & ValueMask;
|
||||
return VE ? static_cast<enum ValueExpected>(VE)
|
||||
return Value ? static_cast<enum ValueExpected>(Value)
|
||||
: getValueExpectedFlagDefault();
|
||||
}
|
||||
inline enum OptionHidden getOptionHiddenFlag() const {
|
||||
return static_cast<enum OptionHidden>(Flags & HiddenMask);
|
||||
return HiddenFlag;
|
||||
}
|
||||
inline enum FormattingFlags getFormattingFlag() const {
|
||||
return static_cast<enum FormattingFlags>(Flags & FormattingMask);
|
||||
return Formatting;
|
||||
}
|
||||
inline unsigned getMiscFlags() const {
|
||||
return Flags & MiscMask;
|
||||
return Misc;
|
||||
}
|
||||
inline unsigned getPosition() const { return Position; }
|
||||
inline unsigned getNumAdditionalVals() const { return AdditionalVals; }
|
||||
|
@ -206,27 +206,21 @@ public:
|
|||
void setArgStr(const char *S) { ArgStr = S; }
|
||||
void setDescription(const char *S) { HelpStr = S; }
|
||||
void setValueStr(const char *S) { ValueStr = S; }
|
||||
|
||||
void setFlag(unsigned Flag, unsigned FlagMask) {
|
||||
Flags &= ~FlagMask;
|
||||
Flags |= Flag;
|
||||
}
|
||||
|
||||
void setNumOccurrencesFlag(enum NumOccurrencesFlag Val) {
|
||||
setFlag(Val, OccurrencesMask);
|
||||
Occurrences = Val;
|
||||
}
|
||||
void setValueExpectedFlag(enum ValueExpected Val) { setFlag(Val, ValueMask); }
|
||||
void setHiddenFlag(enum OptionHidden Val) { setFlag(Val, HiddenMask); }
|
||||
void setFormattingFlag(enum FormattingFlags V) { setFlag(V, FormattingMask); }
|
||||
void setMiscFlag(enum MiscFlags M) { setFlag(M, M); }
|
||||
void setValueExpectedFlag(enum ValueExpected Val) { Value = Val; }
|
||||
void setHiddenFlag(enum OptionHidden Val) { HiddenFlag = Val; }
|
||||
void setFormattingFlag(enum FormattingFlags V) { Formatting = V; }
|
||||
void setMiscFlag(enum MiscFlags M) { Misc |= M; }
|
||||
void setPosition(unsigned pos) { Position = pos; }
|
||||
protected:
|
||||
explicit Option(unsigned DefaultFlags)
|
||||
: NumOccurrences(0), Flags(DefaultFlags | NormalFormatting), Position(0),
|
||||
explicit Option(enum NumOccurrencesFlag Occurrences,
|
||||
enum OptionHidden Hidden)
|
||||
: NumOccurrences(0), Occurrences(Occurrences), HiddenFlag(Hidden),
|
||||
Formatting(NormalFormatting), Position(0),
|
||||
AdditionalVals(0), NextRegistered(0),
|
||||
ArgStr(""), HelpStr(""), ValueStr("") {
|
||||
assert(getNumOccurrencesFlag() != 0 &&
|
||||
getOptionHiddenFlag() != 0 && "Not all default flags specified!");
|
||||
}
|
||||
|
||||
inline void setNumAdditionalVals(unsigned n) { AdditionalVals = n; }
|
||||
|
@ -1177,14 +1171,14 @@ public:
|
|||
|
||||
// One option...
|
||||
template<class M0t>
|
||||
explicit opt(const M0t &M0) : Option(Optional | NotHidden) {
|
||||
explicit opt(const M0t &M0) : Option(Optional, NotHidden) {
|
||||
apply(M0, this);
|
||||
done();
|
||||
}
|
||||
|
||||
// Two options...
|
||||
template<class M0t, class M1t>
|
||||
opt(const M0t &M0, const M1t &M1) : Option(Optional | NotHidden) {
|
||||
opt(const M0t &M0, const M1t &M1) : Option(Optional, NotHidden) {
|
||||
apply(M0, this); apply(M1, this);
|
||||
done();
|
||||
}
|
||||
|
@ -1192,21 +1186,21 @@ public:
|
|||
// Three options...
|
||||
template<class M0t, class M1t, class M2t>
|
||||
opt(const M0t &M0, const M1t &M1,
|
||||
const M2t &M2) : Option(Optional | NotHidden) {
|
||||
const M2t &M2) : Option(Optional, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this);
|
||||
done();
|
||||
}
|
||||
// Four options...
|
||||
template<class M0t, class M1t, class M2t, class M3t>
|
||||
opt(const M0t &M0, const M1t &M1, const M2t &M2,
|
||||
const M3t &M3) : Option(Optional | NotHidden) {
|
||||
const M3t &M3) : Option(Optional, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
done();
|
||||
}
|
||||
// Five options...
|
||||
template<class M0t, class M1t, class M2t, class M3t, class M4t>
|
||||
opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4) : Option(Optional | NotHidden) {
|
||||
const M4t &M4) : Option(Optional, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this);
|
||||
done();
|
||||
|
@ -1215,7 +1209,7 @@ public:
|
|||
template<class M0t, class M1t, class M2t, class M3t,
|
||||
class M4t, class M5t>
|
||||
opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5) : Option(Optional | NotHidden) {
|
||||
const M4t &M4, const M5t &M5) : Option(Optional, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this);
|
||||
done();
|
||||
|
@ -1225,7 +1219,7 @@ public:
|
|||
class M4t, class M5t, class M6t>
|
||||
opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5,
|
||||
const M6t &M6) : Option(Optional | NotHidden) {
|
||||
const M6t &M6) : Option(Optional, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this); apply(M6, this);
|
||||
done();
|
||||
|
@ -1235,7 +1229,7 @@ public:
|
|||
class M4t, class M5t, class M6t, class M7t>
|
||||
opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5, const M6t &M6,
|
||||
const M7t &M7) : Option(Optional | NotHidden) {
|
||||
const M7t &M7) : Option(Optional, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this);
|
||||
done();
|
||||
|
@ -1344,34 +1338,34 @@ public:
|
|||
|
||||
// One option...
|
||||
template<class M0t>
|
||||
explicit list(const M0t &M0) : Option(ZeroOrMore | NotHidden) {
|
||||
explicit list(const M0t &M0) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this);
|
||||
done();
|
||||
}
|
||||
// Two options...
|
||||
template<class M0t, class M1t>
|
||||
list(const M0t &M0, const M1t &M1) : Option(ZeroOrMore | NotHidden) {
|
||||
list(const M0t &M0, const M1t &M1) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this);
|
||||
done();
|
||||
}
|
||||
// Three options...
|
||||
template<class M0t, class M1t, class M2t>
|
||||
list(const M0t &M0, const M1t &M1, const M2t &M2)
|
||||
: Option(ZeroOrMore | NotHidden) {
|
||||
: Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this);
|
||||
done();
|
||||
}
|
||||
// Four options...
|
||||
template<class M0t, class M1t, class M2t, class M3t>
|
||||
list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3)
|
||||
: Option(ZeroOrMore | NotHidden) {
|
||||
: Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
done();
|
||||
}
|
||||
// Five options...
|
||||
template<class M0t, class M1t, class M2t, class M3t, class M4t>
|
||||
list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4) : Option(ZeroOrMore | NotHidden) {
|
||||
const M4t &M4) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this);
|
||||
done();
|
||||
|
@ -1380,7 +1374,7 @@ public:
|
|||
template<class M0t, class M1t, class M2t, class M3t,
|
||||
class M4t, class M5t>
|
||||
list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5) : Option(ZeroOrMore | NotHidden) {
|
||||
const M4t &M4, const M5t &M5) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this);
|
||||
done();
|
||||
|
@ -1390,7 +1384,7 @@ public:
|
|||
class M4t, class M5t, class M6t>
|
||||
list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5, const M6t &M6)
|
||||
: Option(ZeroOrMore | NotHidden) {
|
||||
: Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this); apply(M6, this);
|
||||
done();
|
||||
|
@ -1400,7 +1394,7 @@ public:
|
|||
class M4t, class M5t, class M6t, class M7t>
|
||||
list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5, const M6t &M6,
|
||||
const M7t &M7) : Option(ZeroOrMore | NotHidden) {
|
||||
const M7t &M7) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this);
|
||||
done();
|
||||
|
@ -1542,34 +1536,34 @@ public:
|
|||
|
||||
// One option...
|
||||
template<class M0t>
|
||||
explicit bits(const M0t &M0) : Option(ZeroOrMore | NotHidden) {
|
||||
explicit bits(const M0t &M0) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this);
|
||||
done();
|
||||
}
|
||||
// Two options...
|
||||
template<class M0t, class M1t>
|
||||
bits(const M0t &M0, const M1t &M1) : Option(ZeroOrMore | NotHidden) {
|
||||
bits(const M0t &M0, const M1t &M1) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this);
|
||||
done();
|
||||
}
|
||||
// Three options...
|
||||
template<class M0t, class M1t, class M2t>
|
||||
bits(const M0t &M0, const M1t &M1, const M2t &M2)
|
||||
: Option(ZeroOrMore | NotHidden) {
|
||||
: Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this);
|
||||
done();
|
||||
}
|
||||
// Four options...
|
||||
template<class M0t, class M1t, class M2t, class M3t>
|
||||
bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3)
|
||||
: Option(ZeroOrMore | NotHidden) {
|
||||
: Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
done();
|
||||
}
|
||||
// Five options...
|
||||
template<class M0t, class M1t, class M2t, class M3t, class M4t>
|
||||
bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4) : Option(ZeroOrMore | NotHidden) {
|
||||
const M4t &M4) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this);
|
||||
done();
|
||||
|
@ -1578,7 +1572,7 @@ public:
|
|||
template<class M0t, class M1t, class M2t, class M3t,
|
||||
class M4t, class M5t>
|
||||
bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5) : Option(ZeroOrMore | NotHidden) {
|
||||
const M4t &M4, const M5t &M5) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this);
|
||||
done();
|
||||
|
@ -1588,7 +1582,7 @@ public:
|
|||
class M4t, class M5t, class M6t>
|
||||
bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5, const M6t &M6)
|
||||
: Option(ZeroOrMore | NotHidden) {
|
||||
: Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this); apply(M6, this);
|
||||
done();
|
||||
|
@ -1598,7 +1592,7 @@ public:
|
|||
class M4t, class M5t, class M6t, class M7t>
|
||||
bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
|
||||
const M4t &M4, const M5t &M5, const M6t &M6,
|
||||
const M7t &M7) : Option(ZeroOrMore | NotHidden) {
|
||||
const M7t &M7) : Option(ZeroOrMore, NotHidden) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this);
|
||||
done();
|
||||
|
@ -1638,27 +1632,27 @@ public:
|
|||
|
||||
// One option...
|
||||
template<class M0t>
|
||||
explicit alias(const M0t &M0) : Option(Optional | Hidden), AliasFor(0) {
|
||||
explicit alias(const M0t &M0) : Option(Optional, Hidden), AliasFor(0) {
|
||||
apply(M0, this);
|
||||
done();
|
||||
}
|
||||
// Two options...
|
||||
template<class M0t, class M1t>
|
||||
alias(const M0t &M0, const M1t &M1) : Option(Optional | Hidden), AliasFor(0) {
|
||||
alias(const M0t &M0, const M1t &M1) : Option(Optional, Hidden), AliasFor(0) {
|
||||
apply(M0, this); apply(M1, this);
|
||||
done();
|
||||
}
|
||||
// Three options...
|
||||
template<class M0t, class M1t, class M2t>
|
||||
alias(const M0t &M0, const M1t &M1, const M2t &M2)
|
||||
: Option(Optional | Hidden), AliasFor(0) {
|
||||
: Option(Optional, Hidden), AliasFor(0) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this);
|
||||
done();
|
||||
}
|
||||
// Four options...
|
||||
template<class M0t, class M1t, class M2t, class M3t>
|
||||
alias(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3)
|
||||
: Option(Optional | Hidden), AliasFor(0) {
|
||||
: Option(Optional, Hidden), AliasFor(0) {
|
||||
apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
|
||||
done();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue