From 91f098c9f77ba1740947e0c652927d8cc17ff0a1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 27 Aug 2006 12:45:47 +0000 Subject: [PATCH] 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). llvm-svn: 29909 --- include/llvm/Support/CommandLine.h | 39 ++++++++++++++++++++++++++++-- lib/Support/CommandLine.cpp | 35 +++++++++++++++++++++------ 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h index b352686e6d9..8af6b2adbf7 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 #include #include @@ -509,6 +510,9 @@ struct basic_parser_impl { // non-template implementation of basic_parser // 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 // @@ -533,10 +536,15 @@ public: return ValueOptional; } - // getValueName - Do not print = at all + // getValueName - Do not print = 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); + //-------------------------------------------------- // parser @@ -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); + //-------------------------------------------------- // parser @@ -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); //-------------------------------------------------- // parser @@ -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); //-------------------------------------------------- // parser @@ -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); //-------------------------------------------------- // parser @@ -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); + //===----------------------------------------------------------------------===// // 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); +EXTERN_TEMPLATE_INSTANTIATION(class opt); +EXTERN_TEMPLATE_INSTANTIATION(class opt); +EXTERN_TEMPLATE_INSTANTIATION(class opt); + //===----------------------------------------------------------------------===// // list_storage class diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp index 863f5e349dd..d9e5cf9f474 100644 --- a/lib/Support/CommandLine.cpp +++ b/lib/Support/CommandLine.cpp @@ -28,11 +28,36 @@ #include #include using namespace llvm; - using namespace cl; +//===----------------------------------------------------------------------===// +// Template instantiations and anchors. +// +TEMPLATE_INSTANTIATION(class basic_parser); +TEMPLATE_INSTANTIATION(class basic_parser); +TEMPLATE_INSTANTIATION(class basic_parser); +TEMPLATE_INSTANTIATION(class basic_parser); +TEMPLATE_INSTANTIATION(class basic_parser); +TEMPLATE_INSTANTIATION(class basic_parser); + +TEMPLATE_INSTANTIATION(class opt); +TEMPLATE_INSTANTIATION(class opt); +TEMPLATE_INSTANTIATION(class opt); +TEMPLATE_INSTANTIATION(class opt); + +void Option::anchor() {} +void basic_parser_impl::anchor() {} +void parser::anchor() {} +void parser::anchor() {} +void parser::anchor() {} +void parser::anchor() {} +void parser::anchor() {} +void parser::anchor() {} + +//===----------------------------------------------------------------------===// + // Globals for name and overview of program -static std::string ProgramName ( "" ); +static std::string ProgramName = ""; static const char *ProgramOverview = 0; // This collects additional help to be printed. @@ -47,7 +72,7 @@ extrahelp::extrahelp(const char* Help) } //===----------------------------------------------------------------------===// -// Basic, shared command line option processing machinery... +// Basic, shared command line option processing machinery. // // Return the global command line option vector. Making it a function scoped @@ -596,10 +621,6 @@ void cl::ParseCommandLineOptions(int &argc, char **argv, // Option Base class implementation // -// Out of line virtual function to provide home for the class. -void Option::anchor() { -} - bool Option::error(std::string Message, const char *ArgName) { if (ArgName == 0) ArgName = ArgStr; if (ArgName[0] == 0)