[llvm-commits] [llvm] r56467 - in /llvm/trunk: include/llvm/CompilerDriver/Plugin.h tools/llvmc2/Plugin.cpp tools/llvmc2/llvmc.cpp tools/llvmc2/plugins/Hello/Hello.cpp

Mikhail Glushenkov foldr at codedgers.com
Mon Sep 22 13:51:20 PDT 2008


Author: foldr
Date: Mon Sep 22 15:51:19 2008
New Revision: 56467

URL: http://llvm.org/viewvc/llvm-project?rev=56467&view=rev
Log:
Convert llvmc2 plugins to use llvm/Support/Registry.h machinery.

Modified:
    llvm/trunk/include/llvm/CompilerDriver/Plugin.h
    llvm/trunk/tools/llvmc2/Plugin.cpp
    llvm/trunk/tools/llvmc2/llvmc.cpp
    llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp

Modified: llvm/trunk/include/llvm/CompilerDriver/Plugin.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/Plugin.h?rev=56467&r1=56466&r2=56467&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CompilerDriver/Plugin.h (original)
+++ llvm/trunk/include/llvm/CompilerDriver/Plugin.h Mon Sep 22 15:51:19 2008
@@ -14,6 +14,8 @@
 #ifndef LLVM_TOOLS_LLVMC2_PLUGIN_H
 #define LLVM_TOOLS_LLVMC2_PLUGIN_H
 
+#include "llvm/Support/Registry.h"
+
 namespace llvmc {
 
   class LanguageMap;
@@ -31,25 +33,38 @@
     virtual void PopulateCompilationGraph(CompilationGraph&) const = 0;
   };
 
-  // Helper class for RegisterPlugin.
-  class RegisterPluginImpl {
-  protected:
-    RegisterPluginImpl(BasePlugin*);
-  };
+  typedef llvm::Registry<BasePlugin> PluginRegistry;
 
-  /// RegisterPlugin<T> template - Used to register LLVMC plugins.
-  template <class T>
-  struct RegisterPlugin : RegisterPluginImpl {
-    RegisterPlugin() : RegisterPluginImpl (new T()) {}
+  template <class P>
+  struct RegisterPlugin
+    : public PluginRegistry::Add<P> {
+    typedef PluginRegistry::Add<P> Base;
+
+    RegisterPlugin(const char* Name = "Nameless",
+                   const char* Desc = "Auto-generated plugin")
+      : Base(Name, Desc) {}
   };
 
-  /// PopulateLanguageMap - Fills in the language map by calling
-  /// PopulateLanguageMap methods of all plugins.
-  void PopulateLanguageMap(LanguageMap& langMap);
-
-  /// PopulateCompilationGraph - Populates the compilation graph by
-  /// calling PopulateCompilationGraph methods of all plugins.
-  void PopulateCompilationGraph(CompilationGraph& tools);
+
+  /// PluginLoader - Helper class used by the main program for
+  /// lifetime management.
+  struct PluginLoader {
+    PluginLoader();
+    ~PluginLoader();
+
+    /// PopulateLanguageMap - Fills in the language map by calling
+    /// PopulateLanguageMap methods of all plugins.
+    void PopulateLanguageMap(LanguageMap& langMap);
+
+    /// PopulateCompilationGraph - Populates the compilation graph by
+    /// calling PopulateCompilationGraph methods of all plugins.
+    void PopulateCompilationGraph(CompilationGraph& tools);
+
+  private:
+    // noncopyable
+    PluginLoader(const PluginLoader& other);
+    const PluginLoader& operator=(const PluginLoader& other);
+  };
 
 }
 

Modified: llvm/trunk/tools/llvmc2/Plugin.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/Plugin.cpp?rev=56467&r1=56466&r2=56467&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc2/Plugin.cpp (original)
+++ llvm/trunk/tools/llvmc2/Plugin.cpp Mon Sep 22 15:51:19 2008
@@ -16,25 +16,48 @@
 #include <vector>
 
 namespace {
-  typedef std::vector<llvmc::BasePlugin*> PluginRegistry;
-  static PluginRegistry GlobalPluginRegistry;
+
+  // Registry::Add<> does not do lifetime management (probably issues
+  // with static constructor/destructor ordering), so we have to
+  // implement it here.
+  //
+  // All this static registration/life-before-main model seems
+  // unnecessary convoluted to me.
+
+  static bool pluginListInitialized = false;
+  typedef std::vector<const llvmc::BasePlugin*> PluginList;
+  static PluginList Plugins;
 }
 
 namespace llvmc {
 
-  RegisterPluginImpl::RegisterPluginImpl(BasePlugin* plugin) {
-    GlobalPluginRegistry.push_back(plugin);
+  PluginLoader::PluginLoader() {
+    if (!pluginListInitialized) {
+      for (PluginRegistry::iterator B = PluginRegistry::begin(),
+             E = PluginRegistry::end(); B != E; ++B)
+        Plugins.push_back(B->instantiate());
+    }
+    pluginListInitialized = true;
+  }
+
+  PluginLoader::~PluginLoader() {
+    if (pluginListInitialized) {
+      for (PluginList::iterator B = Plugins.begin(), E = Plugins.end();
+           B != E; ++B)
+        delete (*B);
+    }
+    pluginListInitialized = false;
   }
 
-  void PopulateLanguageMap(LanguageMap& langMap) {
-    for (PluginRegistry::const_iterator B = GlobalPluginRegistry.begin(),
-           E = GlobalPluginRegistry.end(); B != E; ++B)
+  void PluginLoader::PopulateLanguageMap(LanguageMap& langMap) {
+    for (PluginList::iterator B = Plugins.begin(), E = Plugins.end();
+         B != E; ++B)
       (*B)->PopulateLanguageMap(langMap);
   }
 
-  void PopulateCompilationGraph(CompilationGraph& graph) {
-    for (PluginRegistry::const_iterator B = GlobalPluginRegistry.begin(),
-           E = GlobalPluginRegistry.end(); B != E; ++B)
+  void PluginLoader::PopulateCompilationGraph(CompilationGraph& graph) {
+    for (PluginList::iterator B = Plugins.begin(), E = Plugins.end();
+         B != E; ++B)
       (*B)->PopulateCompilationGraph(graph);
   }
 

Modified: llvm/trunk/tools/llvmc2/llvmc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/llvmc.cpp?rev=56467&r1=56466&r2=56467&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc2/llvmc.cpp (original)
+++ llvm/trunk/tools/llvmc2/llvmc.cpp Mon Sep 22 15:51:19 2008
@@ -85,8 +85,9 @@
     cl::ParseCommandLineOptions
       (argc, argv, "LLVM Compiler Driver (Work In Progress)", true);
 
-    PopulateLanguageMap(langMap);
-    PopulateCompilationGraph(graph);
+    PluginLoader Plugins;
+    Plugins.PopulateLanguageMap(langMap);
+    Plugins.PopulateCompilationGraph(graph);
 
     if (WriteGraph) {
       graph.writeGraph();

Modified: llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp?rev=56467&r1=56466&r2=56467&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp (original)
+++ llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp Mon Sep 22 15:51:19 2008
@@ -25,7 +25,7 @@
   {}
 };
 
-static llvmc::RegisterPlugin<MyPlugin> RP;
+static llvmc::RegisterPlugin<MyPlugin> RP("Hello", "Hello World plugin");
 
 }
 





More information about the llvm-commits mailing list