Serialization: Fix serialization of layout constraints

This commit is contained in:
Slava Pestov
2017-04-19 00:47:25 -07:00
parent a8360095c1
commit 57b2c059db
3 changed files with 42 additions and 13 deletions

View File

@@ -261,6 +261,8 @@ enum LayoutRequirementKind : uint8_t {
Trivial = 3,
RefCountedObject = 4,
NativeRefCountedObject = 5,
Class = 6,
NativeClass = 7
};
using LayoutRequirementKindField = BCFixed<3>;

View File

@@ -1030,31 +1030,31 @@ void ModuleFile::readGenericRequirements(
error();
break;
}
case LayoutRequirementKind::NativeRefCountedObject: {
case LayoutRequirementKind::NativeRefCountedObject:
kind = LayoutConstraintKind::NativeRefCountedObject;
break;
}
case LayoutRequirementKind::RefCountedObject: {
case LayoutRequirementKind::RefCountedObject:
kind = LayoutConstraintKind::RefCountedObject;
break;
}
case LayoutRequirementKind::Trivial: {
case LayoutRequirementKind::Trivial:
kind = LayoutConstraintKind::Trivial;
break;
}
case LayoutRequirementKind::TrivialOfExactSize: {
case LayoutRequirementKind::TrivialOfExactSize:
kind = LayoutConstraintKind::TrivialOfExactSize;
break;
}
case LayoutRequirementKind::TrivialOfAtMostSize: {
case LayoutRequirementKind::TrivialOfAtMostSize:
kind = LayoutConstraintKind::TrivialOfAtMostSize;
break;
}
case LayoutRequirementKind::UnknownLayout: {
case LayoutRequirementKind::Class:
kind = LayoutConstraintKind::Class;
break;
case LayoutRequirementKind::NativeClass:
kind = LayoutConstraintKind::NativeClass;
break;
case LayoutRequirementKind::UnknownLayout:
kind = LayoutConstraintKind::UnknownLayout;
break;
}
}
ASTContext &ctx = getContext();
if (kind != LayoutConstraintKind::TrivialOfAtMostSize &&

View File

@@ -1122,8 +1122,35 @@ void Serializer::writeGenericRequirements(ArrayRef<Requirement> requirements,
size = layout->getTrivialSizeInBits();
alignment = layout->getAlignment();
}
LayoutRequirementKind rawKind = LayoutRequirementKind::UnknownLayout;
switch (layout->getKind()) {
case LayoutConstraintKind::NativeRefCountedObject:
rawKind = LayoutRequirementKind::NativeRefCountedObject;
break;
case LayoutConstraintKind::RefCountedObject:
rawKind = LayoutRequirementKind::RefCountedObject;
break;
case LayoutConstraintKind::Trivial:
rawKind = LayoutRequirementKind::Trivial;
break;
case LayoutConstraintKind::TrivialOfExactSize:
rawKind = LayoutRequirementKind::TrivialOfExactSize;
break;
case LayoutConstraintKind::TrivialOfAtMostSize:
rawKind = LayoutRequirementKind::TrivialOfAtMostSize;
break;
case LayoutConstraintKind::Class:
rawKind = LayoutRequirementKind::Class;
break;
case LayoutConstraintKind::NativeClass:
rawKind = LayoutRequirementKind::NativeClass;
break;
case LayoutConstraintKind::UnknownLayout:
rawKind = LayoutRequirementKind::UnknownLayout;
break;
}
LayoutRequirementLayout::emitRecord(
Out, ScratchRecord, layoutReqAbbrCode, (unsigned)layout->getKind(),
Out, ScratchRecord, layoutReqAbbrCode, rawKind,
addTypeRef(req.getFirstType()), size, alignment);
}
}