diff options
author | Ken Dyck <kd@kendyck.com> | 2011-02-08 02:02:47 +0000 |
---|---|---|
committer | Ken Dyck <kd@kendyck.com> | 2011-02-08 02:02:47 +0000 |
commit | 68cf1a5a01ba43ed56a8624632fd65e0804430ac (patch) | |
tree | 1d4d848c5ee1af7d63a85254aa3391bb18809af4 | |
parent | da263795abd39437d73d23fcf34dcd3afc1d7df3 (diff) |
Convert RecordLayout::NonVirtualAlign to CharUnits. No change in
functionality intended.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125069 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/RecordLayout.h | 10 | ||||
-rw-r--r-- | lib/AST/RecordLayout.cpp | 2 | ||||
-rw-r--r-- | lib/AST/RecordLayoutBuilder.cpp | 8 | ||||
-rw-r--r-- | lib/CodeGen/CGRecordLayoutBuilder.cpp | 15 |
4 files changed, 21 insertions, 14 deletions
diff --git a/include/clang/AST/RecordLayout.h b/include/clang/AST/RecordLayout.h index 108fa5147d..d442320042 100644 --- a/include/clang/AST/RecordLayout.h +++ b/include/clang/AST/RecordLayout.h @@ -54,9 +54,9 @@ class ASTRecordLayout { /// 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 @@ -91,7 +91,7 @@ class ASTRecordLayout { 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, @@ -136,9 +136,9 @@ public: 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; diff --git a/lib/AST/RecordLayout.cpp b/lib/AST/RecordLayout.cpp index cdecff66f8..32e3821ca2 100644 --- a/lib/AST/RecordLayout.cpp +++ b/lib/AST/RecordLayout.cpp @@ -46,7 +46,7 @@ ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, const uint64_t *fieldoffsets, unsigned fieldcount, CharUnits nonvirtualsize, - unsigned nonvirtualalign, + CharUnits nonvirtualalign, CharUnits SizeOfLargestEmptySubobject, const CXXRecordDecl *PrimaryBase, bool IsPrimaryBaseVirtual, diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index a871c3d176..6b98ecd87d 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -1096,7 +1096,8 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) { 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. @@ -1684,13 +1685,14 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const { 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, @@ -1859,7 +1861,7 @@ static void DumpCXXRecordLayout(llvm::raw_ostream &OS, 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'; } diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp index b9b8c9d073..e158eed987 100644 --- a/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -617,9 +617,10 @@ CGRecordLayoutBuilder::ComputeNonVirtualBaseType(const CXXRecordDecl *RD) { 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. @@ -855,9 +856,13 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) { "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) && |