Use uint16_t to store InstrNameIndices in MCInstrInfo. Add asserts to protect all...
authorCraig Topper <craig.topper@gmail.com>
Wed, 7 Mar 2012 05:17:23 +0000 (05:17 +0000)
committerCraig Topper <craig.topper@gmail.com>
Wed, 7 Mar 2012 05:17:23 +0000 (05:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152202 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCInstrInfo.h
utils/TableGen/AsmMatcherEmitter.cpp
utils/TableGen/AsmWriterEmitter.cpp
utils/TableGen/InstrInfoEmitter.cpp
utils/TableGen/StringToOffsetTable.h

index 1d3a36ca7c73afdd77f37d1278dd65168485a8b0..686d4386aa950189fffca825288ff1de3f0b6c95 100644 (file)
@@ -25,14 +25,14 @@ namespace llvm {
 ///
 class MCInstrInfo {
   const MCInstrDesc *Desc;          // Raw array to allow static init'n
-  const unsigned *InstrNameIndices; // Array for name indices in InstrNameData
+  const uint16_t *InstrNameIndices; // Array for name indices in InstrNameData
   const char *InstrNameData;        // Instruction name string pool
   unsigned NumOpcodes;              // Number of entries in the desc array
 
 public:
   /// InitMCInstrInfo - Initialize MCInstrInfo, called by TableGen
   /// auto-generated routines. *DO NOT USE*.
-  void InitMCInstrInfo(const MCInstrDesc *D, const unsigned *NI, const char *ND,
+  void InitMCInstrInfo(const MCInstrDesc *D, const uint16_t *NI, const char *ND,
                        unsigned NO) {
     Desc = D;
     InstrNameIndices = NI;
index cdcc496e7d4b26a55798b9557d37fce31dbab06c..4afee215234077d3527e7f3dd48e4a3dae9f9996 100644 (file)
@@ -2023,7 +2023,7 @@ static void EmitCustomOperandParsing(raw_ostream &OS, CodeGenTarget &Target,
   // Emit the static custom operand parsing table;
   OS << "namespace {\n";
   OS << "  struct OperandMatchEntry {\n";
-  OS << "    static const char *MnemonicTable;\n";
+  OS << "    static const char *const MnemonicTable;\n";
   OS << "    unsigned OperandMask;\n";
   OS << "    uint16_t Mnemonic;\n";
   OS << "    " << getMinimalTypeForRange(Info.Classes.size())
@@ -2079,8 +2079,9 @@ static void EmitCustomOperandParsing(raw_ostream &OS, CodeGenTarget &Target,
 
     // Store a pascal-style length byte in the mnemonic.
     std::string LenMnemonic = char(II.Mnemonic.size()) + II.Mnemonic.str();
-    OS << ", " << StringTable.GetOrAddStringOffset(LenMnemonic, false)
-       << " /* " << II.Mnemonic << " */";
+    unsigned Idx = StringTable.GetOrAddStringOffset(LenMnemonic, false);
+    assert(Idx <= 0xffff && "String offset too large to fit in table");
+    OS << ", " << Idx << " /* " << II.Mnemonic << " */";
 
     OS << ", " << OMI.CI->Name
        << ", ";
@@ -2097,7 +2098,7 @@ static void EmitCustomOperandParsing(raw_ostream &OS, CodeGenTarget &Target,
   }
   OS << "};\n\n";
 
-  OS << "const char *OperandMatchEntry::MnemonicTable =\n";
+  OS << "const char *const OperandMatchEntry::MnemonicTable =\n";
   StringTable.EmitString(OS);
   OS << ";\n\n";
 
@@ -2320,7 +2321,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
   // following the mnemonic.
   OS << "namespace {\n";
   OS << "  struct MatchEntry {\n";
-  OS << "    static const char *MnemonicTable;\n";
+  OS << "    static const char *const MnemonicTable;\n";
   OS << "    uint16_t Opcode;\n";
   OS << "    uint16_t Mnemonic;\n";
   OS << "    " << getMinimalTypeForRange(Info.Matchables.size())
@@ -2363,10 +2364,11 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
 
     // Store a pascal-style length byte in the mnemonic.
     std::string LenMnemonic = char(II.Mnemonic.size()) + II.Mnemonic.str();
+    unsigned Idx = StringTable.GetOrAddStringOffset(LenMnemonic, false);
+    assert(Idx <= 0xffff && "String offset too large to fit in table");
     OS << "  { " << Target.getName() << "::"
        << II.getResultInst()->TheDef->getName() << ", "
-       << StringTable.GetOrAddStringOffset(LenMnemonic, false)
-       << " /* " << II.Mnemonic << " */"
+       << Idx << " /* " << II.Mnemonic << " */"
        << ", " << II.ConversionFnKind << ", { ";
     for (unsigned i = 0, e = II.AsmOperands.size(); i != e; ++i) {
       MatchableInfo::AsmOperand &Op = II.AsmOperands[i];
@@ -2390,7 +2392,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
 
   OS << "};\n\n";
 
-  OS << "const char *MatchEntry::MnemonicTable =\n";
+  OS << "const char *const MatchEntry::MnemonicTable =\n";
   StringTable.EmitString(OS);
   OS << ";\n\n";
 
index 59926a32990a62f7e3a179b6c26d73a2579b0e5f..7671efdde0a3632a38a96643aa4fbf78a95183e1 100644 (file)
@@ -306,6 +306,7 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
     }
 
     // Bias offset by one since we want 0 as a sentinel.
+    assert((Idx+1) <= 0xffff && "String offset too large to fit in table");
     OpcodeInfo.push_back(Idx+1);
   }
 
@@ -373,7 +374,7 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
   O << "  };\n\n";
 
   // Emit the string itself.
-  O << "  const char *AsmStrs = \n";
+  O << "  const char *const AsmStrs = \n";
   StringTable.EmitString(O);
   O << ";\n\n";
 
@@ -496,7 +497,9 @@ emitRegisterNameString(raw_ostream &O, StringRef AltName,
       }
     }
 
-    O << StringTable.GetOrAddStringOffset(AsmName);
+    unsigned Idx = StringTable.GetOrAddStringOffset(AsmName);
+    assert(Idx <= 0xffff && "String offset too large to fit in table");
+    O << Idx;
     if (((i + 1) % 14) == 0)
       O << ",\n    ";
     else
@@ -591,7 +594,9 @@ void AsmWriterEmitter::EmitGetInstructionName(raw_ostream &O) {
     if ((i % 14) == 0)
       O << "\n    ";
 
-    O << StringTable.GetOrAddStringOffset(AsmName) << ", ";
+    unsigned Idx = StringTable.GetOrAddStringOffset(AsmName);
+    assert(Idx <= 0xffff && "String offset too large to fit in table");
+    O << Idx << ", ";
   }
   O << "0\n"
   << "  };\n"
index 4c4cd18e1cc3d698aeee628cd1841e8879587e88..b539194f86035b5ecee491c6d566936024436202 100644 (file)
@@ -213,18 +213,20 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
                OperandInfoIDs, OS);
   OS << "};\n\n";
 
-  OS << "extern const unsigned " << TargetName <<"InstrNameIndices[] = {\n    ";
+  OS << "extern const uint16_t " << TargetName <<"InstrNameIndices[] = {\n    ";
   StringToOffsetTable StringTable;
   for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) {
     const CodeGenInstruction *Instr = NumberedInstructions[i];
-    OS << StringTable.GetOrAddStringOffset(Instr->TheDef->getName()) << "U, ";
+    unsigned Idx = StringTable.GetOrAddStringOffset(Instr->TheDef->getName());
+    assert(Idx <= 0xffff && "String offset too large to fit in table");
+    OS << Idx << "U, ";
     if (i % 8 == 0)
       OS << "\n    ";
   }
 
   OS << "\n};\n\n";
 
-  OS << "const char *" << TargetName << "InstrNameData =\n";
+  OS << "extern const char *const " << TargetName << "InstrNameData =\n";
   StringTable.EmitString(OS);
   OS << ";\n\n";
 
@@ -257,7 +259,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
 
   OS << "namespace llvm {\n";
   OS << "extern const MCInstrDesc " << TargetName << "Insts[];\n";
-  OS << "extern const unsigned " << TargetName << "InstrNameIndices[];\n";
+  OS << "extern const uint16_t " << TargetName << "InstrNameIndices[];\n";
   OS << "extern const char *" << TargetName << "InstrNameData;\n";
   OS << ClassName << "::" << ClassName << "(int SO, int DO)\n"
      << "  : TargetInstrInfoImpl(SO, DO) {\n"
index 803f5bd5cf014e1d5e7a18f60d11bc769a8e0745..6d528a2b0a7d9064101afe2a4a11f21e23f7a841 100644 (file)
@@ -40,6 +40,9 @@ public:
   }
   
   void EmitString(raw_ostream &O) {
+    assert(AggregateString.size() <= 65536 &&
+           "Aggregate string too large to be portable");
+
     // Escape the string.
     SmallString<256> Str;
     raw_svector_ostream(Str).write_escaped(AggregateString);