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

@ -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,26 +33,39 @@ namespace llvmc {
virtual void PopulateCompilationGraph(CompilationGraph&) const = 0;
};
// Helper class for RegisterPlugin.
class RegisterPluginImpl {
protected:
RegisterPluginImpl(BasePlugin*);
typedef llvm::Registry<BasePlugin> PluginRegistry;
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) {}
};
/// RegisterPlugin<T> template - Used to register LLVMC plugins.
template <class T>
struct RegisterPlugin : RegisterPluginImpl {
RegisterPlugin() : RegisterPluginImpl (new T()) {}
/// 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);
};
/// 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);
}
#endif // LLVM_TOOLS_LLVMC2_PLUGIN_H

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");
}