summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2016-10-13 17:33:22 +0000
committerReid Kleckner <rnk@google.com>2016-10-13 17:33:22 +0000
commitedfc9dcf42c5f19f72a13fa62ba5d352d6b3ce99 (patch)
tree9d359e0051e0d6418849ab09d0a18f127366b0b2 /llvm/lib/DebugInfo
parent8750e94c7a3f40757283349049560356cdef960d (diff)
downloadbcm5719-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.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