diff options
Diffstat (limited to 'tools/llvmc2/Plugin.cpp')
-rw-r--r-- | tools/llvmc2/Plugin.cpp | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/tools/llvmc2/Plugin.cpp b/tools/llvmc2/Plugin.cpp index cd94a01320..c9b3960c1e 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; + } + + 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); } |