summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/DebugInfo')
-rw-r--r--llvm/lib/DebugInfo/CodeView/TypeRecordBuilder.cpp12
-rw-r--r--llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp35
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())
OpenPOWER on IntegriCloud