Revert r276973 "Adjust Registry interface to not require plugins to export a registry"
authorJohn Brawn <john.brawn@arm.com>
Thu, 28 Jul 2016 17:17:22 +0000 (17:17 +0000)
committerJohn Brawn <john.brawn@arm.com>
Thu, 28 Jul 2016 17:17:22 +0000 (17:17 +0000)
Buildbot failures when building with clang -Werror. Reverting while I try to
figure this out.

llvm-svn: 277008

12 files changed:
clang-tools-extra/clang-tidy/ClangTidy.cpp
clang-tools-extra/clang-tidy/ClangTidyModuleRegistry.h
clang/examples/AnnotateFunctions/CMakeLists.txt
clang/examples/PrintFunctionNames/CMakeLists.txt
clang/include/clang/Frontend/FrontendPluginRegistry.h
clang/include/clang/Lex/Preprocessor.h
clang/lib/Frontend/FrontendAction.cpp
clang/lib/Lex/Preprocessor.cpp
clang/lib/Tooling/CompilationDatabase.cpp
llvm/include/llvm/Support/Registry.h
llvm/lib/CodeGen/GCMetadataPrinter.cpp
llvm/lib/CodeGen/GCStrategy.cpp

index 562e1e8..af1c7f9 100644 (file)
@@ -47,7 +47,7 @@ using namespace clang::driver;
 using namespace clang::tooling;
 using namespace llvm;
 
