diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-03-29 18:53:00 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-03-29 18:53:00 +0000 |
commit | 9993a3858307d6f85647575833e6592ff6631339 (patch) | |
tree | 7c01810c918b68caacda0b55d8e441eb60f91a38 /utils/TableGen/ClangSACheckersEmitter.cpp | |
parent | cf610d07de3ba4929bb5d00e084877dd974b44a1 (diff) | |
download | external_llvm-9993a3858307d6f85647575833e6592ff6631339.zip external_llvm-9993a3858307d6f85647575833e6592ff6631339.tar.gz external_llvm-9993a3858307d6f85647575833e6592ff6631339.tar.bz2 |
For ClangSACheckersEmitter, allow a package to belong to checker group, in which all its checkers will go into the group.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128474 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/ClangSACheckersEmitter.cpp')
-rw-r--r-- | utils/TableGen/ClangSACheckersEmitter.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/utils/TableGen/ClangSACheckersEmitter.cpp b/utils/TableGen/ClangSACheckersEmitter.cpp index 8865db3..28eaaee 100644 --- a/utils/TableGen/ClangSACheckersEmitter.cpp +++ b/utils/TableGen/ClangSACheckersEmitter.cpp @@ -71,7 +71,7 @@ static std::string getStringValue(const Record &R, StringRef field) { namespace { struct GroupInfo { - std::vector<const Record*> Checkers; + llvm::DenseSet<const Record*> Checkers; llvm::DenseSet<const Record *> SubGroups; bool Hidden; unsigned Index; @@ -80,6 +80,19 @@ struct GroupInfo { }; } +static void addPackageToCheckerGroup(const Record *package, const Record *group, + llvm::DenseMap<const Record *, GroupInfo *> &recordGroupMap) { + llvm::DenseSet<const Record *> &checkers = recordGroupMap[package]->Checkers; + for (llvm::DenseSet<const Record *>::iterator + I = checkers.begin(), E = checkers.end(); I != E; ++I) + recordGroupMap[group]->Checkers.insert(*I); + + llvm::DenseSet<const Record *> &subGroups = recordGroupMap[package]->SubGroups; + for (llvm::DenseSet<const Record *>::iterator + I = subGroups.begin(), E = subGroups.end(); I != E; ++I) + addPackageToCheckerGroup(*I, group, recordGroupMap); +} + void ClangSACheckersEmitter::run(raw_ostream &OS) { std::vector<Record*> checkers = Records.getAllDerivedDefinitions("Checker"); llvm::DenseMap<const Record *, unsigned> checkerRecIndexMap; @@ -150,9 +163,9 @@ void ClangSACheckersEmitter::run(raw_ostream &OS) { GroupInfo &info = groupInfoByName[fullName]; info.Hidden = R->getValueAsBit("Hidden"); recordGroupMap[R] = &info; - info.Checkers.push_back(R); + info.Checkers.insert(R); } else { - recordGroupMap[package]->Checkers.push_back(R); + recordGroupMap[package]->Checkers.insert(R); } Record *currR = isCheckerNamed(R) ? R : package; @@ -166,9 +179,15 @@ void ClangSACheckersEmitter::run(raw_ostream &OS) { } // Insert the checker into the set of its group. if (DefInit *DI = dynamic_cast<DefInit*>(R->getValueInit("Group"))) - recordGroupMap[DI->getDef()]->Checkers.push_back(R); + recordGroupMap[DI->getDef()]->Checkers.insert(R); } + // If a package is in group, add all its checkers and its sub-packages + // checkers into the group. + for (unsigned i = 0, e = packages.size(); i != e; ++i) + if (DefInit *DI = dynamic_cast<DefInit*>(packages[i]->getValueInit("Group"))) + addPackageToCheckerGroup(packages[i], DI->getDef(), recordGroupMap); + unsigned index = 0; for (std::map<std::string, GroupInfo>::iterator I = groupInfoByName.begin(), E = groupInfoByName.end(); I != E; ++I) @@ -183,11 +202,12 @@ void ClangSACheckersEmitter::run(raw_ostream &OS) { I = groupInfoByName.begin(), E = groupInfoByName.end(); I != E; ++I) { maxLen = std::max(maxLen, (unsigned)I->first.size()); - std::vector<const Record*> &V = I->second.Checkers; - if (!V.empty()) { + llvm::DenseSet<const Record *> &checkers = I->second.Checkers; + if (!checkers.empty()) { OS << "static const short CheckerArray" << I->second.Index << "[] = { "; - for (unsigned i = 0, e = V.size(); i != e; ++i) - OS << checkerRecIndexMap[V[i]] << ", "; + for (llvm::DenseSet<const Record *>::iterator + I = checkers.begin(), E = checkers.end(); I != E; ++I) + OS << checkerRecIndexMap[*I] << ", "; OS << "-1 };\n"; } |