Convert llvmc2 plugins to use llvm/Support/Registry.h machinery.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56467 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/llvmc2/Plugin.cpp b/tools/llvmc2/Plugin.cpp
index cd94a01..c9b3960 100644
--- a/tools/llvmc2/Plugin.cpp
+++ b/tools/llvmc2/Plugin.cpp
@@ -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;
   }
 
-  void PopulateLanguageMap(LanguageMap& langMap) {
-    for (PluginRegistry::const_iterator B = GlobalPluginRegistry.begin(),
-           E = GlobalPluginRegistry.end(); B != E; ++B)
+  PluginLoader::~PluginLoader() {
+    if (pluginListInitialized) {
+      for (PluginList::iterator B = Plugins.begin(), E = Plugins.end();
+           B != E; ++B)
+        delete (*B);
+    }
+    pluginListInitialized = false;
+  }
+
+  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);
   }
 
diff --git a/tools/llvmc2/llvmc.cpp b/tools/llvmc2/llvmc.cpp
index 592a133..f3a1e57 100644
--- a/tools/llvmc2/llvmc.cpp
+++ b/tools/llvmc2/llvmc.cpp
@@ -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();
diff --git a/tools/llvmc2/plugins/Hello/Hello.cpp b/tools/llvmc2/plugins/Hello/Hello.cpp
index a243dd8..eb52d24 100644
--- a/tools/llvmc2/plugins/Hello/Hello.cpp
+++ b/tools/llvmc2/plugins/Hello/Hello.cpp
@@ -25,7 +25,7 @@
   {}
 };
 
-static llvmc::RegisterPlugin<MyPlugin> RP;
+static llvmc::RegisterPlugin<MyPlugin> RP("Hello", "Hello World plugin");
 
 }