mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-29 22:30:33 +00:00
Support dependencies between plugins by priority-sorting.
llvm-svn: 59449
This commit is contained in:
parent
c44e8c9f2b
commit
0c4ad9c7cc
@ -65,6 +65,11 @@ def or;
|
||||
def inc_weight;
|
||||
def dec_weight;
|
||||
|
||||
// Used to specify plugin priority.
|
||||
class PluginPriority<int p> {
|
||||
int priority = p;
|
||||
}
|
||||
|
||||
// Option list - used to specify aliases and sometimes help strings.
|
||||
class OptionList<list<dag> l> {
|
||||
list<dag> options = l;
|
||||
|
@ -24,6 +24,11 @@ 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 = 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;
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#include "llvm/CompilerDriver/Plugin.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
@ -27,6 +28,13 @@ namespace {
|
||||
static bool pluginListInitialized = false;
|
||||
typedef std::vector<const llvmc::BasePlugin*> PluginList;
|
||||
static PluginList Plugins;
|
||||
|
||||
struct ByPriority {
|
||||
bool operator()(const llvmc::BasePlugin* lhs,
|
||||
const llvmc::BasePlugin* rhs) {
|
||||
return lhs->Priority() < rhs->Priority();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
namespace llvmc {
|
||||
@ -36,6 +44,7 @@ namespace llvmc {
|
||||
for (PluginRegistry::iterator B = PluginRegistry::begin(),
|
||||
E = PluginRegistry::end(); B != E; ++B)
|
||||
Plugins.push_back(B->instantiate());
|
||||
std::sort(Plugins.begin(), Plugins.end(), ByPriority());
|
||||
}
|
||||
pluginListInitialized = true;
|
||||
}
|
||||
|
@ -771,7 +771,7 @@ void CollectPropertiesFromOptionLists (RecordVector::const_iterator B,
|
||||
GlobalOptionDescriptions& OptDescs)
|
||||
{
|
||||
// Iterate over a properties list of every Tool definition
|
||||
for (;B!=E;++B) {
|
||||
for (; B!=E; ++B) {
|
||||
RecordVector::value_type T = *B;
|
||||
// Throws an exception if the value does not exist.
|
||||
ListInit* PropList = T->getValueAsListInit("options");
|
||||
@ -1701,9 +1701,10 @@ void EmitHookDeclarations(const ToolPropertiesList& ToolProps,
|
||||
}
|
||||
|
||||
/// EmitRegisterPlugin - Emit code to register this plugin.
|
||||
void EmitRegisterPlugin(std::ostream& O) {
|
||||
void EmitRegisterPlugin(int Priority, std::ostream& O) {
|
||||
O << "namespace {\n\n"
|
||||
<< "struct Plugin : public llvmc::BasePlugin {\n"
|
||||
<< "struct Plugin : public llvmc::BasePlugin {\n\n"
|
||||
<< Indent1 << "int Priority() const { return " << Priority << "; }\n\n"
|
||||
<< Indent1 << "void PopulateLanguageMap(LanguageMap& langMap) const\n"
|
||||
<< Indent1 << "{ PopulateLanguageMapLocal(langMap); }\n\n"
|
||||
<< Indent1
|
||||
@ -1777,6 +1778,15 @@ void FilterNotInGraph (const Record* CompilationGraph,
|
||||
ToolProps.erase(new_end, ToolProps.end());
|
||||
}
|
||||
|
||||
int CalculatePriority(RecordVector::const_iterator B,
|
||||
RecordVector::const_iterator E) {
|
||||
int total = 0;
|
||||
for (; B!=E; ++B) {
|
||||
total += static_cast<int>((*B)->getValueAsInt("priority"));
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
// End of anonymous namespace
|
||||
}
|
||||
|
||||
@ -1799,7 +1809,8 @@ void LLVMCConfigurationEmitter::run (std::ostream &O) {
|
||||
GlobalOptionDescriptions OptDescs;
|
||||
CollectToolProperties(Tools.begin(), Tools.end(), ToolProps, OptDescs);
|
||||
|
||||
RecordVector OptionLists = Records.getAllDerivedDefinitions("OptionList");
|
||||
const RecordVector& OptionLists =
|
||||
Records.getAllDerivedDefinitions("OptionList");
|
||||
CollectPropertiesFromOptionLists(OptionLists.begin(), OptionLists.end(),
|
||||
OptDescs);
|
||||
|
||||
@ -1841,7 +1852,10 @@ void LLVMCConfigurationEmitter::run (std::ostream &O) {
|
||||
EmitPopulateCompilationGraph(CompilationGraphRecord, ToolProps, O);
|
||||
|
||||
// Emit code for plugin registration.
|
||||
EmitRegisterPlugin(O);
|
||||
const RecordVector& Priorities =
|
||||
Records.getAllDerivedDefinitions("PluginPriority");
|
||||
EmitRegisterPlugin(CalculatePriority(Priorities.begin(), Priorities.end()),
|
||||
O);
|
||||
|
||||
// EOF
|
||||
} catch (std::exception& Error) {
|
||||
|
Loading…
Reference in New Issue
Block a user