/// the size of the object without virtual bases.
CharUnits NonVirtualSize;
- /// NonVirtualAlign - The non-virtual alignment (in bits) of an object,
+ /// NonVirtualAlign - The non-virtual alignment (in chars) of an object,
/// which is the alignment of the object without virtual bases.
- uint64_t NonVirtualAlign;
+ CharUnits NonVirtualAlign;
/// SizeOfLargestEmptySubobject - The size of the largest empty subobject
/// (either a base or a member). Will be zero if the class doesn't contain
ASTRecordLayout(const ASTContext &Ctx,
uint64_t size, unsigned alignment, uint64_t datasize,
const uint64_t *fieldoffsets, unsigned fieldcount,
- CharUnits nonvirtualsize, unsigned nonvirtualalign,
+ CharUnits nonvirtualsize, CharUnits nonvirtualalign,
CharUnits SizeOfLargestEmptySubobject,
const CXXRecordDecl *PrimaryBase,
bool IsPrimaryBaseVirtual,
return CXXInfo->NonVirtualSize;
}
- /// getNonVirtualSize - Get the non-virtual alignment (in bits) of an object,
+ /// getNonVirtualSize - Get the non-virtual alignment (in chars) of an object,
/// which is the alignment of the object without virtual bases.
- unsigned getNonVirtualAlign() const {
+ CharUnits getNonVirtualAlign() const {
assert(CXXInfo && "Record layout does not have C++ specific info!");
return CXXInfo->NonVirtualAlign;
const uint64_t *fieldoffsets,
unsigned fieldcount,
CharUnits nonvirtualsize,
- unsigned nonvirtualalign,
+ CharUnits nonvirtualalign,
CharUnits SizeOfLargestEmptySubobject,
const CXXRecordDecl *PrimaryBase,
bool IsPrimaryBaseVirtual,
return CharUnits::Zero();
}
- unsigned UnpackedBaseAlign = Layout.getNonVirtualAlign();
+ unsigned UnpackedBaseAlign =
+ Layout.getNonVirtualAlign().getQuantity() * Context.getCharWidth();
unsigned BaseAlign = (Packed) ? 8 : UnpackedBaseAlign;
// The maximum field alignment overrides base align.
IsPODForThePurposeOfLayout ? Builder->Size : Builder->DataSize;
uint64_t NonVirtualSize =
IsPODForThePurposeOfLayout ? DataSize : Builder->NonVirtualSize;
+ uint64_t NonVirtualAlign = Builder->NonVirtualAlignment;
NewEntry =
new (*this) ASTRecordLayout(*this, Builder->Size, Builder->Alignment,
DataSize, Builder->FieldOffsets.data(),
Builder->FieldOffsets.size(),
toCharUnitsFromBits(NonVirtualSize),
- Builder->NonVirtualAlignment,
+ toCharUnitsFromBits(NonVirtualAlign),
EmptySubobjects.SizeOfLargestEmptySubobject,
Builder->PrimaryBase,
Builder->PrimaryBaseIsVirtual,
OS << ", dsize=" << Layout.getDataSize() / 8;
OS << ", align=" << Layout.getAlignment() / 8 << '\n';
OS << " nvsize=" << Layout.getNonVirtualSize().getQuantity();
- OS << ", nvalign=" << Layout.getNonVirtualAlign() / 8 << '\n';
+ OS << ", nvalign=" << Layout.getNonVirtualAlign().getQuantity() << '\n';
OS << '\n';
}
const ASTRecordLayout &Layout = Types.getContext().getASTRecordLayout(RD);
+ CharUnits NonVirtualSize = Layout.getNonVirtualSize();
+ CharUnits NonVirtualAlign = Layout.getNonVirtualAlign();
uint64_t AlignedNonVirtualTypeSize =
- llvm::RoundUpToAlignment(Layout.getNonVirtualSize().getQuantity() * 8,
- Layout.getNonVirtualAlign()) / 8;
+ NonVirtualSize.RoundUpToAlignment(NonVirtualAlign).getQuantity();
// First check if we can use the same fields as for the complete class.
"Type size mismatch!");
if (BaseTy) {
- uint64_t AlignedNonVirtualTypeSizeInBits =
- llvm::RoundUpToAlignment(Layout.getNonVirtualSize().getQuantity() * 8,
- Layout.getNonVirtualAlign());
+ CharUnits NonVirtualSize = Layout.getNonVirtualSize();
+ CharUnits NonVirtualAlign = Layout.getNonVirtualAlign();
+ CharUnits AlignedNonVirtualTypeSize =
+ NonVirtualSize.RoundUpToAlignment(NonVirtualAlign);
+
+ uint64_t AlignedNonVirtualTypeSizeInBits =
+ AlignedNonVirtualTypeSize.getQuantity() * getContext().getCharWidth();
assert(AlignedNonVirtualTypeSizeInBits ==
getTargetData().getTypeAllocSizeInBits(BaseTy) &&