-LLVM_INSTANTIATE_REGISTRY(clang::tidy::ClangTidyModuleRegistry)
+template class llvm::Registry<clang::tidy::ClangTidyModule>;
 
 namespace clang {
 namespace tidy {
index dc44d14..de2a3d7 100644 (file)
@@ -13,6 +13,8 @@
 #include "ClangTidyModule.h"
 #include "llvm/Support/Registry.h"
 
+extern template class llvm::Registry<clang::tidy::ClangTidyModule>;
+
 namespace clang {
 namespace tidy {
 
index 5684abf..cf564d5 100644 (file)
@@ -1,4 +1,4 @@
-add_llvm_loadable_module(AnnotateFunctions AnnotateFunctions.cpp PLUGIN_TOOL clang)
+add_llvm_loadable_module(AnnotateFunctions AnnotateFunctions.cpp)
 
 if(LLVM_ENABLE_PLUGINS AND (WIN32 OR CYGWIN))
   target_link_libraries(AnnotateFunctions PRIVATE
index f5f8188..5a00d50 100644 (file)
@@ -9,7 +9,7 @@ if( NOT MSVC ) # MSVC mangles symbols differently, and
   endif()
 endif()
 
-add_llvm_loadable_module(PrintFunctionNames PrintFunctionNames.cpp PLUGIN_TOOL clang)
+add_llvm_loadable_module(PrintFunctionNames PrintFunctionNames.cpp)
 
 if(LLVM_ENABLE_PLUGINS AND (WIN32 OR CYGWIN))
   target_link_libraries(PrintFunctionNames PRIVATE
index 9d7ee08..ecab630 100644 (file)
@@ -13,6 +13,9 @@
 #include "clang/Frontend/FrontendAction.h"
 #include "llvm/Support/Registry.h"
 
+// Instantiated in FrontendAction.cpp.
+extern template class llvm::Registry<clang::PluginASTAction>;
+
 namespace clang {
 
 /// The frontend plugin registry.
index 000df66..c9b7125 100644 (file)
@@ -1972,4 +1972,6 @@ typedef llvm::Registry<PragmaHandler> PragmaHandlerRegistry;
 
 }  // end namespace clang
 
+extern template class llvm::Registry<clang::PragmaHandler>;
+
 #endif
index 2945b89..d2c2a80 100644 (file)
@@ -33,7 +33,7 @@
 #include <system_error>
 using namespace clang;
 
-LLVM_INSTANTIATE_REGISTRY(FrontendPluginRegistry)
+template class llvm::Registry<clang::PluginASTAction>;
 
 namespace {
 
index f0d6872..8832c7f 100644 (file)
@@ -54,7 +54,7 @@
 #include <utility>
 using namespace clang;
 
-LLVM_INSTANTIATE_REGISTRY(PragmaHandlerRegistry)
+template class llvm::Registry<clang::PragmaHandler>;
 
 //===----------------------------------------------------------------------===//
 ExternalPreprocessorSource::~ExternalPreprocessorSource() { }
index 6f95bf0..8fc4a1f 100644 (file)
@@ -32,8 +32,6 @@
 using namespace clang;
 using namespace tooling;
 
-LLVM_INSTANTIATE_REGISTRY(CompilationDatabasePluginRegistry)
-
 CompilationDatabase::~CompilationDatabase() {}
 
 std::unique_ptr<CompilationDatabase>
index 89c405e..27f025f 100644 (file)
@@ -69,14 +69,13 @@ namespace llvm {
       node(const entry &V) : Next(nullptr), Val(V) {}
     };
 
-    /// Add a node to the Registry: this is the interface between the plugin and
-    /// the executable.
-    ///
-    /// This function is exported by the executable and called by the plugin to
-    /// 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);
+    static void add_node(node *N) {
+      if (Tail)
+        Tail->Next = N;
+      else
+        Head = N;
+      Tail = N;
+    }
 
     /// Iterators for registry entries.
     ///
@@ -121,23 +120,61 @@ namespace llvm {
         add_node(&Node);
       }
     };
+
+    /// A dynamic import facility.  This is used on Windows to
+    /// import the entries added in the plugin.
+    static void import(sys::DynamicLibrary &DL, const char *RegistryName) {
+      typedef void *(*GetRegistry)();
+      std::string Name("LLVMGetRegistry_");
+      Name.append(RegistryName);
+      GetRegistry Getter =
+          (GetRegistry)(intptr_t)DL.getAddressOfSymbol(Name.c_str());
+      if (Getter) {
+        // Call the getter function in order to get the full copy of the
+        // registry defined in the plugin DLL, and copy them over to the
+        // current Registry.
+        typedef std::pair<const node *, const node *> Info;
+        Info *I = static_cast<Info *>(Getter());
+        iterator begin(I->first);
+        iterator end(I->second);
+        for (++end; begin != end; ++begin) {
+          // This Node object needs to remain alive for the
+          // duration of the program.
+          add_node(new node(*begin));
+        }
+      }
+    }
+
+    /// Retrieve the data to be passed across DLL boundaries when
+    /// importing registries from another DLL on Windows.
+    static void *exportRegistry() {
+      static std::pair<const node *, const node *> Info(Head, Tail);
+      return &Info;
+    }
   };
+
+  
+  // Since these are defined in a header file, plugins must be sure to export
+  // these symbols.
+  template <typename T>
+  typename Registry<T>::node *Registry<T>::Head;
+
+  template <typename T>
+  typename Registry<T>::node *Registry<T>::Tail;
 } // end namespace llvm
 
-/// Instantiate a registry class.
-///
-/// This instantiates add_node and the Head and Tail pointers.
-#define LLVM_INSTANTIATE_REGISTRY(REGISTRY_CLASS) \
-  namespace llvm { \
-  template<> typename REGISTRY_CLASS::node *REGISTRY_CLASS::Head = nullptr; \
-  template<> typename REGISTRY_CLASS::node *REGISTRY_CLASS::Tail = nullptr; \
-  template<> void REGISTRY_CLASS::add_node(REGISTRY_CLASS::node *N) { \
-    if (Tail) \
-      Tail->Next = N; \
-    else \
-      Head = N; \
-    Tail = N; \
-  } \
+#ifdef LLVM_ON_WIN32
+#define LLVM_EXPORT_REGISTRY(REGISTRY_CLASS)                                   \
+  extern "C" {                                                                 \
+  __declspec(dllexport) void *__cdecl LLVMGetRegistry_##REGISTRY_CLASS() {     \
+    return REGISTRY_CLASS::exportRegistry();                                   \
+  }                                                                            \
   }
+#define LLVM_IMPORT_REGISTRY(REGISTRY_CLASS, DL)                               \
+  REGISTRY_CLASS::import(DL, #REGISTRY_CLASS)
+#else
+#define LLVM_EXPORT_REGISTRY(REGISTRY_CLASS)
+#define LLVM_IMPORT_REGISTRY(REGISTRY_CLASS, DL)
+#endif
 
 #endif // LLVM_SUPPORT_REGISTRY_H
index d183c7f..bb8cfa1 100644 (file)
@@ -14,8 +14,6 @@
 #include "llvm/CodeGen/GCMetadataPrinter.h"
 using namespace llvm;
 
-LLVM_INSTANTIATE_REGISTRY(GCMetadataPrinterRegistry)
-
 GCMetadataPrinter::GCMetadataPrinter() {}
 
 GCMetadataPrinter::~GCMetadataPrinter() {}
index 31ab86f..554d326 100644 (file)
@@ -16,8 +16,6 @@
 
 using namespace llvm;
 
-LLVM_INSTANTIATE_REGISTRY(GCRegistry)
-
 GCStrategy::GCStrategy()
     : UseStatepoints(false), NeededSafePoints(0), CustomReadBarriers(false),
       CustomWriteBarriers(false), CustomRoots(false), InitRoots(true),