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);
   }