using llvm::support::ulittle16_t;
using llvm::support::ulittle32_t;
+/// Limit on the size of all codeview symbol and type records, including the
+/// RecordPrefix. MSVC does not emit any records larger than this.
+enum : unsigned { MaxRecordLength = 0xFF00 };
+
struct RecordPrefix {
ulittle16_t RecordLen; // Record length, starting from &Leaf.
ulittle16_t RecordKind; // Record kind enum (SymRecordKind or TypeRecordKind)
void ListRecordBuilder::writeMemberType(const ListContinuationRecord &R) {
TypeRecordBuilder &Builder = getBuilder();
- assert(getLastContinuationSize() < 65535 - 8 && "continuation won't fit");
+ assert(getLastContinuationSize() < MaxRecordLength - 8 && "continuation won't fit");
Builder.writeTypeRecordKind(TypeRecordKind::ListContinuation);
Builder.writeUInt16(0);
// space for a continuation record (8 bytes). If the segment does not fit,
// back up and insert a continuation record, sliding the current subrecord
// down.
- if (getLastContinuationSize() > 65535 - 8) {
+ if (getLastContinuationSize() > MaxRecordLength - 8) {
assert(SubrecordStart != 0 && "can't slide from the start!");
SmallString<128> SubrecordCopy(
Builder.str().slice(SubrecordStart, Builder.size()));
- assert(SubrecordCopy.size() < 65530 && "subrecord is too large to slide!");
+ assert(SubrecordCopy.size() < MaxRecordLength - 8 &&
+ "subrecord is too large to slide!");
Builder.truncate(SubrecordStart);
// Write a placeholder continuation record.
Builder.writeUInt32(0);
ContinuationOffsets.push_back(Builder.size());
assert(Builder.size() == SubrecordStart + 8 && "wrong continuation size");
- assert(getLastContinuationSize() < 65535 && "segment too big");
+ assert(getLastContinuationSize() < MaxRecordLength && "segment too big");
// Start a new list record of the appropriate kind, and copy the previous
// subrecord into place.
; CHECK-NEXT: Enumerator {
; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
; CHECK-NEXT: AccessSpecifier: Public (0x3)
-; CHECK-NEXT: EnumValue: 5460
-; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE5461
+; CHECK-NEXT: EnumValue: 5436
+; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE5437
; CHECK-NEXT: }
; CHECK-NOT: ContinuationIndex
; CHECK-NEXT: Enumerator {
; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
; CHECK-NEXT: AccessSpecifier: Public (0x3)
-; CHECK-NEXT: EnumValue: 4095
-; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE4096
+; CHECK-NEXT: EnumValue: 4077
+; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE4078
; CHECK-NEXT: }
; CHECK: ContinuationIndex: <field list> (0x1000)
; CHECK-NEXT: Enumerator {
; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
; CHECK-NEXT: AccessSpecifier: Public (0x3)
-; CHECK-NEXT: EnumValue: 2730
-; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE2731
+; CHECK-NEXT: EnumValue: 2718
+; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE2719
; CHECK-NEXT: }
; CHECK: ContinuationIndex: <field list> (0x1001)
; CHECK-NEXT: Enumerator {
; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
; CHECK-NEXT: AccessSpecifier: Public (0x3)
-; CHECK-NEXT: EnumValue: 1365
-; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE1366
+; CHECK-NEXT: EnumValue: 1359
+; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE1360
; CHECK-NEXT: }
; CHECK: ContinuationIndex: <field list> (0x1002)