From d49cb20288b2dbc222aaf5673c1a4738c151b7bf Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Wed, 15 Feb 2012 20:57:03 +0000 Subject: 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 --- utils/TableGen/ClangDiagnosticsEmitter.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'utils') 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 -- cgit v1.2.3