]> granicus.if.org Git - clang/commitdiff
Move individual group name strings from the OptionTable into one big char array....
authorCraig Topper <craig.topper@gmail.com>
Thu, 29 Aug 2013 05:18:04 +0000 (05:18 +0000)
committerCraig Topper <craig.topper@gmail.com>
Thu, 29 Aug 2013 05:18:04 +0000 (05:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189568 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/DiagnosticIDs.cpp
tools/diagtool/DiagnosticNames.cpp
tools/diagtool/DiagnosticNames.h
tools/diagtool/TreeView.cpp
utils/TableGen/ClangDiagnosticsEmitter.cpp

index cccf418f65fddad378a7c7b2f2ff9e67a0cdb1d6..71752bb38f6dd85bf498c9447163b6abfc705d31 100644 (file)
@@ -501,21 +501,22 @@ DiagnosticIDs::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass,
   return Result;
 }
 
+#define GET_DIAG_ARRAYS
+#include "clang/Basic/DiagnosticGroups.inc"
+#undef GET_DIAG_ARRAYS
+
 struct clang::WarningOption {
-  const char *NameStr;
-  uint16_t NameLen;
+  uint16_t NameOffset;
   uint16_t Members;
   uint16_t SubGroups;
 
+  // String is stored with a pascal-style length byte.
   StringRef getName() const {
-    return StringRef(NameStr, NameLen);
+    return StringRef(DiagGroupNames + NameOffset + 1,
+                     DiagGroupNames[NameOffset]);
   }
 };
 
