summaryrefslogtreecommitdiff
path: root/include/llvm/Support/CommandLine.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-08-27 12:45:47 +0000
committerChris Lattner <sabre@nondot.org>2006-08-27 12:45:47 +0000
commit7422a761008ef63152417c5e69ddc31252fb6b10 (patch)
treeebb58495e8af383d095b34eb70f6a39bdc0c7208 /include/llvm/Support/CommandLine.h
parent0c0cc92762bdf34f26762eeaf66f6f8791428db5 (diff)
downloadllvm-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.h39
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