[llvm-commits] [llvm] r56467 - in /llvm/trunk: include/llvm/CompilerDriver/Plugin.h tools/llvmc2/Plugin.cpp tools/llvmc2/llvmc.cpp tools/llvmc2/plugins/Hello/Hello.cpp
Mikhail Glushenkov
foldr at codedgers.com
Mon Sep 22 13:51:20 PDT 2008
Author: foldr
Date: Mon Sep 22 15:51:19 2008
New Revision: 56467
URL: http://llvm.org/viewvc/llvm-project?rev=56467&view=rev
Log:
Convert llvmc2 plugins to use llvm/Support/Registry.h machinery.
Modified:
llvm/trunk/include/llvm/CompilerDriver/Plugin.h
llvm/trunk/tools/llvmc2/Plugin.cpp
llvm/trunk/tools/llvmc2/llvmc.cpp
llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp
Modified: llvm/trunk/include/llvm/CompilerDriver/Plugin.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/Plugin.h?rev=56467&r1=56466&r2=56467&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CompilerDriver/Plugin.h (original)
+++ llvm/trunk/include/llvm/CompilerDriver/Plugin.h Mon Sep 22 15:51:19 2008
@@ -14,6 +14,8 @@
#ifndef LLVM_TOOLS_LLVMC2_PLUGIN_H
#define LLVM_TOOLS_LLVMC2_PLUGIN_H
+#include "llvm/Support/Registry.h"
+
namespace llvmc {
class LanguageMap;
@@ -31,25 +33,38 @@
virtual void PopulateCompilationGraph(CompilationGraph&) const = 0;
};
- // Helper class for RegisterPlugin.
- class RegisterPluginImpl {
- protected:
- RegisterPluginImpl(BasePlugin*);
- };
+ typedef llvm::Registry<BasePlugin> PluginRegistry;
- /// RegisterPlugin<T> template - Used to register LLVMC plugins.
- template <class T>
- struct RegisterPlugin : RegisterPluginImpl {
- RegisterPlugin() : RegisterPluginImpl (new T()) {}
+ template <class P>
+ struct RegisterPlugin
+ : public PluginRegistry::Add<P> {
+ typedef PluginRegistry::Add<P> Base;
+
+ RegisterPlugin(const char* Name = "Nameless",
+ const char* Desc = "Auto-generated plugin")
+ : Base(Name, Desc) {}
};
- /// PopulateLanguageMap - Fills in the language map by calling
- /// PopulateLanguageMap methods of all plugins.
- void PopulateLanguageMap(LanguageMap& langMap);
-
- /// PopulateCompilationGraph - Populates the compilation graph by
- /// calling PopulateCompilationGraph methods of all plugins.
- void PopulateCompilationGraph(CompilationGraph& tools);
+
+ /// PluginLoader - Helper class used by the main program for
+ /// lifetime management.
+ struct PluginLoader {
+ PluginLoader();
+ ~PluginLoader();
+
+ /// PopulateLanguageMap - Fills in the language map by calling
+ /// PopulateLanguageMap methods of all plugins.
+ void PopulateLanguageMap(LanguageMap& langMap);
+
+ /// PopulateCompilationGraph - Populates the compilation graph by
+ /// calling PopulateCompilationGraph methods of all plugins.
+ void PopulateCompilationGraph(CompilationGraph& tools);
+
+ private:
+ // noncopyable
+ PluginLoader(const PluginLoader& other);
+ const PluginLoader& operator=(const PluginLoader& other);
+ };
}
Modified: llvm/trunk/tools/llvmc2/Plugin.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/Plugin.cpp?rev=56467&r1=56466&r2=56467&view=diff
==============================================================================
--- llvm/trunk/tools/llvmc2/Plugin.cpp (original)
+++ llvm/trunk/tools/llvmc2/Plugin.cpp Mon Sep 22 15:51:19 2008
@@ -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);
}
Modified: llvm/trunk/tools/llvmc2/llvmc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/llvmc.cpp?rev=56467&r1=56466&r2=56467&view=diff
==============================================================================
--- llvm/trunk/tools/llvmc2/llvmc.cpp (original)
+++ llvm/trunk/tools/llvmc2/llvmc.cpp Mon Sep 22 15:51:19 2008
@@ -85,8 +85,9 @@
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();
Modified: llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp?rev=56467&r1=56466&r2=56467&view=diff
==============================================================================
--- llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp (original)
+++ llvm/trunk/tools/llvmc2/plugins/Hello/Hello.cpp Mon Sep 22 15:51:19 2008
@@ -25,7 +25,7 @@
{}
};
-static llvmc::RegisterPlugin<MyPlugin> RP;
+static llvmc::RegisterPlugin<MyPlugin> RP("Hello", "Hello World plugin");
}
More information about the llvm-commits
mailing list