-#define GET_DIAG_ARRAYS
-#include "clang/Basic/DiagnosticGroups.inc"
-#undef GET_DIAG_ARRAYS
-
 // Second the table of options, sorted by name for fast binary lookup.
 static const WarningOption OptionTable[] = {
 #define GET_DIAG_TABLE
@@ -524,9 +525,8 @@ static const WarningOption OptionTable[] = {
 };
 static const size_t OptionTableSize = llvm::array_lengthof(OptionTable);
 
-static bool WarningOptionCompare(const WarningOption &LHS,
-                                 const WarningOption &RHS) {
-  return LHS.getName() < RHS.getName();
+static bool WarningOptionCompare(const WarningOption &LHS, StringRef RHS) {
+  return LHS.getName() < RHS;
 }
 
 /// getWarningOptionForDiag - Return the lowest-level warning option that
@@ -555,11 +555,8 @@ void DiagnosticIDs::getDiagnosticsInGroup(
 bool DiagnosticIDs::getDiagnosticsInGroup(
     StringRef Group,
     SmallVectorImpl<diag::kind> &Diags) const {
-  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 =
-  std::lower_bound(OptionTable, OptionTable + OptionTableSize, Key,
+  std::lower_bound(OptionTable, OptionTable + OptionTableSize, Group,
                    WarningOptionCompare);
   if (Found == OptionTable + OptionTableSize ||
       Found->getName() != Group)
index fa510eb6ec448e7409e1f54b544fd1e35c9d1509..34c3229c6eb61fb22c6f3f8a98203b8da8863f2a 100644 (file)
@@ -73,6 +73,10 @@ static const GroupRecord OptionTable[] = {
 #undef GET_DIAG_TABLE
 };
 
+llvm::StringRef GroupRecord::getName() const {
+  return StringRef(DiagGroupNames + NameOffset + 1, DiagGroupNames[NameOffset]);
+}
+
 GroupRecord::subgroup_iterator GroupRecord::subgroup_begin() const {
   return DiagSubGroups + SubGroups;
 }
index 957a1818e89c4315d9754a4d99a9eefd0de37e7f..a3321fa6817577dac798b45a63849df5635ca247 100644 (file)
@@ -35,14 +35,11 @@ namespace diagtool {
 
 
   struct GroupRecord {
-    const char *NameStr;
-    uint16_t NameLen;
+    uint16_t NameOffset;
     uint16_t Members;
     uint16_t SubGroups;
 
-    llvm::StringRef getName() const {
-      return llvm::StringRef(NameStr, NameLen);
-    }
+    llvm::StringRef getName() const;
 
     template<typename RecordType>
     class group_iterator {
@@ -94,8 +91,8 @@ namespace diagtool {
     diagnostics_iterator diagnostics_begin() const;
     diagnostics_iterator diagnostics_end() const;
 
-    bool operator<(const GroupRecord &Other) const {
-      return getName() < Other.getName();
+    bool operator<(llvm::StringRef Other) const {
+      return getName() < Other;
     }
   };
 
index 10809c1d8d99951055e3d8e42c8ad4e5428d1a33..fd548ef011bd10e203ce80b81a48aa0fa05ba970 100644 (file)
@@ -99,9 +99,8 @@ static int showGroup(llvm::raw_ostream &out, StringRef RootGroup,
     return 1;
   }
 
-  GroupRecord Key = { RootGroup.data(), (uint16_t)RootGroup.size(), 0, 0 };
   const GroupRecord *Found =
-    std::lower_bound(AllGroups.begin(), AllGroups.end(), Key);
+    std::lower_bound(AllGroups.begin(), AllGroups.end(), RootGroup);
   
   if (Found == AllGroups.end() || Found->getName() != RootGroup) {
     llvm::errs() << "No such diagnostic group exists\n";
index 9a1cd345a7de200816a12f95cb13218daecb6241..d1bd58e1aa7ecf5ba32f2f684de98972ec1f5724 100644 (file)
@@ -24,6 +24,7 @@
 #include "llvm/Support/Debug.h"
 #include "llvm/TableGen/Error.h"
 #include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/StringToOffsetTable.h"
 #include "llvm/TableGen/TableGenBackend.h"
 #include <algorithm>
 #include <cctype>
@@ -671,7 +672,20 @@ void EmitClangDiagGroups(RecordKeeper &Records, raw_ostream &OS) {
       OS << "-1,\n";
     }
   }
-  OS << "};\n";
+  OS << "};\n\n";
+
+  StringToOffsetTable GroupNames;
+  for (std::map<std::string, GroupInfo>::const_iterator
+         I = DiagsInGroup.begin(), E = DiagsInGroup.end(); I != E; ++I) {
+    // Store a pascal-style length byte at the beginning of the string.
+    std::string Name = char(I->first.size()) + I->first;
+    GroupNames.GetOrAddStringOffset(Name, false);
+  }
+
+  OS << "static const char DiagGroupNames[] = {\n";
+  GroupNames.EmitString(OS);
+  OS << "};\n\n";
+
   OS << "#endif // GET_DIAG_ARRAYS\n\n";
 
   // Emit the table now.
@@ -680,18 +694,16 @@ void EmitClangDiagGroups(RecordKeeper &Records, raw_ostream &OS) {
   for (std::map<std::string, GroupInfo>::const_iterator
        I = DiagsInGroup.begin(), E = DiagsInGroup.end(); I != E; ++I) {
     // Group option string.
-    OS << "  { ";
-    OS << "\"";
+    OS << "  { /* ";
     if (I->first.find_first_not_of("abcdefghijklmnopqrstuvwxyz"
                                    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                                    "0123456789!@#$%^*-+=:?")!=std::string::npos)
       PrintFatalError("Invalid character in diagnostic group '" +
                       I->first + "'");
-    OS.write_escaped(I->first) << "\","
-                               << 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() << ", ";
+    OS << I->first << " */ " << std::string(MaxLen-I->first.size(), ' ');
+    // Store a pascal-style length byte at the beginning of the string.
+    std::string Name = char(I->first.size()) + I->first;
+    OS << GroupNames.GetOrAddStringOffset(Name, false) << ", ";
 
     // Special handling for 'pedantic'.
     const bool IsPedantic = I->first == "pedantic";
@@ -707,7 +719,7 @@ void EmitClangDiagGroups(RecordKeeper &Records, raw_ostream &OS) {
         DiagArrayIndex += DiagsInPedantic.size();
       DiagArrayIndex += V.size() + 1;
     } else {
-      OS << "/* Empty */ 0, ";
+      OS << "/* Empty */     0, ";
     }
 
     // Subgroups.
@@ -720,7 +732,7 @@ void EmitClangDiagGroups(RecordKeeper &Records, raw_ostream &OS) {
         SubGroupIndex += GroupsInPedantic.size();
       SubGroupIndex += SubGroups.size() + 1;
     } else {
-      OS << "/* Empty */ 0";
+      OS << "/* Empty */         0";
     }
     OS << " },\n";
   }