https://github.com/jurahul updated https://github.com/llvm/llvm-project/pull/108209
>From df228c650d4816eacc5b20771d8be294ab8ee134 Mon Sep 17 00:00:00 2001 From: Rahul Joshi <rjo...@nvidia.com> Date: Wed, 11 Sep 2024 05:28:22 -0700 Subject: [PATCH] [clangl[TableGen] Change Diagnostic Emitter to use const RecordKeeper --- .../TableGen/ClangDiagnosticsEmitter.cpp | 98 ++++++++++--------- clang/utils/TableGen/TableGenBackends.h | 12 ++- 2 files changed, 59 insertions(+), 51 deletions(-) diff --git a/clang/utils/TableGen/ClangDiagnosticsEmitter.cpp b/clang/utils/TableGen/ClangDiagnosticsEmitter.cpp index 6ca24a8c74b2ff..773668caa75747 100644 --- a/clang/utils/TableGen/ClangDiagnosticsEmitter.cpp +++ b/clang/utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -39,12 +39,13 @@ using namespace llvm; namespace { class DiagGroupParentMap { - RecordKeeper &Records; - std::map<const Record*, std::vector<Record*> > Mapping; + const RecordKeeper &Records; + std::map<const Record *, std::vector<const Record *>> Mapping; + public: - DiagGroupParentMap(RecordKeeper &records) : Records(records) { - std::vector<Record*> DiagGroups - = Records.getAllDerivedDefinitions("DiagGroup"); + DiagGroupParentMap(const RecordKeeper &records) : Records(records) { + ArrayRef<const Record *> DiagGroups = + Records.getAllDerivedDefinitions("DiagGroup"); for (unsigned i = 0, e = DiagGroups.size(); i != e; ++i) { std::vector<Record*> SubGroups = DiagGroups[i]->getValueAsListOfDefs("SubGroups"); @@ -53,7 +54,7 @@ class DiagGroupParentMap { } } - const std::vector<Record*> &getParents(const Record *Group) { + const std::vector<const Record *> &getParents(const Record *Group) { return Mapping[Group]; } }; @@ -68,7 +69,8 @@ getCategoryFromDiagGroup(const Record *Group, // The diag group may the subgroup of one or more other diagnostic groups, // check these for a category as well. - const std::vector<Record*> &Parents = DiagGroupParents.getParents(Group); + const std::vector<const Record *> &Parents = + DiagGroupParents.getParents(Group); for (unsigned i = 0, e = Parents.size(); i != e; ++i) { CatName = getCategoryFromDiagGroup(Parents[i], DiagGroupParents); if (!CatName.empty()) return CatName; @@ -94,19 +96,19 @@ static std::string getDiagnosticCategory(const Record *R, namespace { class DiagCategoryIDMap { - RecordKeeper &Records; + const RecordKeeper &Records; StringMap<unsigned> CategoryIDs; std::vector<std::string> CategoryStrings; public: - DiagCategoryIDMap(RecordKeeper &records) : Records(records) { + DiagCategoryIDMap(const RecordKeeper &records) : Records(records) { DiagGroupParentMap ParentInfo(Records); // The zero'th category is "". CategoryStrings.push_back(""); CategoryIDs[""] = 0; - std::vector<Record*> Diags = - Records.getAllDerivedDefinitions("Diagnostic"); + ArrayRef<const Record *> Diags = + Records.getAllDerivedDefinitions("Diagnostic"); for (unsigned i = 0, e = Diags.size(); i != e; ++i) { std::string Category = getDiagnosticCategory(Diags[i], ParentInfo); if (Category.empty()) continue; // Skip diags with no category. @@ -153,8 +155,8 @@ static bool diagGroupBeforeByName(const Record *LHS, const Record *RHS) { /// Invert the 1-[0/1] mapping of diags to group into a one to many /// mapping of groups to diags in the group. -static void groupDiagnostics(const std::vector<Record*> &Diags, - const std::vector<Record*> &DiagGroups, +static void groupDiagnostics(ArrayRef<const Record *> Diags, + ArrayRef<const Record *> DiagGroups, std::map<std::string, GroupInfo> &DiagsInGroup) { for (unsigned i = 0, e = Diags.size(); i != e; ++i) { @@ -172,7 +174,7 @@ static void groupDiagnostics(const std::vector<Record*> &Diags, // Add all DiagGroup's to the DiagsInGroup list to make sure we pick up empty // groups (these are warnings that GCC supports that clang never produces). for (unsigned i = 0, e = DiagGroups.size(); i != e; ++i) { - Record *Group = DiagGroups[i]; + const Record *Group = DiagGroups[i]; GroupInfo &GI = DiagsInGroup[std::string(Group->getValueAsString("GroupName"))]; GI.GroupName = Group->getName(); @@ -255,20 +257,18 @@ class InferPedantic { GMap; DiagGroupParentMap &DiagGroupParents; - const std::vector<Record*> &Diags; - const std::vector<Record*> DiagGroups; + ArrayRef<const Record *> Diags; + const std::vector<const Record *> DiagGroups; std::map<std::string, GroupInfo> &DiagsInGroup; llvm::DenseSet<const Record*> DiagsSet; GMap GroupCount; public: InferPedantic(DiagGroupParentMap &DiagGroupParents, - const std::vector<Record*> &Diags, - const std::vector<Record*> &DiagGroups, + ArrayRef<const Record *> Diags, + ArrayRef<const Record *> DiagGroups, std::map<std::string, GroupInfo> &DiagsInGroup) - : DiagGroupParents(DiagGroupParents), - Diags(Diags), - DiagGroups(DiagGroups), - DiagsInGroup(DiagsInGroup) {} + : DiagGroupParents(DiagGroupParents), Diags(Diags), + DiagGroups(DiagGroups), DiagsInGroup(DiagsInGroup) {} /// Compute the set of diagnostics and groups that are immediately /// in -Wpedantic. @@ -302,7 +302,8 @@ bool InferPedantic::isSubGroupOfGroup(const Record *Group, if (GName == GroupName) return true; - const std::vector<Record*> &Parents = DiagGroupParents.getParents(Group); + const std::vector<const Record *> &Parents = + DiagGroupParents.getParents(Group); for (unsigned i = 0, e = Parents.size(); i != e; ++i) if (isSubGroupOfGroup(Parents[i], GName)) return true; @@ -347,7 +348,8 @@ void InferPedantic::markGroup(const Record *Group) { // group's count is equal to the number of subgroups and diagnostics in // that group, we can safely add this group to -Wpedantic. if (groupInPedantic(Group, /* increment */ true)) { - const std::vector<Record*> &Parents = DiagGroupParents.getParents(Group); + const std::vector<const Record *> &Parents = + DiagGroupParents.getParents(Group); for (unsigned i = 0, e = Parents.size(); i != e; ++i) markGroup(Parents[i]); } @@ -359,7 +361,7 @@ void InferPedantic::compute(VecOrSet DiagsInPedantic, // "pedantic" group. For those that aren't explicitly included in -Wpedantic, // mark them for consideration to be included in -Wpedantic directly. for (unsigned i = 0, e = Diags.size(); i != e; ++i) { - Record *R = Diags[i]; + const Record *R = Diags[i]; if (isExtension(R) && isOffByDefault(R)) { DiagsSet.insert(R); if (DefInit *Group = dyn_cast<DefInit>(R->getValueInit("Group"))) { @@ -375,7 +377,7 @@ void InferPedantic::compute(VecOrSet DiagsInPedantic, // march through Diags a second time to ensure the results are emitted // in deterministic order. for (unsigned i = 0, e = Diags.size(); i != e; ++i) { - Record *R = Diags[i]; + const Record *R = Diags[i]; if (!DiagsSet.count(R)) continue; // Check if the group is implicitly in -Wpedantic. If so, @@ -401,13 +403,14 @@ void InferPedantic::compute(VecOrSet DiagsInPedantic, // march through the groups to ensure the results are emitted /// in a deterministc order. for (unsigned i = 0, ei = DiagGroups.size(); i != ei; ++i) { - Record *Group = DiagGroups[i]; + const Record *Group = DiagGroups[i]; if (!groupInPedantic(Group)) continue; - const std::vector<Record*> &Parents = DiagGroupParents.getParents(Group); - bool AllParentsInPedantic = - llvm::all_of(Parents, [&](Record *R) { return groupInPedantic(R); }); + const std::vector<const Record *> &Parents = + DiagGroupParents.getParents(Group); + bool AllParentsInPedantic = llvm::all_of( + Parents, [&](const Record *R) { return groupInPedantic(R); }); // If all the parents are in -Wpedantic, this means that this diagnostic // group will be indirectly included by -Wpedantic already. In that // case, do not add it directly to -Wpedantic. If the group has no @@ -583,7 +586,7 @@ struct DiagnosticTextBuilder { DiagnosticTextBuilder(DiagnosticTextBuilder const &) = delete; DiagnosticTextBuilder &operator=(DiagnosticTextBuilder const &) = delete; - DiagnosticTextBuilder(RecordKeeper &Records) { + DiagnosticTextBuilder(const RecordKeeper &Records) { // Build up the list of substitution records. for (auto *S : Records.getAllDerivedDefinitions("TextSubstitution")) { EvaluatingRecordGuard Guard(&EvaluatingRecord, S); @@ -593,7 +596,7 @@ struct DiagnosticTextBuilder { // Check that no diagnostic definitions have the same name as a // substitution. - for (Record *Diag : Records.getAllDerivedDefinitions("Diagnostic")) { + for (const Record *Diag : Records.getAllDerivedDefinitions("Diagnostic")) { StringRef Name = Diag->getName(); if (Substitutions.count(Name)) llvm::PrintFatalError( @@ -1407,7 +1410,7 @@ static void verifyDiagnosticWording(const Record &Diag) { /// ClangDiagsDefsEmitter - The top-level class emits .def files containing /// declarations of Clang diagnostics. -void clang::EmitClangDiagsDefs(RecordKeeper &Records, raw_ostream &OS, +void clang::EmitClangDiagsDefs(const RecordKeeper &Records, raw_ostream &OS, const std::string &Component) { // Write the #if guard if (!Component.empty()) { @@ -1421,10 +1424,11 @@ void clang::EmitClangDiagsDefs(RecordKeeper &Records, raw_ostream &OS, DiagnosticTextBuilder DiagTextBuilder(Records); - std::vector<Record *> Diags = Records.getAllDerivedDefinitions("Diagnostic"); + ArrayRef<const Record *> Diags = + Records.getAllDerivedDefinitions("Diagnostic"); - std::vector<Record*> DiagGroups - = Records.getAllDerivedDefinitions("DiagGroup"); + ArrayRef<const Record *> DiagGroups = + Records.getAllDerivedDefinitions("DiagGroup"); std::map<std::string, GroupInfo> DiagsInGroup; groupDiagnostics(Diags, DiagGroups, DiagsInGroup); @@ -1764,7 +1768,7 @@ static void emitDiagTable(std::map<std::string, GroupInfo> &DiagsInGroup, /// CATEGORY("Lambda Issue", DiagCat_Lambda_Issue) /// #endif /// \endcode -static void emitCategoryTable(RecordKeeper &Records, raw_ostream &OS) { +static void emitCategoryTable(const RecordKeeper &Records, raw_ostream &OS) { DiagCategoryIDMap CategoriesByID(Records); OS << "\n#ifdef GET_CATEGORY_TABLE\n"; for (auto const &C : CategoriesByID) @@ -1772,13 +1776,14 @@ static void emitCategoryTable(RecordKeeper &Records, raw_ostream &OS) { OS << "#endif // GET_CATEGORY_TABLE\n\n"; } -void clang::EmitClangDiagGroups(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitClangDiagGroups(const RecordKeeper &Records, raw_ostream &OS) { // Compute a mapping from a DiagGroup to all of its parents. DiagGroupParentMap DGParentMap(Records); - std::vector<Record *> Diags = Records.getAllDerivedDefinitions("Diagnostic"); + ArrayRef<const Record *> Diags = + Records.getAllDerivedDefinitions("Diagnostic"); - std::vector<Record *> DiagGroups = + ArrayRef<const Record *> DiagGroups = Records.getAllDerivedDefinitions("DiagGroup"); std::map<std::string, GroupInfo> DiagsInGroup; @@ -1824,9 +1829,10 @@ struct RecordIndexElement }; } // end anonymous namespace. -void clang::EmitClangDiagsIndexName(RecordKeeper &Records, raw_ostream &OS) { - const std::vector<Record*> &Diags = - Records.getAllDerivedDefinitions("Diagnostic"); +void clang::EmitClangDiagsIndexName(const RecordKeeper &Records, + raw_ostream &OS) { + ArrayRef<const Record *> Diags = + Records.getAllDerivedDefinitions("Diagnostic"); std::vector<RecordIndexElement> Index; Index.reserve(Diags.size()); @@ -1915,7 +1921,7 @@ void writeDiagnosticText(DiagnosticTextBuilder &Builder, const Record *R, } // namespace } // namespace docs -void clang::EmitClangDiagDocs(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitClangDiagDocs(const RecordKeeper &Records, raw_ostream &OS) { using namespace docs; // Get the documentation introduction paragraph. @@ -1930,10 +1936,10 @@ void clang::EmitClangDiagDocs(RecordKeeper &Records, raw_ostream &OS) { DiagnosticTextBuilder Builder(Records); - std::vector<Record*> Diags = + ArrayRef<const Record *> Diags = Records.getAllDerivedDefinitions("Diagnostic"); - std::vector<Record*> DiagGroups = + std::vector<const Record *> DiagGroups = Records.getAllDerivedDefinitions("DiagGroup"); llvm::sort(DiagGroups, diagGroupBeforeByName); diff --git a/clang/utils/TableGen/TableGenBackends.h b/clang/utils/TableGen/TableGenBackends.h index fe55ef2f423afe..6b8d7f82ec9845 100644 --- a/clang/utils/TableGen/TableGenBackends.h +++ b/clang/utils/TableGen/TableGenBackends.h @@ -76,10 +76,11 @@ void EmitClangAttrDocTable(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitClangBuiltins(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitClangDiagsDefs(llvm::RecordKeeper &Records, llvm::raw_ostream &OS, - const std::string &Component); -void EmitClangDiagGroups(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitClangDiagsIndexName(llvm::RecordKeeper &Records, +void EmitClangDiagsDefs(const llvm::RecordKeeper &Records, + llvm::raw_ostream &OS, const std::string &Component); +void EmitClangDiagGroups(const llvm::RecordKeeper &Records, + llvm::raw_ostream &OS); +void EmitClangDiagsIndexName(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitClangSACheckers(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); @@ -142,7 +143,8 @@ void EmitCdeBuiltinCG(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitCdeBuiltinAliases(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitClangAttrDocs(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitClangDiagDocs(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitClangDiagDocs(const llvm::RecordKeeper &Records, + llvm::raw_ostream &OS); void EmitClangOptDocs(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitClangOpenCLBuiltins(const llvm::RecordKeeper &Records, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits