[llvm-commits] [llvm] r152202 - in /llvm/trunk: include/llvm/MC/MCInstrInfo.h utils/TableGen/AsmMatcherEmitter.cpp utils/TableGen/AsmWriterEmitter.cpp utils/TableGen/InstrInfoEmitter.cpp utils/TableGen/StringToOffsetTable.h

Chad Rosier mcrosier at apple.com
Wed Mar 7 09:18:48 PST 2012


Hi Craig,
This was causing failures on our internal buildbots, so I reverted it in r152233.  I'll send you some additional information shortly.

 Chad

On Mar 6, 2012, at 9:17 PM, Craig Topper wrote:

> Author: ctopper
> Date: Tue Mar  6 23:17:23 2012
> New Revision: 152202
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=152202&view=rev
> Log:
> Use uint16_t to store InstrNameIndices in MCInstrInfo. Add asserts to protect all 16-bit string table offsets. Also make sure the string to offset table string is not larger than 65536 characters since larger string literals aren't portable.
> 
> Modified:
>    llvm/trunk/include/llvm/MC/MCInstrInfo.h
>    llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
>    llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp
>    llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp
>    llvm/trunk/utils/TableGen/StringToOffsetTable.h
> 
> Modified: llvm/trunk/include/llvm/MC/MCInstrInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCInstrInfo.h?rev=152202&r1=152201&r2=152202&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCInstrInfo.h (original)
> +++ llvm/trunk/include/llvm/MC/MCInstrInfo.h Tue Mar  6 23:17:23 2012
> @@ -25,14 +25,14 @@
> ///
> 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;
> 
> Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=152202&r1=152201&r2=152202&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Tue Mar  6 23:17:23 2012
> @@ -2023,7 +2023,7 @@
>   // 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 @@
> 
>     // 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 @@
>   }
>   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 @@
>   // 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 @@
> 
>     // 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 @@
> 
>   OS << "};\n\n";
> 
> -  OS << "const char *MatchEntry::MnemonicTable =\n";
> +  OS << "const char *const MatchEntry::MnemonicTable =\n";
>   StringTable.EmitString(OS);
>   OS << ";\n\n";
> 
> 
> Modified: llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp?rev=152202&r1=152201&r2=152202&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp Tue Mar  6 23:17:23 2012
> @@ -306,6 +306,7 @@
>     }
> 
>     // 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 @@
>   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 @@
>       }
>     }
> 
> -    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 @@
>     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"
> 
> Modified: llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp?rev=152202&r1=152201&r2=152202&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp Tue Mar  6 23:17:23 2012
> @@ -213,18 +213,20 @@
>                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 @@
> 
>   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"
> 
> Modified: llvm/trunk/utils/TableGen/StringToOffsetTable.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/StringToOffsetTable.h?rev=152202&r1=152201&r2=152202&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/StringToOffsetTable.h (original)
> +++ llvm/trunk/utils/TableGen/StringToOffsetTable.h Tue Mar  6 23:17:23 2012
> @@ -40,6 +40,9 @@
>   }
> 
>   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);
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list