From: Benjamin Kramer Date: Wed, 15 Feb 2012 20:57:03 +0000 (+0000) Subject: Store the warning option corresponding to a diagnostics as an index into the option... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d49cb20288b2dbc222aaf5673c1a4738c151b7bf;p=clang Store the warning option corresponding to a diagnostics as an index into the option table instead of storing the name. Another 8 bytes + relocation removed from every diagnostic on x86_64. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150615 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/DiagnosticIDs.cpp b/lib/Basic/DiagnosticIDs.cpp index 754d7c0322..2f28c5dbf7 100644 --- a/lib/Basic/DiagnosticIDs.cpp +++ b/lib/Basic/DiagnosticIDs.cpp @@ -52,16 +52,13 @@ struct StaticDiagInfoRec { unsigned WarnShowInSystemHeader : 1; unsigned Category : 5; - uint8_t OptionGroupLen; + uint16_t OptionGroupIndex; uint16_t DescriptionLen; - - const char *OptionGroupStr; - const char *DescriptionStr; - StringRef getOptionGroup() const { - return StringRef(OptionGroupStr, OptionGroupLen); + unsigned getOptionGroupIndex() const { + return OptionGroupIndex; } StringRef getDescription() const { @@ -89,10 +86,8 @@ static const StaticDiagInfoRec StaticDiagInfo[] = { SFINAE,ACCESS,NOWERROR,SHOWINSYSHEADER, \ CATEGORY) \ { diag::ENUM, DEFAULT_MAPPING, CLASS, SFINAE, ACCESS, \ - NOWERROR, SHOWINSYSHEADER, CATEGORY, \ - STR_SIZE(GROUP, uint8_t), \ - STR_SIZE(DESC, uint16_t), \ - GROUP, DESC }, + NOWERROR, SHOWINSYSHEADER, CATEGORY, GROUP, \ + STR_SIZE(DESC, uint16_t), DESC }, #include "clang/Basic/DiagnosticCommonKinds.inc" #include "clang/Basic/DiagnosticDriverKinds.inc" #include "clang/Basic/DiagnosticFrontendKinds.inc" @@ -103,7 +98,7 @@ static const StaticDiagInfoRec StaticDiagInfo[] = { #include "clang/Basic/DiagnosticSemaKinds.inc" #include "clang/Basic/DiagnosticAnalysisKinds.inc" #undef DIAG - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; static const unsigned StaticDiagInfoSize = @@ -130,7 +125,7 @@ static const StaticDiagInfoRec *GetDiagInfo(unsigned DiagID) { // Search the diagnostic table with a binary search. StaticDiagInfoRec Find = { static_cast(DiagID), - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const StaticDiagInfoRec *Found = std::lower_bound(StaticDiagInfo, StaticDiagInfo + StaticDiagInfoSize, Find); @@ -164,15 +159,6 @@ static DiagnosticMappingInfo GetDefaultDiagMappingInfo(unsigned DiagID) { return Info; } -/// getWarningOptionForDiag - Return the lowest-level warning option that -/// enables the specified diagnostic. If there is no -Wfoo flag that controls -/// the diagnostic, this returns null. -StringRef DiagnosticIDs::getWarningOptionForDiag(unsigned DiagID) { - if (const StaticDiagInfoRec *Info = GetDiagInfo(DiagID)) - return Info->getOptionGroup(); - return StringRef(); -} - /// getCategoryNumberForDiag - Return the category number that a specified /// DiagID belongs to, or 0 if no category. unsigned DiagnosticIDs::getCategoryNumberForDiag(unsigned DiagID) { @@ -531,6 +517,15 @@ static bool WarningOptionCompare(const WarningOption &LHS, return LHS.getName() < RHS.getName(); } +/// getWarningOptionForDiag - Return the lowest-level warning option that +/// enables the specified diagnostic. If there is no -Wfoo flag that controls +/// the diagnostic, this returns null. +StringRef DiagnosticIDs::getWarningOptionForDiag(unsigned DiagID) { + if (const StaticDiagInfoRec *Info = GetDiagInfo(DiagID)) + return OptionTable[Info->getOptionGroupIndex()].getName(); + return StringRef(); +} + void DiagnosticIDs::getDiagnosticsInGroup( const WarningOption *Group, llvm::SmallVectorImpl &Diags) const diff --git a/utils/TableGen/ClangDiagnosticsEmitter.cpp b/utils/TableGen/ClangDiagnosticsEmitter.cpp index 4b041fee87..529e7ecd6a 100644 --- a/utils/TableGen/ClangDiagnosticsEmitter.cpp +++ b/utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -21,6 +21,7 @@ #include #include #include +#include using namespace llvm; //===----------------------------------------------------------------------===// @@ -138,7 +139,21 @@ void ClangDiagsDefsEmitter::run(raw_ostream &OS) { const std::vector &Diags = Records.getAllDerivedDefinitions("Diagnostic"); - + + // Make a sorted set of all warning opts so we can get the index. + std::set WarningOpts; + for (unsigned i = 0, e = Diags.size(); i != e; ++i) { + const Record *R = Diags[i]; + DefInit *DI = dynamic_cast(R->getValueInit("Group")); + if (DI) + WarningOpts.insert(DI->getDef()->getValueAsString("GroupName")); + } + + std::vector DiagGroups + = Records.getAllDerivedDefinitions("DiagGroup"); + for (unsigned i = 0, e = DiagGroups.size(); i != e; ++i) + WarningOpts.insert(DiagGroups[i]->getValueAsString("GroupName")); + DiagCategoryIDMap CategoryIDs(Records); DiagGroupParentMap DGParentMap(Records); @@ -156,12 +171,15 @@ void ClangDiagsDefsEmitter::run(raw_ostream &OS) { OS << ", \""; OS.write_escaped(R.getValueAsString("Text")) << '"'; - // Warning associated with the diagnostic. + // Warning associated with the diagnostic. This is stored as an index into + // the alphabetically sorted warning table. if (DefInit *DI = dynamic_cast(R.getValueInit("Group"))) { - OS << ", \""; - OS.write_escaped(DI->getDef()->getValueAsString("GroupName")) << '"'; + std::set::iterator I = + WarningOpts.find(DI->getDef()->getValueAsString("GroupName")); + assert(I != WarningOpts.end()); + OS << ", " << std::distance(WarningOpts.begin(), I); } else { - OS << ", \"\""; + OS << ", 0"; } // SFINAE bit