================
@@ -1672,6 +1673,144 @@ void clang::EmitClangDiagsEnums(const RecordKeeper
&Records, raw_ostream &OS,
}
}
+//===----------------------------------------------------------------------===//
+// Stable ID Tables generation
+//===----------------------------------------------------------------------===//
+
+namespace {
+
+/// Holds the string table for all Stable IDs, plus the arrays of legacy Stable
+/// IDs for renamed diagnostics.
+class DiagStableIDsMap {
+ StringToOffsetTable StableIDs;
+ std::vector<uint32_t> LegacyStableIDs;
+ std::map<StringRef, uint32_t> LegacyStableIDsStartOffsets;
+
+public:
+ DiagStableIDsMap(const RecordKeeper &Records) {
+ LegacyStableIDs.push_back(0); // Empty array at offset 0
+
+ for (const Record *Diag : Records.getAllDerivedDefinitions("Diagnostic")) {
+ StringRef StableID = getStableID(*Diag);
+ // Memoize the Stable ID
+ StableIDs.GetOrAddStringOffset(StableID);
+
+ auto LegacyIDList = Diag->getValueAsListOfStrings("LegacyStableIds");
+ if (!LegacyIDList.empty()) {
+ // Memoize any Legacy Stable IDs, and list their offsets in an array.
+ size_t StartOffset = LegacyStableIDs.size();
+ LegacyStableIDsStartOffsets.insert(
+ std::make_pair(Diag->getName(), StartOffset));
+ for (const auto LegacyID : LegacyIDList) {
+ unsigned Offset = StableIDs.GetOrAddStringOffset(LegacyID);
+ LegacyStableIDs.push_back(Offset);
+ }
+ LegacyStableIDs.push_back(0); // Terminate the array.
+ }
+ }
+ }
+
+ /// Gets the string table offset of the Stable ID for the specified
Diagnostic
+ /// record.
+ uint32_t getStableIDOffset(const Record &R) const {
+ return StableIDs.GetStringOffset(getStableID(R)).value();
+ }
+
+ /// Gets the offset in the DiagLegacyStableIDs array of the first element of
+ /// the diagnostic's list of legacy Stable IDs.
+ uint32_t getLegacyStableIDsStartOffset(StringRef Name) const {
+ auto found = LegacyStableIDsStartOffsets.find(Name);
+ if (found != LegacyStableIDsStartOffsets.cend()) {
+ return found->second;
+ } else {
+ return 0;
+ }
----------------
steakhal wrote:
If `LegacyStableIDsStartOffsets` was an `llvm::StringMap<>`, we could use
`.lookup(Name)` here and just return that.
If not found, it would also just implicitly return 0.
https://github.com/llvm/llvm-project/pull/168153
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits