mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
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:
parent
4a1a77c1c9
commit
14ef05937f
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -25,7 +25,7 @@ struct MyPlugin : public llvmc::BasePlugin {
|
||||
{}
|
||||
};
|
||||
|
||||
static llvmc::RegisterPlugin<MyPlugin> RP;
|
||||
static llvmc::RegisterPlugin<MyPlugin> RP("Hello", "Hello World plugin");
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user