diff options
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()) |

