Add a bit of lazy evaluation to PopulateCompilationGraph().
authorMikhail Glushenkov <foldr@codedgers.com>
Wed, 12 Nov 2008 00:05:17 +0000 (00:05 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Wed, 12 Nov 2008 00:05:17 +0000 (00:05 +0000)
Only the tools that are mentioned in the compilation graph definition
are now inserted by PopulateCompilationGraph(). This should cut down
plugin loading time a little.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59097 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/LLVMCConfigurationEmitter.cpp

index 7836172a44ca389198801b1bdaa241d8351ec6eb..33b0e3d8cb284836ac64301242965423e8220b1e 100644 (file)
@@ -1595,26 +1595,33 @@ void EmitPopulateCompilationGraph (Record* CompilationGraph,
 {
   ListInit* edges = CompilationGraph->getValueAsListInit("edges");
 
-  // Generate code
   O << "namespace {\n\n";
   O << "void PopulateCompilationGraphLocal(CompilationGraph& G) {\n";
 
-  // Insert vertices
+  // Insert vertices.
+  // Only tools mentioned in the graph definition are inserted.
 
-  RecordVector Tools = Records.getAllDerivedDefinitions("Tool");
-  if (Tools.empty())
-    throw std::string("No tool definitions found!");
+  llvm::StringSet<> ToolsInGraph;
 
-  for (RecordVector::iterator B = Tools.begin(), E = Tools.end(); B != E; ++B) {
-    const std::string& Name = (*B)->getName();
-    if (Name != "root")
-      O << Indent1 << "G.insertNode(new "
-        << Name << "());\n";
+  for (unsigned i = 0; i < edges->size(); ++i) {
+    Record* Edge = edges->getElementAsRecord(i);
+    Record* A = Edge->getValueAsDef("a");
+    Record* B = Edge->getValueAsDef("b");
+
+    if (A->getName() != "root")
+      ToolsInGraph.insert(A->getName());
+    if (B->getName() != "root")
+      ToolsInGraph.insert(B->getName());
   }
 
+  for (llvm::StringSet<>::iterator B = ToolsInGraph.begin(),
+         E = ToolsInGraph.end(); B != E; ++B)
+    O << Indent1 << "G.insertNode(new " << B->first() << "());\n";
+
   O << '\n';
 
-  // Insert edges
+  // Insert edges.
+
   for (unsigned i = 0; i < edges->size(); ++i) {
     Record* Edge = edges->getElementAsRecord(i);
     Record* A = Edge->getValueAsDef("a");