summaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2012-02-15 20:57:03 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2012-02-15 20:57:03 +0000
commitd49cb20288b2dbc222aaf5673c1a4738c151b7bf (patch)
treecb9671a267826548d4a2d95930657ce7043d5bda /utils
parentceb15656fbab9ee1da319afa4934b8f6a5964758 (diff)
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
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/ClangDiagnosticsEmitter.cpp28
1 files changed, 23 insertions, 5 deletions
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 <map>
#include <algorithm>
#include <functional>
+#include <set>
using namespace llvm;
//===----------------------------------------------------------------------===//
@@ -138,7 +139,21 @@ void ClangDiagsDefsEmitter::run(raw_ostream &OS) {
const std::vector<Record*> &Diags =
Records.getAllDerivedDefinitions("Diagnostic");
-
+
+ // Make a sorted set of all warning opts so we can get the index.
+ std::set<std::string> WarningOpts;
+ for (unsigned i = 0, e = Diags.size(); i != e; ++i) {
+ const Record *R = Diags[i];
+ DefInit *DI = dynamic_cast<DefInit*>(R->getValueInit("Group"));
+ if (DI)
+ WarningOpts.insert(DI->getDef()->getValueAsString("GroupName"));
+ }
+
+ std::vector<Record*> 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<DefInit*>(R.getValueInit("Group"))) {
- OS << ", \"";
- OS.write_escaped(DI->getDef()->getValueAsString("GroupName")) << '"';
+ std::set<std::string>::iterator I =
+ WarningOpts.find(DI->getDef()->getValueAsString("GroupName"));
+ assert(I != WarningOpts.end());
+ OS << ", " << std::distance(WarningOpts.begin(), I);
} else {
- OS << ", \"\"";
+ OS << ", 0";
}
// SFINAE bit