From: Chris Bieneman Date: Thu, 22 Jan 2015 21:01:12 +0000 (+0000) Subject: Refactoring cl::parser construction and initialization. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=40a218658ae01a78f1a5954390610644efcaa90b Refactoring cl::parser construction and initialization. Summary: Some parsers need references back to the option they are members of. This is used for handling the argument string as well as by the various pass name parsers for making pass names into flags. Making parsers that need to refer back to the option have a reference to the option eliminates some of the members of various parsers, and enables further code cleanup. Reviewers: dexonsmith Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D7131 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226864 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/CodeGen/MachinePassRegistry.h b/include/llvm/CodeGen/MachinePassRegistry.h index c962e687243..57d1a6d9b19 100644 --- a/include/llvm/CodeGen/MachinePassRegistry.h +++ b/include/llvm/CodeGen/MachinePassRegistry.h @@ -122,11 +122,12 @@ template 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(); diff --git a/include/llvm/IR/LegacyPassNameParser.h b/include/llvm/IR/LegacyPassNameParser.h index e2e4912ef64..52db1c3bff5 100644 --- a/include/llvm/IR/LegacyPassNameParser.h +++ b/include/llvm/IR/LegacyPassNameParser.h @@ -41,14 +41,12 @@ namespace llvm { // 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 @@ public: // 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"; diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h index 778ddce3901..2d75c59cf20 100644 --- a/include/llvm/Support/CommandLine.h +++ b/include/llvm/Support/CommandLine.h @@ -531,6 +531,8 @@ protected: }; 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 @@ public: 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 @@ public: // // If this is the case, we cannot allow a value. // - if (hasArgStr) + if (Owner.hasArgStr()) return ValueRequired; else return ValueDisallowed; @@ -609,7 +606,7 @@ public: unsigned findOption(const char *Name); protected: - bool hasArgStr; + Option &Owner; }; // Default parser implementation - This implementation depends on having a @@ -629,6 +626,7 @@ protected: 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 @@ public: // 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 @@ public: // 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 @@ public: 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 @@ protected: // 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 @@ public: // 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 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); // 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 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_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, int &Val); @@ -802,6 +807,8 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_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, unsigned &Val); @@ -823,6 +830,8 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_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, unsigned long long &Val); @@ -844,6 +853,8 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_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, double &Val); @@ -864,6 +875,8 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_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, float &Val); @@ -884,6 +897,8 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); // 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 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); // 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 @@ class opt : public Option, void done() { addArgument(); - Parser.initialize(*this); + Parser.initialize(); } // Command line options should not be copyable @@ -1187,7 +1204,7 @@ public: // One option... template explicit opt(const M0t &M0) - : Option(Optional, NotHidden) { + : Option(Optional, NotHidden), Parser(*this) { apply(M0, this); done(); } @@ -1195,7 +1212,7 @@ public: // 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 @@ public: // 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 @@ public: // 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 @@ public: // 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ class list : public Option, public list_storage { void done() { addArgument(); - Parser.initialize(*this); + Parser.initialize(); } // Command line options should not be copyable @@ -1385,14 +1402,14 @@ public: // 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 @@ public: // 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 @@ public: // 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ class bits : public Option, public bits_storage { void done() { addArgument(); - Parser.initialize(*this); + Parser.initialize(); } // Command line options should not be copyable @@ -1607,14 +1624,14 @@ public: // 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 @@ public: // 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 @@ public: // 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ public: 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); diff --git a/lib/IR/Pass.cpp b/lib/IR/Pass.cpp index 91d86ae40d1..df45460a6cc 100644 --- a/lib/IR/Pass.cpp +++ b/lib/IR/Pass.cpp @@ -223,8 +223,8 @@ void PassRegistrationListener::enumeratePasses() { PassRegistry::getPassRegistry()->enumerateWith(this); } -PassNameParser::PassNameParser() - : Opt(nullptr) { +PassNameParser::PassNameParser(cl::Option &O) + : cl::parser(O) { PassRegistry::getPassRegistry()->addRegistrationListener(this); }