aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/llvmc2/Plugin.cpp43
-rw-r--r--tools/llvmc2/llvmc.cpp5
-rw-r--r--tools/llvmc2/plugins/Hello/Hello.cpp2
3 files changed, 37 insertions, 13 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);
}
diff --git a/tools/llvmc2/llvmc.cpp b/tools/llvmc2/llvmc.cpp
index 592a133..f3a1e57 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 a243dd8..eb52d24 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");
}