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. llvm-svn: 150615
This commit is contained in:
parent
f9c73f6629
commit
a8cafe23e3
|
@ -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<unsigned short>(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<diag::kind> &Diags) const
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue