forked from OSchip/llvm-project
Fix PR14568: Avoid the DFA packetizer from making an invalid read
beyond array bounds. No test case since I cannot reproduce an ICE with this bug. According to Carlos -- the bug reporter -- a segfault occurs only when LLVM is compiled with a specific version of GCC. llvm-svn: 169783
This commit is contained in:
parent
3b188b1752
commit
3923e286cd
|
@ -279,6 +279,7 @@ DFAPacketizerEmitter::DFAPacketizerEmitter(RecordKeeper &R):
|
|||
//
|
||||
//
|
||||
void DFA::writeTableAndAPI(raw_ostream &OS, const std::string &TargetName) {
|
||||
static const std::string SentinelEntry = "{-1, -1}";
|
||||
DFA::StateSet::iterator SI = states.begin();
|
||||
// This table provides a map to the beginning of the transitions for State s
|
||||
// in DFAStateInputTable.
|
||||
|
@ -305,12 +306,17 @@ void DFA::writeTableAndAPI(raw_ostream &OS, const std::string &TargetName) {
|
|||
// If there are no valid transitions from this stage, we need a sentinel
|
||||
// transition.
|
||||
if (ValidTransitions == StateEntry[i]) {
|
||||
OS << "{-1, -1},";
|
||||
OS << SentinelEntry << ",";
|
||||
++ValidTransitions;
|
||||
}
|
||||
|
||||
OS << "\n";
|
||||
}
|
||||
|
||||
// Print out a sentinel entry at the end of the StateInputTable. This is
|
||||
// needed to iterate over StateInputTable in DFAPacketizer::ReadTable()
|
||||
OS << SentinelEntry << "\n";
|
||||
|
||||
OS << "};\n\n";
|
||||
OS << "const unsigned int " << TargetName << "DFAStateEntryTable[] = {\n";
|
||||
|
||||
|
@ -319,6 +325,9 @@ void DFA::writeTableAndAPI(raw_ostream &OS, const std::string &TargetName) {
|
|||
for (unsigned i = 0; i < states.size(); ++i)
|
||||
OS << StateEntry[i] << ", ";
|
||||
|
||||
// Print out the index to the sentinel entry in StateInputTable
|
||||
OS << ValidTransitions << ", ";
|
||||
|
||||
OS << "\n};\n";
|
||||
OS << "} // namespace\n";
|
||||
|
||||
|
|
Loading…
Reference in New Issue