Index: llvm/trunk/include/llvm/CodeGen/MachinePassRegistry.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/MachinePassRegistry.h +++ llvm/trunk/include/llvm/CodeGen/MachinePassRegistry.h @@ -122,11 +122,12 @@ class RegisterPassParser : public MachinePassRegistryListener, public cl::parser { public: - RegisterPassParser() {} + RegisterPassParser(cl::Option &O) + : cl::parser(O) {} ~RegisterPassParser() { RegistryClass::setListener(nullptr); } - void initialize(cl::Option &O) { - cl::parser::initialize(O); + void initialize() { + cl::parser::initialize(); // Add existing passes to option. for (RegistryClass *Node = RegistryClass::getList(); Index: llvm/trunk/include/llvm/IR/LegacyPassNameParser.h =================================================================== --- llvm/trunk/include/llvm/IR/LegacyPassNameParser.h +++ llvm/trunk/include/llvm/IR/LegacyPassNameParser.h @@ -41,14 +41,12 @@ // class PassNameParser : public PassRegistrationListener, public cl::parser { - cl::Option *Opt; public: - PassNameParser(); + PassNameParser(cl::Option &O); virtual ~PassNameParser(); - void initialize(cl::Option &O) { - Opt = &O; - cl::parser::initialize(O); + void initialize() { + cl::parser::initialize(); // Add all of the passes to the map that got initialized before 'this' did. enumeratePasses(); @@ -69,7 +67,7 @@ // Implement the PassRegistrationListener callbacks used to populate our map // void passRegistered(const PassInfo *P) override { - if (ignorablePass(P) || !Opt) return; + if (ignorablePass(P)) return; if (findOption(P->getPassArgument()) != getNumOptions()) { errs() << "Two passes with the same argument (-" << P->getPassArgument() << ") attempted to be registered!\n"; Index: llvm/trunk/include/llvm/Support/CommandLine.h =================================================================== --- llvm/trunk/include/llvm/Support/CommandLine.h +++ llvm/trunk/include/llvm/Support/CommandLine.h @@ -531,6 +531,8 @@ }; public: + generic_parser_base(Option &O) : Owner(O) {} + virtual ~generic_parser_base() {} // Base class should have virtual-dtor // getNumOptions - Virtual function implemented by generic subclass to @@ -569,18 +571,13 @@ printGenericOptionDiff(O, V, Default, GlobalWidth); } - void initialize(Option &O) { - // All of the modifiers for the option have been processed by now, so the - // argstr field should be stable, copy it down now. - // - hasArgStr = O.hasArgStr(); - } + void initialize() {} void getExtraOptionNames(SmallVectorImpl &OptionNames) { // If there has been no argstr specified, that means that we need to add an // argument for every possible option. This ensures that our options are // vectored to us. - if (!hasArgStr) + if (!Owner.hasArgStr()) for (unsigned i = 0, e = getNumOptions(); i != e; ++i) OptionNames.push_back(getOption(i)); } @@ -597,7 +594,7 @@ // // If this is the case, we cannot allow a value. // - if (hasArgStr) + if (Owner.hasArgStr()) return ValueRequired; else return ValueDisallowed; @@ -609,7 +606,7 @@ unsigned findOption(const char *Name); protected: - bool hasArgStr; + Option &Owner; }; // Default parser implementation - This implementation depends on having a @@ -629,6 +626,7 @@ SmallVector Values; public: + parser(Option &O) : generic_parser_base(O) {} typedef DataType parser_data_type; // Implement virtual functions needed by generic_parser_base @@ -646,7 +644,7 @@ // parse - Return true on error. bool parse(Option &O, StringRef ArgName, StringRef Arg, DataType &V) { StringRef ArgVal; - if (hasArgStr) + if (Owner.hasArgStr()) ArgVal = Arg; else ArgVal = ArgName; @@ -684,6 +682,8 @@ // class basic_parser_impl { // non-template implementation of basic_parser public: + basic_parser_impl(Option &O) {} + virtual ~basic_parser_impl() {} enum ValueExpected getValueExpectedFlagDefault() const { @@ -692,7 +692,7 @@ void getExtraOptionNames(SmallVectorImpl &) {} - void initialize(Option &) {} + void initialize() {} // Return the width of the option tag for printing... size_t getOptionWidth(const Option &O) const; @@ -722,6 +722,7 @@ // template class basic_parser : public basic_parser_impl { public: + basic_parser(Option &O) : basic_parser_impl(O) {} typedef DataType parser_data_type; typedef OptionValue OptVal; }; @@ -730,13 +731,13 @@ // parser // template <> class parser : public basic_parser { - const char *ArgStr; - public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &O, StringRef ArgName, StringRef Arg, bool &Val); - template void initialize(Opt &O) { ArgStr = O.ArgStr; } + void initialize() {} enum ValueExpected getValueExpectedFlagDefault() const { return ValueOptional; @@ -758,6 +759,8 @@ // parser template <> class parser : public basic_parser { public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &O, StringRef ArgName, StringRef Arg, boolOrDefault &Val); @@ -782,6 +785,8 @@ // template <> class parser : public basic_parser { public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &O, StringRef ArgName, StringRef Arg, int &Val); @@ -802,6 +807,8 @@ // template <> class parser : public basic_parser { public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &O, StringRef ArgName, StringRef Arg, unsigned &Val); @@ -823,6 +830,8 @@ template <> class parser : public basic_parser { public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &O, StringRef ArgName, StringRef Arg, unsigned long long &Val); @@ -844,6 +853,8 @@ // template <> class parser : public basic_parser { public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &O, StringRef ArgName, StringRef Arg, double &Val); @@ -864,6 +875,8 @@ // template <> class parser : public basic_parser { public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &O, StringRef ArgName, StringRef Arg, float &Val); @@ -884,6 +897,8 @@ // template <> class parser : public basic_parser { public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &, StringRef, StringRef Arg, std::string &Value) { Value = Arg.str(); @@ -907,6 +922,8 @@ // template <> class parser : public basic_parser { public: + parser(Option &O) : basic_parser(O) {} + // parse - Return true on error. bool parse(Option &, StringRef, StringRef Arg, char &Value) { Value = Arg[0]; @@ -1166,7 +1183,7 @@ void done() { addArgument(); - Parser.initialize(*this); + Parser.initialize(); } // Command line options should not be copyable @@ -1187,7 +1204,7 @@ // One option... template explicit opt(const M0t &M0) - : Option(Optional, NotHidden) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); done(); } @@ -1195,7 +1212,7 @@ // Two options... template opt(const M0t &M0, const M1t &M1) - : Option(Optional, NotHidden) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); done(); @@ -1204,7 +1221,7 @@ // Three options... template opt(const M0t &M0, const M1t &M1, const M2t &M2) - : Option(Optional, NotHidden) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1213,7 +1230,7 @@ // Four options... template opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) - : Option(Optional, NotHidden) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1223,7 +1240,7 @@ // Five options... template opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4) - : Option(Optional, NotHidden) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1235,7 +1252,7 @@ template opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4, const M5t &M5) - : Option(Optional, NotHidden) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1249,7 +1266,7 @@ 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) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1264,7 +1281,7 @@ 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) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1365,7 +1382,7 @@ void done() { addArgument(); - Parser.initialize(*this); + Parser.initialize(); } // Command line options should not be copyable @@ -1385,14 +1402,14 @@ // One option... template explicit list(const M0t &M0) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); done(); } // Two options... template list(const M0t &M0, const M1t &M1) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); done(); @@ -1400,7 +1417,7 @@ // Three options... template list(const M0t &M0, const M1t &M1, const M2t &M2) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1409,7 +1426,7 @@ // Four options... template list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1420,7 +1437,7 @@ template list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1432,7 +1449,7 @@ template list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4, const M5t &M5) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1446,7 +1463,7 @@ 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), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1461,7 +1478,7 @@ 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) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1589,7 +1606,7 @@ void done() { addArgument(); - Parser.initialize(*this); + Parser.initialize(); } // Command line options should not be copyable @@ -1607,14 +1624,14 @@ // One option... template explicit bits(const M0t &M0) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); done(); } // Two options... template bits(const M0t &M0, const M1t &M1) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); done(); @@ -1622,7 +1639,7 @@ // Three options... template bits(const M0t &M0, const M1t &M1, const M2t &M2) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1631,7 +1648,7 @@ // Four options... template bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1642,7 +1659,7 @@ template bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1654,7 +1671,7 @@ template bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, const M4t &M4, const M5t &M5) - : Option(ZeroOrMore, NotHidden) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1668,7 +1685,7 @@ 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), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); @@ -1683,7 +1700,7 @@ 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) { + : Option(ZeroOrMore, NotHidden), Parser(*this) { apply(M0, this); apply(M1, this); apply(M2, this); Index: llvm/trunk/lib/IR/Pass.cpp =================================================================== --- llvm/trunk/lib/IR/Pass.cpp +++ llvm/trunk/lib/IR/Pass.cpp @@ -223,8 +223,8 @@ PassRegistry::getPassRegistry()->enumerateWith(this); } -PassNameParser::PassNameParser() - : Opt(nullptr) { +PassNameParser::PassNameParser(cl::Option &O) + : cl::parser(O) { PassRegistry::getPassRegistry()->addRegistrationListener(this); }