//
//===----------------------------------------------------------------------===//
//
-// Plugin support for llvmc2.
+// Plugin support for llvmc.
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVMC2_PLUGIN_H
-#define LLVM_TOOLS_LLVMC2_PLUGIN_H
+#ifndef LLVM_INCLUDE_COMPILER_DRIVER_PLUGIN_H
+#define LLVM_INCLUDE_COMPILER_DRIVER_PLUGIN_H
+
+#include "llvm/Support/Registry.h"
namespace llvmc {
/// BasePlugin - An abstract base class for all LLVMC plugins.
struct BasePlugin {
+ /// Priority - Plugin priority, useful for handling dependencies
+ /// between plugins. Plugins with lower priorities are loaded
+ /// first.
+ virtual int Priority() const { return 0; }
+
+ /// PreprocessOptions - The auto-generated function that performs various
+ /// consistency checks on options (like ensuring that -O2 and -O3 are not
+ /// used together).
+ virtual int PreprocessOptions() const = 0;
+
/// PopulateLanguageMap - The auto-generated function that fills in
/// the language map (map from file extensions to language names).
- virtual void PopulateLanguageMap(LanguageMap&) const = 0;
+ virtual int PopulateLanguageMap(LanguageMap&) const = 0;
/// PopulateCompilationGraph - The auto-generated function that
/// populates the compilation graph with nodes and edges.
- virtual void PopulateCompilationGraph(CompilationGraph&) const = 0;
- };
+ virtual int PopulateCompilationGraph(CompilationGraph&) const = 0;
- // Helper class for RegisterPlugin.
- class RegisterPluginImpl {
- protected:
- RegisterPluginImpl(BasePlugin*);
+ /// Needed to avoid a compiler warning.
+ virtual ~BasePlugin() {}
};
- /// RegisterPlugin<T> template - Used to register LLVMC plugins.
- template <class T>
- struct RegisterPlugin : RegisterPluginImpl {
- RegisterPlugin() : RegisterPluginImpl (new T()) {}
+ 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) {}
};
- /// 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();
+
+ /// RunInitialization - Calls PreprocessOptions, PopulateLanguageMap and
+ /// PopulateCompilationGraph methods of all plugins. This populates the
+ /// global language map and the compilation graph.
+ int RunInitialization(LanguageMap& langMap, CompilationGraph& graph) const;
+
+ private:
+ // noncopyable
+ PluginLoader(const PluginLoader& other);
+ const PluginLoader& operator=(const PluginLoader& other);
+ };
}
-#endif // LLVM_TOOLS_LLVMC2_PLUGIN_H
+#endif // LLVM_INCLUDE_COMPILER_DRIVER_PLUGIN_H