Support dependencies between plugins by priority-sorting.
authorMikhail Glushenkov <foldr@codedgers.com>
Mon, 17 Nov 2008 17:30:25 +0000 (17:30 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Mon, 17 Nov 2008 17:30:25 +0000 (17:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59449 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CompilerDriver/Common.td
include/llvm/CompilerDriver/Plugin.h
tools/llvmc2/driver/Plugin.cpp
utils/TableGen/LLVMCConfigurationEmitter.cpp

index e017326069ee92778d491068d90c676cb4e9d6b3..4589f9179c326a45faa03c946fa98a5b564b1822 100644 (file)
@@ -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;
index 1dc0df9d550ba3f19408d75bdd87ef25edf414c9..5426ac73cd4c9dc8b488845597c389626fc61186 100644 (file)
@@ -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;
index c9b3960c1e75c2fbbdc0e227e047ff5c9420ae58..17c70869ea6ad947353c2a473f769e708b70423c 100644 (file)
@@ -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;
   }
index 42d4d9ea54ae3a2603244a861487117d8bffbe04..d43e62bad8f7e63f972de024f4a6e066cfd0750e 100644 (file)
@@ -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) {