Reorder and shrink size of NameLen field in diagnostic group table. Shaves ~4K from clang binary.

llvm-svn: 189445
This commit is contained in:
Craig Topper 2013-08-28 06:01:10 +00:00
parent 8a0caa8525
commit a3891a7568
4 changed files with 14 additions and 11 deletions

View File

@ -502,11 +502,8 @@ DiagnosticIDs::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass,
} }
struct clang::WarningOption { struct clang::WarningOption {
// Be safe with the size of 'NameLen' because we don't statically check if
// the size will fit in the field; the struct size won't decrease with a
// shorter type anyway.
size_t NameLen;
const char *NameStr; const char *NameStr;
uint16_t NameLen;
uint16_t Members; uint16_t Members;
uint16_t SubGroups; uint16_t SubGroups;
@ -558,7 +555,9 @@ void DiagnosticIDs::getDiagnosticsInGroup(
bool DiagnosticIDs::getDiagnosticsInGroup( bool DiagnosticIDs::getDiagnosticsInGroup(
StringRef Group, StringRef Group,
SmallVectorImpl<diag::kind> &Diags) const { SmallVectorImpl<diag::kind> &Diags) const {
WarningOption Key = { Group.size(), Group.data(), 0, 0 }; if (Group.size() > UINT16_MAX)
return true; // Option is too long to be one in the table.
WarningOption Key = { Group.data(), (uint16_t)Group.size(), 0, 0 };
const WarningOption *Found = const WarningOption *Found =
std::lower_bound(OptionTable, OptionTable + OptionTableSize, Key, std::lower_bound(OptionTable, OptionTable + OptionTableSize, Key,
WarningOptionCompare); WarningOptionCompare);

View File

@ -35,11 +35,8 @@ namespace diagtool {
struct GroupRecord { struct GroupRecord {
// Be safe with the size of 'NameLen' because we don't statically check if
// the size will fit in the field; the struct size won't decrease with a
// shorter type anyway.
size_t NameLen;
const char *NameStr; const char *NameStr;
uint16_t NameLen;
uint16_t Members; uint16_t Members;
uint16_t SubGroups; uint16_t SubGroups;

View File

@ -94,7 +94,12 @@ static int showGroup(llvm::raw_ostream &out, StringRef RootGroup,
bool FlagsOnly) { bool FlagsOnly) {
ArrayRef<GroupRecord> AllGroups = getDiagnosticGroups(); ArrayRef<GroupRecord> AllGroups = getDiagnosticGroups();
GroupRecord Key = { RootGroup.size(), RootGroup.data(), 0, 0 }; if (RootGroup.size() > UINT16_MAX) {
llvm::errs() << "No such diagnostic group exists\n";
return 1;
}
GroupRecord Key = { RootGroup.data(), (uint16_t)RootGroup.size(), 0, 0 };
const GroupRecord *Found = const GroupRecord *Found =
std::lower_bound(AllGroups.begin(), AllGroups.end(), Key); std::lower_bound(AllGroups.begin(), AllGroups.end(), Key);

View File

@ -681,7 +681,6 @@ void EmitClangDiagGroups(RecordKeeper &Records, raw_ostream &OS) {
I = DiagsInGroup.begin(), E = DiagsInGroup.end(); I != E; ++I) { I = DiagsInGroup.begin(), E = DiagsInGroup.end(); I != E; ++I) {
// Group option string. // Group option string.
OS << " { "; OS << " { ";
OS << I->first.size() << ", ";
OS << "\""; OS << "\"";
if (I->first.find_first_not_of("abcdefghijklmnopqrstuvwxyz" if (I->first.find_first_not_of("abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@ -690,6 +689,9 @@ void EmitClangDiagGroups(RecordKeeper &Records, raw_ostream &OS) {
I->first + "'"); I->first + "'");
OS.write_escaped(I->first) << "\"," OS.write_escaped(I->first) << "\","
<< std::string(MaxLen-I->first.size()+1, ' '); << std::string(MaxLen-I->first.size()+1, ' ');
if (I->first.size() > UINT16_MAX)
PrintFatalError("Diagnostic group name is too long for NameLen field.");
OS << I->first.size() << ", ";
// Special handling for 'pedantic'. // Special handling for 'pedantic'.
const bool IsPedantic = I->first == "pedantic"; const bool IsPedantic = I->first == "pedantic";