[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
Craig Topper
craig.topper at gmail.com
Tue Mar 6 21:17:24 PST 2012
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);
More information about the llvm-commits
mailing list