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
commitb52720af22812b7adbd86f02ab123811aef9e475 (patch)
treefa085bac24ef1ecc358a4d5f0515d948c2b95c98 /tools/llvmc2/Plugin.cpp
parent62ab31103a0656f6ce032e20d3874dd9c5c7cccc (diff)
downloadexternal_llvm-b52720af22812b7adbd86f02ab123811aef9e475.zip
external_llvm-b52720af22812b7adbd86f02ab123811aef9e475.tar.gz
external_llvm-b52720af22812b7adbd86f02ab123811aef9e475.tar.bz2
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 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;
+ }
+
+ 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);
}