diff options
| author | Reid Kleckner <rnk@google.com> | 2016-10-13 17:33:22 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2016-10-13 17:33:22 +0000 |
| commit | edfc9dcf42c5f19f72a13fa62ba5d352d6b3ce99 (patch) | |
| tree | 9d359e0051e0d6418849ab09d0a18f127366b0b2 /llvm/lib/DebugInfo | |
| parent | 8750e94c7a3f40757283349049560356cdef960d (diff) | |
| download | bcm5719-llvm-edfc9dcf42c5f19f72a13fa62ba5d352d6b3ce99.tar.gz bcm5719-llvm-edfc9dcf42c5f19f72a13fa62ba5d352d6b3ce99.zip | |
Truncate long names in type records
In the MS ABI, the frontend is supposed to MD5 such pathologically long
names. LLVM should still defend itself from long names, though.
Fixes part of PR29098.
llvm-svn: 284136
Diffstat (limited to 'llvm/lib/DebugInfo')
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeRecordBuilder.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp | 35 |
2 files changed, 29 insertions, 18 deletions
diff --git a/llvm/lib/DebugInfo/CodeView/TypeRecordBuilder.cpp b/llvm/lib/DebugInfo/CodeView/TypeRecordBuilder.cpp index 88fbb233097..f775bdd8202 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeRecordBuilder.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeRecordBuilder.cpp @@ -92,9 +92,15 @@ void TypeRecordBuilder::writeEncodedUnsignedInteger(uint64_t Value) { } void TypeRecordBuilder::writeNullTerminatedString(StringRef Value) { - // Microsoft's linker seems to have trouble with symbol names longer than - // 0xffd8 bytes. - Value = Value.substr(0, 0xffd8); + // Usually the null terminated string comes last, so truncate it to avoid a + // record larger than MaxNameLength. Don't do this if this is a list record. + // Those have special handling to split the record. + unsigned MaxNameLength = MaxRecordLength; + if (Kind != TypeRecordKind::FieldList && + Kind != TypeRecordKind::MethodOverloadList) + MaxNameLength = maxBytesRemaining(); + assert(MaxNameLength > 0 && "need room for null terminator"); + Value = Value.take_front(MaxNameLength - 1); Stream.write(Value.data(), Value.size()); writeUInt8(0); } diff --git a/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp b/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp index 03f8b1d218b..fcf27962102 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp @@ -89,6 +89,19 @@ TypeIndex TypeTableBuilder::writeKnownType(const PointerRecord &Record) { return writeRecord(Builder); } +static void writeNameAndUniqueName(TypeRecordBuilder &Builder, ClassOptions CO, + StringRef Name, StringRef UniqueName) { + // Truncate the names to half the remaining record length. + unsigned MaxNameLength = Builder.maxBytesRemaining() / 2; + Name = Name.take_front(MaxNameLength - 1); + UniqueName = UniqueName.take_front(MaxNameLength - 1); + + Builder.writeNullTerminatedString(Name); + if ((CO & ClassOptions::HasUniqueName) != ClassOptions::None) { + Builder.writeNullTerminatedString(UniqueName); + } +} + TypeIndex TypeTableBuilder::writeKnownType(const ArrayRecord &Record) { TypeRecordBuilder Builder(Record.getKind()); @@ -118,11 +131,8 @@ TypeIndex TypeTableBuilder::writeKnownType(const ClassRecord &Record) { Builder.writeTypeIndex(Record.getDerivationList()); Builder.writeTypeIndex(Record.getVTableShape()); Builder.writeEncodedUnsignedInteger(Record.getSize()); - Builder.writeNullTerminatedString(Record.getName()); - if ((Record.getOptions() & ClassOptions::HasUniqueName) != - ClassOptions::None) { - Builder.writeNullTerminatedString(Record.getUniqueName()); - } + writeNameAndUniqueName(Builder, Record.getOptions(), Record.getName(), + Record.getUniqueName()); return writeRecord(Builder); } @@ -136,11 +146,8 @@ TypeIndex TypeTableBuilder::writeKnownType(const UnionRecord &Record) { Builder.writeUInt16(Flags); Builder.writeTypeIndex(Record.getFieldList()); Builder.writeEncodedUnsignedInteger(Record.getSize()); - Builder.writeNullTerminatedString(Record.getName()); - if ((Record.getOptions() & ClassOptions::HasUniqueName) != - ClassOptions::None) { - Builder.writeNullTerminatedString(Record.getUniqueName()); - } + writeNameAndUniqueName(Builder, Record.getOptions(), Record.getName(), + Record.getUniqueName()); return writeRecord(Builder); } @@ -151,11 +158,8 @@ TypeIndex TypeTableBuilder::writeKnownType(const EnumRecord &Record) { Builder.writeUInt16(static_cast<uint16_t>(Record.getOptions())); Builder.writeTypeIndex(Record.getUnderlyingType()); Builder.writeTypeIndex(Record.getFieldList()); - Builder.writeNullTerminatedString(Record.getName()); - if ((Record.getOptions() & ClassOptions::HasUniqueName) != - ClassOptions::None) { - Builder.writeNullTerminatedString(Record.getUniqueName()); - } + writeNameAndUniqueName(Builder, Record.getOptions(), Record.getName(), + Record.getUniqueName()); return writeRecord(Builder); } @@ -198,6 +202,7 @@ TypeIndex TypeTableBuilder::writeKnownType(const VFTableRecord &Record) { for (StringRef MethodName : Record.getMethodNames()) NamesLen += MethodName.size() + 1; + // FIXME: Avoid creating a record longer than MaxRecordLength. Builder.writeUInt32(NamesLen); Builder.writeNullTerminatedString(Record.getName()); for (StringRef MethodName : Record.getMethodNames()) |

