From: Ken Dyck Date: Thu, 17 Feb 2011 01:49:42 +0000 (+0000) Subject: Convert MaxFieldAlignment to CharUnits from bits. No change in functionality X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=834945c19cfb87fc21dfb6980a0980618655d79d;p=clang Convert MaxFieldAlignment to CharUnits from bits. No change in functionality intended. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125704 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index dea1dd0ffb..fd6efbe06c 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -572,7 +572,7 @@ protected: /// MaxFieldAlignment - The maximum allowed field alignment. This is set by /// #pragma pack. - unsigned MaxFieldAlignment; + CharUnits MaxFieldAlignment; /// DataSize - The data size of the record being laid out. uint64_t DataSize; @@ -613,9 +613,10 @@ protected: : Context(Context), EmptySubobjects(EmptySubobjects), Size(0), Alignment(CharUnits::One()), UnpackedAlignment(Alignment), Packed(false), IsUnion(false), IsMac68kAlign(false), - UnfilledBitsInLastByte(0), MaxFieldAlignment(0), DataSize(0), - NonVirtualSize(CharUnits::Zero()), NonVirtualAlignment(CharUnits::One()), - PrimaryBase(0), PrimaryBaseIsVirtual(false), FirstNearlyEmptyVBase(0) { } + UnfilledBitsInLastByte(0), MaxFieldAlignment(CharUnits::Zero()), + DataSize(0), NonVirtualSize(CharUnits::Zero()), + NonVirtualAlignment(CharUnits::One()), PrimaryBase(0), + PrimaryBaseIsVirtual(false), FirstNearlyEmptyVBase(0) { } void Layout(const RecordDecl *D); void Layout(const CXXRecordDecl *D); @@ -802,9 +803,10 @@ void RecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) { unsigned BaseAlign = (Packed) ? 8 : UnpackedBaseAlign; // The maximum field alignment overrides base align. - if (MaxFieldAlignment) { - BaseAlign = std::min(BaseAlign, MaxFieldAlignment); - UnpackedBaseAlign = std::min(UnpackedBaseAlign, MaxFieldAlignment); + if (!MaxFieldAlignment.isZero()) { + unsigned MaxFieldAlignmentInBits = Context.toBits(MaxFieldAlignment); + BaseAlign = std::min(BaseAlign, MaxFieldAlignmentInBits); + UnpackedBaseAlign = std::min(UnpackedBaseAlign, MaxFieldAlignmentInBits); } // Update the alignment. @@ -1097,9 +1099,10 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) { unsigned BaseAlign = (Packed) ? 8 : UnpackedBaseAlign; // The maximum field alignment overrides base align. - if (MaxFieldAlignment) { - BaseAlign = std::min(BaseAlign, MaxFieldAlignment); - UnpackedBaseAlign = std::min(UnpackedBaseAlign, MaxFieldAlignment); + if (!MaxFieldAlignment.isZero()) { + unsigned MaxFieldAlignmentInBits = Context.toBits(MaxFieldAlignment); + BaseAlign = std::min(BaseAlign, MaxFieldAlignmentInBits); + UnpackedBaseAlign = std::min(UnpackedBaseAlign, MaxFieldAlignmentInBits); } // Round up the current record size to the base's alignment boundary. @@ -1136,11 +1139,11 @@ void RecordLayoutBuilder::InitializeLayout(const Decl *D) { // to bit-fields, but gcc appears not to follow that. if (D->hasAttr()) { IsMac68kAlign = true; - MaxFieldAlignment = 2 * 8; + MaxFieldAlignment = CharUnits::fromQuantity(2); Alignment = CharUnits::fromQuantity(2); } else { if (const MaxFieldAlignmentAttr *MFAA = D->getAttr()) - MaxFieldAlignment = MFAA->getAlignment(); + MaxFieldAlignment = Context.toCharUnitsFromBits(MFAA->getAlignment()); if (unsigned MaxAlign = D->getMaxAlignment()) UpdateAlignment(MaxAlign); @@ -1324,9 +1327,10 @@ void RecordLayoutBuilder::LayoutBitField(const FieldDecl *D) { UnpackedFieldAlign = std::max(UnpackedFieldAlign, D->getMaxAlignment()); // The maximum field alignment overrides the aligned attribute. - if (MaxFieldAlignment) { - FieldAlign = std::min(FieldAlign, MaxFieldAlignment); - UnpackedFieldAlign = std::min(UnpackedFieldAlign, MaxFieldAlignment); + if (!MaxFieldAlignment.isZero()) { + unsigned MaxFieldAlignmentInBits = Context.toBits(MaxFieldAlignment); + FieldAlign = std::min(FieldAlign, MaxFieldAlignmentInBits); + UnpackedFieldAlign = std::min(UnpackedFieldAlign, MaxFieldAlignmentInBits); } // Check if we need to add padding to give the field the correct alignment. @@ -1425,9 +1429,10 @@ void RecordLayoutBuilder::LayoutField(const FieldDecl *D) { UnpackedFieldAlign = std::max(UnpackedFieldAlign, D->getMaxAlignment()); // The maximum field alignment overrides the aligned attribute. - if (MaxFieldAlignment) { - FieldAlign = std::min(FieldAlign, MaxFieldAlignment); - UnpackedFieldAlign = std::min(UnpackedFieldAlign, MaxFieldAlignment); + if (!MaxFieldAlignment.isZero()) { + unsigned MaxFieldAlignmentInBits = Context.toBits(MaxFieldAlignment); + FieldAlign = std::min(FieldAlign, MaxFieldAlignmentInBits); + UnpackedFieldAlign = std::min(UnpackedFieldAlign, MaxFieldAlignmentInBits); } // Round up the current record size to the field's alignment boundary.