diff options
author | Chris Lattner <sabre@nondot.org> | 2006-08-27 12:45:47 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-08-27 12:45:47 +0000 |
commit | 7422a761008ef63152417c5e69ddc31252fb6b10 (patch) | |
tree | ebb58495e8af383d095b34eb70f6a39bdc0c7208 /include/llvm/Support/CommandLine.h | |
parent | 0c0cc92762bdf34f26762eeaf66f6f8791428db5 (diff) | |
download | llvm-7422a761008ef63152417c5e69ddc31252fb6b10.tar.gz llvm-7422a761008ef63152417c5e69ddc31252fb6b10.tar.bz2 llvm-7422a761008ef63152417c5e69ddc31252fb6b10.tar.xz |
Add external definitions for commonly-used template specializations and add
anchor methods to others. This eliminates the vtable/template method bloat
in .o files that defining a cl::opt used to impose (~4K per .o file for one
cp::opt<unsigned>).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29909 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support/CommandLine.h')
-rw-r--r-- | include/llvm/Support/CommandLine.h | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h index b352686e6d..8af6b2adbf 100644 --- a/include/llvm/Support/CommandLine.h +++ b/include/llvm/Support/CommandLine.h @@ -22,6 +22,7 @@ #include "llvm/Support/type_traits.h" #include "llvm/Support/DataTypes.h" +#include "llvm/Support/Compiler.h" #include <string> #include <vector> #include <utility> @@ -509,6 +510,9 @@ struct basic_parser_impl { // non-template implementation of basic_parser<t> // getValueName - Overload in subclass to provide a better default value. virtual const char *getValueName() const { return "value"; } + + // An out-of-line virtual method to provide a 'home' for this class. + virtual void anchor(); }; // basic_parser - The real basic parser is just a template wrapper that provides @@ -519,7 +523,6 @@ struct basic_parser : public basic_parser_impl { typedef DataType parser_data_type; }; - //-------------------------------------------------- // parser<bool> // @@ -533,10 +536,15 @@ public: return ValueOptional; } - // getValueName - Do not print =<value> at all + // getValueName - Do not print =<value> at all. virtual const char *getValueName() const { return 0; } + + // An out-of-line virtual method to provide a 'home' for this class. + virtual void anchor(); }; +EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<bool>); + //-------------------------------------------------- // parser<int> @@ -549,8 +557,13 @@ public: // getValueName - Overload in subclass to provide a better default value. virtual const char *getValueName() const { return "int"; } + + // An out-of-line virtual method to provide a 'home' for this class. + virtual void anchor(); }; +EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<int>); + //-------------------------------------------------- // parser<unsigned> @@ -563,8 +576,12 @@ public: // getValueName - Overload in subclass to provide a better default value. virtual const char *getValueName() const { return "uint"; } + + // An out-of-line virtual method to provide a 'home' for this class. + virtual void anchor(); }; +EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<unsigned>); //-------------------------------------------------- // parser<double> @@ -577,8 +594,12 @@ public: // getValueName - Overload in subclass to provide a better default value. virtual const char *getValueName() const { return "number"; } + + // An out-of-line virtual method to provide a 'home' for this class. + virtual void anchor(); }; +EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<double>); //-------------------------------------------------- // parser<float> @@ -591,8 +612,12 @@ public: // getValueName - Overload in subclass to provide a better default value. virtual const char *getValueName() const { return "number"; } + + // An out-of-line virtual method to provide a 'home' for this class. + virtual void anchor(); }; +EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<float>); //-------------------------------------------------- // parser<std::string> @@ -609,8 +634,13 @@ public: // getValueName - Overload in subclass to provide a better default value. virtual const char *getValueName() const { return "string"; } + + // An out-of-line virtual method to provide a 'home' for this class. + virtual void anchor(); }; +EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<std::string>); + //===----------------------------------------------------------------------===// // applicator class - This class is used because we must use partial // specialization to handle literal string arguments specially (const char* does @@ -845,6 +875,11 @@ public: } }; +EXTERN_TEMPLATE_INSTANTIATION(class opt<unsigned>); +EXTERN_TEMPLATE_INSTANTIATION(class opt<int>); +EXTERN_TEMPLATE_INSTANTIATION(class opt<std::string>); +EXTERN_TEMPLATE_INSTANTIATION(class opt<bool>); + //===----------------------------------------------------------------------===// // list_storage class |