@@ -82,7 +82,13 @@ namespace llvm {
8282 // / add a node to the executable's registry. Therefore it's not defined here
8383 // / to avoid it being instantiated in the plugin and is instead defined in
8484 // / the executable (see LLVM_INSTANTIATE_REGISTRY below).
85- static void add_node (node *N);
85+ static void add_node (node *N) {
86+ if (Tail)
87+ Tail->Next = N;
88+ else
89+ Head = N;
90+ Tail = N;
91+ }
8692
8793 // / Iterators for registry entries.
8894 // /
@@ -101,7 +107,7 @@ namespace llvm {
101107
102108 // begin is not defined here in order to avoid usage of an undefined static
103109 // data member, instead it's instantiated by LLVM_INSTANTIATE_REGISTRY.
104- static iterator begin ();
110+ static iterator begin () { return iterator (Head); }
105111 static iterator end () { return iterator (nullptr ); }
106112
107113 static iterator_range<iterator> entries () {
@@ -130,39 +136,22 @@ namespace llvm {
130136 }
131137 };
132138 };
139+
140+ template <typename T> typename Registry<T>::node *Registry<T>::Head = nullptr ;
141+ template <typename T> typename Registry<T>::node *Registry<T>::Tail = nullptr ;
133142} // end namespace llvm
134143
144+ #ifdef _WIN32
135145// / Instantiate a registry class.
136- // /
137- // / This provides template definitions of add_node, begin, and the Head and Tail
138- // / pointers, then explicitly instantiates them. We could explicitly specialize
139- // / them, instead of the two-step process of define then instantiate, but
140- // / strictly speaking that's not allowed by the C++ standard (we would need to
141- // / have explicit specialization declarations in all translation units where the
142- // / specialization is used) so we don't.
143- #define LLVM_INSTANTIATE_REGISTRY (REGISTRY_CLASS ) \
144- namespace llvm { \
145- template <typename T> \
146- typename Registry<T>::node *Registry<T>::Head = nullptr ; \
147- template <typename T> \
148- typename Registry<T>::node *Registry<T>::Tail = nullptr ; \
149- template <typename T> \
150- void Registry<T>::add_node(typename Registry<T>::node *N) { \
151- if (Tail) \
152- Tail->Next = N; \
153- else \
154- Head = N; \
155- Tail = N; \
156- } \
157- template <typename T> typename Registry<T>::iterator Registry<T>::begin() { \
158- return iterator (Head); \
159- } \
160- template REGISTRY_CLASS::node *Registry<REGISTRY_CLASS::type>::Head; \
161- template REGISTRY_CLASS::node *Registry<REGISTRY_CLASS::type>::Tail; \
162- template LLVM_ABI_EXPORT void \
163- Registry<REGISTRY_CLASS::type>::add_node(REGISTRY_CLASS::node *); \
164- template LLVM_ABI_EXPORT REGISTRY_CLASS::iterator \
165- Registry<REGISTRY_CLASS::type>::begin(); \
146+ #define LLVM_INSTANTIATE_REGISTRY (REGISTRY_CLASS ) \
147+ namespace llvm { \
148+ template class LLVM_ABI_EXPORT Registry<REGISTRY_CLASS::type>;\
149+ }
150+ #else
151+ #define LLVM_INSTANTIATE_REGISTRY (REGISTRY_CLASS ) \
152+ namespace llvm { \
153+ template class Registry <REGISTRY_CLASS>;\
166154 }
155+ #endif
167156
168157#endif // LLVM_SUPPORT_REGISTRY_H
0 commit comments