diff options
author | Mikhail Glushenkov <foldr@codedgers.com> | 2008-09-22 20:51:19 +0000 |
---|---|---|
committer | Mikhail Glushenkov <foldr@codedgers.com> | 2008-09-22 20:51:19 +0000 |
commit | 14ef05937fbf5fb747176710a475fa8a671e4a44 (patch) | |
tree | fa085bac24ef1ecc358a4d5f0515d948c2b95c98 /tools | |
parent | 4a1a77c1c9e0992735aa66b75c9e4c75c3b70561 (diff) | |
download | external_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')
-rw-r--r-- | tools/llvmc2/Plugin.cpp | 43 | ||||
-rw-r--r-- | tools/llvmc2/llvmc.cpp | 5 | ||||
-rw-r--r-- | tools/llvmc2/plugins/Hello/Hello.cpp | 2 |
3 files changed, 37 insertions, 13 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); } diff --git a/tools/llvmc2/llvmc.cpp b/tools/llvmc2/llvmc.cpp index 592a1333f3..f3a1e57192 100644 --- a/tools/llvmc2/llvmc.cpp +++ b/tools/llvmc2/llvmc.cpp @@ -85,8 +85,9 @@ int main(int argc, char** argv) { 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 a243dd86f7..eb52d249f0 100644 --- a/tools/llvmc2/plugins/Hello/Hello.cpp +++ b/tools/llvmc2/plugins/Hello/Hello.cpp @@ -25,7 +25,7 @@ struct MyPlugin : public llvmc::BasePlugin { {} }; -static llvmc::RegisterPlugin<MyPlugin> RP; +static llvmc::RegisterPlugin<MyPlugin> RP("Hello", "Hello World plugin"); } |