aboutsummaryrefslogtreecommitdiffstats
path: root/tools/llvmc2/Plugin.cpp
diff options
context:
space:
mode:
authorMikhail Glushenkov <foldr@codedgers.com>2008-09-22 20:51:19 +0000
committerMikhail Glushenkov <foldr@codedgers.com>2008-09-22 20:51:19 +0000
commit14ef05937fbf5fb747176710a475fa8a671e4a44 (patch)
treefa085bac24ef1ecc358a4d5f0515d948c2b95c98 /tools/llvmc2/Plugin.cpp
parent4a1a77c1c9e0992735aa66b75c9e4c75c3b70561 (diff)
downloadexternal_llvm-14ef05937fbf5fb747176710a475fa8a671e4a44.tar.gz
external_llvm-14ef05937fbf5fb747176710a475fa8a671e4a44.tar.bz2
external_llvm-14ef05937fbf5fb747176710a475fa8a671e4a44.zip
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
Diffstat (limited to 'tools/llvmc2/Plugin.cpp')
-rw-r--r--tools/llvmc2/Plugin.cpp43
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);
}