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
This commit is contained in:
Mikhail Glushenkov
2008-09-22 20:51:19 +00:00
parent 4a1a77c1c9
commit 14ef05937f
4 changed files with 68 additions and 29 deletions

View File

@@ -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;
}
void PopulateLanguageMap(LanguageMap& langMap) {
for (PluginRegistry::const_iterator B = GlobalPluginRegistry.begin(),
E = GlobalPluginRegistry.end(); B != E; ++B)
PluginLoader::~PluginLoader() {
if (pluginListInitialized) {
for (PluginList::iterator B = Plugins.begin(), E = Plugins.end();
B != E; ++B)
delete (*B);
}
pluginListInitialized = false;
}
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);
}

View File

@@ -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();

View File

@@ -25,7 +25,7 @@ struct MyPlugin : public llvmc::BasePlugin {
{}
};
static llvmc::RegisterPlugin<MyPlugin> RP;
static llvmc::RegisterPlugin<MyPlugin> RP("Hello", "Hello World plugin");
}