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

Reply via email to