From a77a290a4dbb1db2de4cf48c0599f8e3a3c86c53 Mon Sep 17 00:00:00 2001 From: River Riddle Date: Thu, 19 Dec 2019 16:57:03 -0800 Subject: [PATCH] [CommandLine] Add template instantiations of cl::parser for long and long long. This allows cl::opt. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D71729 --- llvm/include/llvm/Support/CommandLine.h | 44 +++++++++++++++++++++++++++++++++ llvm/lib/Support/CommandLine.cpp | 24 ++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/llvm/include/llvm/Support/CommandLine.h b/llvm/include/llvm/Support/CommandLine.h index 8a67546..05374e3 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; //-------------------------------------------------- +// parser +// +template <> class parser final : public basic_parser { +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; + +//-------------------------------------------------- +// 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, 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; + +//-------------------------------------------------- // parser // template <> class parser : public basic_parser { diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp index 1f42407..ce14634 100644 --- a/llvm/lib/Support/CommandLine.cpp +++ b/llvm/lib/Support/CommandLine.cpp @@ -57,6 +57,8 @@ namespace cl { template class basic_parser; template class basic_parser; template class basic_parser; +template class basic_parser; +template class basic_parser; template class basic_parser; template class basic_parser; template class basic_parser; @@ -82,6 +84,8 @@ void basic_parser_impl::anchor() {} void parser::anchor() {} void parser::anchor() {} void parser::anchor() {} +void parser::anchor() {} +void parser::anchor() {} void parser::anchor() {} void parser::anchor() {} void parser::anchor() {} @@ -1806,6 +1810,24 @@ bool parser::parse(Option &O, StringRef ArgName, StringRef Arg, return false; } +// parser implementation +// +bool parser::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 implementation +// +bool parser::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 implementation // bool parser::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) -- 2.7.4