Author: Vassil Vassilev Date: 2024-10-16T06:03:45Z New Revision: b8882be26f00d2a053269948ee6ecaeff8db8eb8
URL: https://github.com/llvm/llvm-project/commit/b8882be26f00d2a053269948ee6ecaeff8db8eb8 DIFF: https://github.com/llvm/llvm-project/commit/b8882be26f00d2a053269948ee6ecaeff8db8eb8.diff LOG: Revert "Update llvm::Registry to work for LLVM shared library builds on windows (#109024)" This reverts commit 00cd1a06daa7f950cf0954c7f9fafc371c255639. This effectively reverts llvm/llvm-project#109024 Added: Modified: clang/include/clang/Basic/ParsedAttrInfo.h clang/include/clang/Frontend/FrontendPluginRegistry.h clang/include/clang/Lex/Preprocessor.h clang/include/clang/Tooling/CompilationDatabasePluginRegistry.h clang/include/clang/Tooling/ToolExecutorPluginRegistry.h llvm/include/llvm/CodeGen/GCMetadataPrinter.h llvm/include/llvm/IR/GCStrategy.h llvm/include/llvm/Support/Compiler.h llvm/include/llvm/Support/Registry.h Removed: ################################################################################ diff --git a/clang/include/clang/Basic/ParsedAttrInfo.h b/clang/include/clang/Basic/ParsedAttrInfo.h index 3b5f5d3c3f92ac..fab5c6f1377d27 100644 --- a/clang/include/clang/Basic/ParsedAttrInfo.h +++ b/clang/include/clang/Basic/ParsedAttrInfo.h @@ -17,7 +17,6 @@ #include "clang/Basic/AttrSubjectMatchRules.h" #include "clang/Basic/AttributeCommonInfo.h" -#include "clang/Support/Compiler.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/Support/Registry.h" #include <climits> @@ -176,8 +175,4 @@ const std::list<std::unique_ptr<ParsedAttrInfo>> &getAttributePluginInstances(); } // namespace clang -namespace llvm { -extern template class CLANG_TEMPLATE_ABI Registry<clang::ParsedAttrInfo>; -} // namespace llvm - #endif // LLVM_CLANG_BASIC_PARSEDATTRINFO_H diff --git a/clang/include/clang/Frontend/FrontendPluginRegistry.h b/clang/include/clang/Frontend/FrontendPluginRegistry.h index 5eea9c2fd89a32..810578534acb45 100644 --- a/clang/include/clang/Frontend/FrontendPluginRegistry.h +++ b/clang/include/clang/Frontend/FrontendPluginRegistry.h @@ -14,7 +14,6 @@ #define LLVM_CLANG_FRONTEND_FRONTENDPLUGINREGISTRY_H #include "clang/Frontend/FrontendAction.h" -#include "clang/Support/Compiler.h" #include "llvm/Support/Registry.h" namespace clang { @@ -24,8 +23,4 @@ using FrontendPluginRegistry = llvm::Registry<PluginASTAction>; } // namespace clang -namespace llvm { -extern template class CLANG_TEMPLATE_ABI Registry<clang::PluginASTAction>; -} // namespace llvm - #endif // LLVM_CLANG_FRONTEND_FRONTENDPLUGINREGISTRY_H diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 92749e4de44b57..4643b0213815f8 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -32,7 +32,6 @@ #include "clang/Lex/PPEmbedParameters.h" #include "clang/Lex/Token.h" #include "clang/Lex/TokenLexer.h" -#include "clang/Support/Compiler.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" @@ -3061,8 +3060,4 @@ using PragmaHandlerRegistry = llvm::Registry<PragmaHandler>; } // namespace clang -namespace llvm { -extern template class CLANG_TEMPLATE_ABI Registry<clang::PragmaHandler>; -} // namespace llvm - #endif // LLVM_CLANG_LEX_PREPROCESSOR_H diff --git a/clang/include/clang/Tooling/CompilationDatabasePluginRegistry.h b/clang/include/clang/Tooling/CompilationDatabasePluginRegistry.h index e6bcac542b0ecb..8c58ad926a402a 100644 --- a/clang/include/clang/Tooling/CompilationDatabasePluginRegistry.h +++ b/clang/include/clang/Tooling/CompilationDatabasePluginRegistry.h @@ -9,7 +9,6 @@ #ifndef LLVM_CLANG_TOOLING_COMPILATIONDATABASEPLUGINREGISTRY_H #define LLVM_CLANG_TOOLING_COMPILATIONDATABASEPLUGINREGISTRY_H -#include "clang/Support/Compiler.h" #include "clang/Tooling/CompilationDatabase.h" #include "llvm/Support/Registry.h" @@ -43,9 +42,4 @@ using CompilationDatabasePluginRegistry = } // namespace tooling } // namespace clang -namespace llvm { -extern template class CLANG_TEMPLATE_ABI - Registry<clang::tooling::CompilationDatabasePlugin>; -} // namespace llvm - #endif // LLVM_CLANG_TOOLING_COMPILATIONDATABASEPLUGINREGISTRY_H diff --git a/clang/include/clang/Tooling/ToolExecutorPluginRegistry.h b/clang/include/clang/Tooling/ToolExecutorPluginRegistry.h index 8d54583234684e..5304ff26252def 100644 --- a/clang/include/clang/Tooling/ToolExecutorPluginRegistry.h +++ b/clang/include/clang/Tooling/ToolExecutorPluginRegistry.h @@ -9,7 +9,6 @@ #ifndef LLVM_CLANG_TOOLING_TOOLEXECUTORPLUGINREGISTRY_H #define LLVM_CLANG_TOOLING_TOOLEXECUTORPLUGINREGISTRY_H -#include "clang/Support/Compiler.h" #include "clang/Tooling/Execution.h" #include "llvm/Support/Registry.h" @@ -21,9 +20,4 @@ using ToolExecutorPluginRegistry = llvm::Registry<ToolExecutorPlugin>; } // namespace tooling } // namespace clang -namespace llvm { -extern template class CLANG_TEMPLATE_ABI - Registry<clang::tooling::ToolExecutorPlugin>; -} // namespace llvm - #endif // LLVM_CLANG_TOOLING_TOOLEXECUTORPLUGINREGISTRY_H diff --git a/llvm/include/llvm/CodeGen/GCMetadataPrinter.h b/llvm/include/llvm/CodeGen/GCMetadataPrinter.h index 9d421be8313f01..f9527c9f8752e9 100644 --- a/llvm/include/llvm/CodeGen/GCMetadataPrinter.h +++ b/llvm/include/llvm/CodeGen/GCMetadataPrinter.h @@ -34,8 +34,6 @@ class StackMaps; /// defaults from Registry. using GCMetadataPrinterRegistry = Registry<GCMetadataPrinter>; -extern template class LLVM_TEMPLATE_ABI Registry<GCMetadataPrinter>; - /// GCMetadataPrinter - Emits GC metadata as assembly code. Instances are /// created, managed, and owned by the AsmPrinter. class GCMetadataPrinter { diff --git a/llvm/include/llvm/IR/GCStrategy.h b/llvm/include/llvm/IR/GCStrategy.h index cbfbe23aaa0683..3186465f001812 100644 --- a/llvm/include/llvm/IR/GCStrategy.h +++ b/llvm/include/llvm/IR/GCStrategy.h @@ -141,8 +141,6 @@ class GCStrategy { /// GCMetadataPrinterRegistery as well. using GCRegistry = Registry<GCStrategy>; -extern template class LLVM_TEMPLATE_ABI Registry<GCStrategy>; - /// Lookup the GCStrategy object associated with the given gc name. std::unique_ptr<GCStrategy> getGCStrategy(const StringRef Name); diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h index ab0cbff43d749c..1d2d751d4dc11a 100644 --- a/llvm/include/llvm/Support/Compiler.h +++ b/llvm/include/llvm/Support/Compiler.h @@ -153,12 +153,6 @@ /// exported when llvm is built as a shared library with everything else that is /// unannotated will have internal visibility. /// -/// LLVM_ABI_EXPORT is for the special case for things like plugin symbol -/// declarations or definitions where we don't want the macro to be switching -/// between dllexport and dllimport on windows based on what codebase is being -/// built, it will only be dllexport. For non windows platforms this macro -/// behaves the same as LLVM_ABI. -/// /// LLVM_EXPORT_TEMPLATE is used on explicit template instantiations in source /// files that were declared extern in a header. This macro is only set as a /// compiler export attribute on windows, on other platforms it does nothing. @@ -185,7 +179,6 @@ #define LLVM_ABI #define LLVM_TEMPLATE_ABI #define LLVM_EXPORT_TEMPLATE -#define LLVM_ABI_EXPORT #elif defined(_WIN32) && !defined(__MINGW32__) #if defined(LLVM_EXPORTS) #define LLVM_ABI __declspec(dllexport) @@ -196,23 +189,19 @@ #define LLVM_TEMPLATE_ABI __declspec(dllimport) #define LLVM_EXPORT_TEMPLATE #endif -#define LLVM_ABI_EXPORT __declspec(dllexport) #elif defined(__ELF__) || defined(__MINGW32__) || defined(_AIX) #define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #define LLVM_TEMPLATE_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #define LLVM_EXPORT_TEMPLATE -#define LLVM_ABI_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #elif defined(__MACH__) || defined(__WASM__) #define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #define LLVM_TEMPLATE_ABI #define LLVM_EXPORT_TEMPLATE -#define LLVM_ABI_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #endif #else #define LLVM_ABI #define LLVM_TEMPLATE_ABI #define LLVM_EXPORT_TEMPLATE -#define LLVM_ABI_EXPORT #endif #define LLVM_C_ABI LLVM_ABI #endif diff --git a/llvm/include/llvm/Support/Registry.h b/llvm/include/llvm/Support/Registry.h index ff9226c39359c5..5bb6a254a47f4c 100644 --- a/llvm/include/llvm/Support/Registry.h +++ b/llvm/include/llvm/Support/Registry.h @@ -53,13 +53,7 @@ namespace llvm { Registry() = delete; friend class node; - // These must be must two separate declarations to workaround a 20 year - // old MSVC bug with dllexport and multiple static fields in the same - // declaration causing error C2487 "member of dll interface class may not - // be declared with dll interface". - // https://developercommunity.visualstudio.com/t/c2487-in-dllexport-class-with-static-members/69878 - static node *Head; - static node *Tail; + static node *Head, *Tail; public: /// Node in linked list of entries. @@ -82,13 +76,7 @@ namespace llvm { /// add a node to the executable's registry. Therefore it's not defined here /// to avoid it being instantiated in the plugin and is instead defined in /// the executable (see LLVM_INSTANTIATE_REGISTRY below). - static void add_node(node *N) { - if (Tail) - Tail->Next = N; - else - Head = N; - Tail = N; - } + static void add_node(node *N); /// Iterators for registry entries. /// @@ -107,7 +95,7 @@ namespace llvm { // begin is not defined here in order to avoid usage of an undefined static // data member, instead it's instantiated by LLVM_INSTANTIATE_REGISTRY. - static iterator begin() { return iterator(Head); } + static iterator begin(); static iterator end() { return iterator(nullptr); } static iterator_range<iterator> entries() { @@ -136,28 +124,36 @@ namespace llvm { } }; }; - } // end namespace llvm -#ifdef _WIN32 /// Instantiate a registry class. -#define LLVM_INSTANTIATE_REGISTRY(REGISTRY_CLASS) \ - namespace llvm { \ - template <typename T> \ - typename Registry<T>::node *Registry<T>::Head = nullptr; \ - template <typename T> \ - typename Registry<T>::node *Registry<T>::Tail = nullptr; \ - template class LLVM_ABI_EXPORT Registry<REGISTRY_CLASS::type>; \ - } -#else -#define LLVM_INSTANTIATE_REGISTRY(REGISTRY_CLASS) \ - namespace llvm { \ - template <typename T> \ - typename Registry<T>::node *Registry<T>::Head = nullptr; \ - template <typename T> \ - typename Registry<T>::node *Registry<T>::Tail = nullptr; \ - template class Registry<REGISTRY_CLASS::type>; \ +/// +/// This provides template definitions of add_node, begin, and the Head and Tail +/// pointers, then explicitly instantiates them. We could explicitly specialize +/// them, instead of the two-step process of define then instantiate, but +/// strictly speaking that's not allowed by the C++ standard (we would need to +/// have explicit specialization declarations in all translation units where the +/// specialization is used) so we don't. +#define LLVM_INSTANTIATE_REGISTRY(REGISTRY_CLASS) \ + namespace llvm { \ + template<typename T> typename Registry<T>::node *Registry<T>::Head = nullptr;\ + template<typename T> typename Registry<T>::node *Registry<T>::Tail = nullptr;\ + template<typename T> \ + void Registry<T>::add_node(typename Registry<T>::node *N) { \ + if (Tail) \ + Tail->Next = N; \ + else \ + Head = N; \ + Tail = N; \ + } \ + template<typename T> typename Registry<T>::iterator Registry<T>::begin() { \ + return iterator(Head); \ + } \ + template REGISTRY_CLASS::node *Registry<REGISTRY_CLASS::type>::Head; \ + template REGISTRY_CLASS::node *Registry<REGISTRY_CLASS::type>::Tail; \ + template \ + void Registry<REGISTRY_CLASS::type>::add_node(REGISTRY_CLASS::node*); \ + template REGISTRY_CLASS::iterator Registry<REGISTRY_CLASS::type>::begin(); \ } -#endif #endif // LLVM_SUPPORT_REGISTRY_H _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits