Hi Argyrios,<br><br>please don't use a data structure whose order is non-determinstic (walking over a DenseSet gives different results depending on the memory layout), this leads to Checkers.inc being different on every run :)<br>
<br>Regards,<br><br>Tilmann<br><br><div class="gmail_quote">On Tue, Mar 29, 2011 at 8:53 PM, Argyrios Kyrtzidis <span dir="ltr"><<a href="mailto:akyrtzi@gmail.com">akyrtzi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Author: akirtzidis<br>
Date: Tue Mar 29 13:53:00 2011<br>
New Revision: 128474<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=128474&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=128474&view=rev</a><br>
Log:<br>
For ClangSACheckersEmitter, allow a package to belong to checker group, in which all its checkers will go into the group.<br>
<br>
Modified:<br>
    llvm/trunk/utils/TableGen/ClangSACheckersEmitter.cpp<br>
<br>
Modified: llvm/trunk/utils/TableGen/ClangSACheckersEmitter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ClangSACheckersEmitter.cpp?rev=128474&r1=128473&r2=128474&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ClangSACheckersEmitter.cpp?rev=128474&r1=128473&r2=128474&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/utils/TableGen/ClangSACheckersEmitter.cpp (original)<br>
+++ llvm/trunk/utils/TableGen/ClangSACheckersEmitter.cpp Tue Mar 29 13:53:00 2011<br>
@@ -71,7 +71,7 @@<br>
<br>
 namespace {<br>
 struct GroupInfo {<br>
-  std::vector<const Record*> Checkers;<br>
+  llvm::DenseSet<const Record*> Checkers;<br>
   llvm::DenseSet<const Record *> SubGroups;<br>
   bool Hidden;<br>
   unsigned Index;<br>
@@ -80,6 +80,19 @@<br>
 };<br>
 }<br>
<br>
+static void addPackageToCheckerGroup(const Record *package, const Record *group,<br>
+                  llvm::DenseMap<const Record *, GroupInfo *> &recordGroupMap) {<br>
+  llvm::DenseSet<const Record *> &checkers = recordGroupMap[package]->Checkers;<br>
+  for (llvm::DenseSet<const Record *>::iterator<br>
+         I = checkers.begin(), E = checkers.end(); I != E; ++I)<br>
+    recordGroupMap[group]->Checkers.insert(*I);<br>
+<br>
+  llvm::DenseSet<const Record *> &subGroups = recordGroupMap[package]->SubGroups;<br>
+  for (llvm::DenseSet<const Record *>::iterator<br>
+         I = subGroups.begin(), E = subGroups.end(); I != E; ++I)<br>
+    addPackageToCheckerGroup(*I, group, recordGroupMap);<br>
+}<br>
+<br>
 void ClangSACheckersEmitter::run(raw_ostream &OS) {<br>
   std::vector<Record*> checkers = Records.getAllDerivedDefinitions("Checker");<br>
   llvm::DenseMap<const Record *, unsigned> checkerRecIndexMap;<br>
@@ -150,9 +163,9 @@<br>
       GroupInfo &info = groupInfoByName[fullName];<br>
       info.Hidden = R->getValueAsBit("Hidden");<br>
       recordGroupMap[R] = &info;<br>
-      info.Checkers.push_back(R);<br>
+      info.Checkers.insert(R);<br>
     } else {<br>
-      recordGroupMap[package]->Checkers.push_back(R);<br>
+      recordGroupMap[package]->Checkers.insert(R);<br>
     }<br>
<br>
     Record *currR = isCheckerNamed(R) ? R : package;<br>
@@ -166,9 +179,15 @@<br>
     }<br>
     // Insert the checker into the set of its group.<br>
     if (DefInit *DI = dynamic_cast<DefInit*>(R->getValueInit("Group")))<br>
-      recordGroupMap[DI->getDef()]->Checkers.push_back(R);<br>
+      recordGroupMap[DI->getDef()]->Checkers.insert(R);<br>
   }<br>
<br>
+  // If a package is in group, add all its checkers and its sub-packages<br>
+  // checkers into the group.<br>
+  for (unsigned i = 0, e = packages.size(); i != e; ++i)<br>
+    if (DefInit *DI = dynamic_cast<DefInit*>(packages[i]->getValueInit("Group")))<br>
+      addPackageToCheckerGroup(packages[i], DI->getDef(), recordGroupMap);<br>
+<br>
   unsigned index = 0;<br>
   for (std::map<std::string, GroupInfo>::iterator<br>
          I = groupInfoByName.begin(), E = groupInfoByName.end(); I != E; ++I)<br>
@@ -183,11 +202,12 @@<br>
          I = groupInfoByName.begin(), E = groupInfoByName.end(); I != E; ++I) {<br>
     maxLen = std::max(maxLen, (unsigned)I->first.size());<br>
<br>
-    std::vector<const Record*> &V = I->second.Checkers;<br>
-    if (!V.empty()) {<br>
+    llvm::DenseSet<const Record *> &checkers = I->second.Checkers;<br>
+    if (!checkers.empty()) {<br>
       OS << "static const short CheckerArray" << I->second.Index << "[] = { ";<br>
-      for (unsigned i = 0, e = V.size(); i != e; ++i)<br>
-        OS << checkerRecIndexMap[V[i]] << ", ";<br>
+      for (llvm::DenseSet<const Record *>::iterator<br>
+          I = checkers.begin(), E = checkers.end(); I != E; ++I)<br>
+        OS << checkerRecIndexMap[*I] << ", ";<br>
       OS << "-1 };\n";<br>
     }<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br>