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>