diff options
author | River Riddle <riverriddle@google.com> | 2019-12-19 16:57:03 -0800 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2019-12-19 17:01:22 -0800 |
commit | a77a290a4dbb1db2de4cf48c0599f8e3a3c86c53 (patch) | |
tree | 1c09a5af3db4462374aac35c0d342e4115da6511 | |
parent | 99f72d90cae518163e1602573d5a8f60c1302a5c (diff) | |
download | bcm5719-llvm-a77a290a4dbb1db2de4cf48c0599f8e3a3c86c53.tar.gz bcm5719-llvm-a77a290a4dbb1db2de4cf48c0599f8e3a3c86c53.zip |
[CommandLine] Add template instantiations of cl::parser for long and long long.
This allows cl::opt<int64_t>.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D71729
-rw-r--r-- | llvm/include/llvm/Support/CommandLine.h | 44 | ||||
-rw-r--r-- | llvm/lib/Support/CommandLine.cpp | 24 |
2 files changed, 68 insertions, 0 deletions
diff --git a/llvm/include/llvm/Support/CommandLine.h b/llvm/include/llvm/Support/CommandLine.h index 8a67546c747..05374e34aa7 100644 --- a/llvm/include/llvm/Support/CommandLine.h +++ b/llvm/include/llvm/Support/CommandLine.h @@ -992,6 +992,50 @@ public: extern template class basic_parser<int>; //-------------------------------------------------- +// parser<long> +// +template <> class parser<long> final : public basic_parser<long> { +public: + parser(Option &O) : basic_parser(O) {} + + // parse - Return true on error. + bool parse(Option &O, StringRef ArgName, StringRef Arg, long &Val); + + // getValueName - Overload in subclass to provide a better default value. + StringRef getValueName() const override { return "long"; } + + void printOptionDiff(const Option &O, long V, OptVal Default, + size_t GlobalWidth) const; + + // An out-of-line virtual method to provide a 'home' for this class. + void anchor() override; +}; + +extern template class basic_parser<long>; + +//-------------------------------------------------- +// parser<long long> +// +template <> class parser<long long> : public basic_parser<long long> { +public: + parser(Option &O) : basic_parser(O) {} + + // parse - Return true on error. + bool parse(Option &O, StringRef ArgName, StringRef Arg, long long &Val); + + // getValueName - Overload in subclass to provide a better default value. + StringRef getValueName() const override { return "long"; } + + void printOptionDiff(const Option &O, long long V, OptVal Default, + size_t GlobalWidth) const; + + // An out-of-line virtual method to provide a 'home' for this class. + void anchor() override; +}; + +extern template class basic_parser<long long>; + +//-------------------------------------------------- // parser<unsigned> // template <> class parser<unsigned> : public basic_parser<unsigned> { diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp index 1f424075d47..ce1463462b1 100644 --- a/llvm/lib/Support/CommandLine.cpp +++ b/llvm/lib/Support/CommandLine.cpp @@ -57,6 +57,8 @@ namespace cl { template class basic_parser<bool>; template class basic_parser<boolOrDefault>; template class basic_parser<int>; +template class basic_parser<long>; +template class basic_parser<long long>; template class basic_parser<unsigned>; template class basic_parser<unsigned long>; template class basic_parser<unsigned long long>; @@ -82,6 +84,8 @@ void basic_parser_impl::anchor() {} void parser<bool>::anchor() {} void parser<boolOrDefault>::anchor() {} void parser<int>::anchor() {} +void parser<long>::anchor() {} +void parser<long long>::anchor() {} void parser<unsigned>::anchor() {} void parser<unsigned long>::anchor() {} void parser<unsigned long long>::anchor() {} @@ -1806,6 +1810,24 @@ bool parser<int>::parse(Option &O, StringRef ArgName, StringRef Arg, return false; } +// parser<long> implementation +// +bool parser<long>::parse(Option &O, StringRef ArgName, StringRef Arg, + long &Value) { + if (Arg.getAsInteger(0, Value)) + return O.error("'" + Arg + "' value invalid for long argument!"); + return false; +} + +// parser<long long> implementation +// +bool parser<long long>::parse(Option &O, StringRef ArgName, StringRef Arg, + long long &Value) { + if (Arg.getAsInteger(0, Value)) + return O.error("'" + Arg + "' value invalid for llong argument!"); + return false; +} + // parser<unsigned> implementation // bool parser<unsigned>::parse(Option &O, StringRef ArgName, StringRef Arg, @@ -2015,6 +2037,8 @@ void generic_parser_base::printGenericOptionDiff( PRINT_OPT_DIFF(bool) PRINT_OPT_DIFF(boolOrDefault) PRINT_OPT_DIFF(int) +PRINT_OPT_DIFF(long) +PRINT_OPT_DIFF(long long) PRINT_OPT_DIFF(unsigned) PRINT_OPT_DIFF(unsigned long) PRINT_OPT_DIFF(unsigned long long) |