]> granicus.if.org Git - clang/commitdiff
Convert RecordLayout::NonVirtualAlign to CharUnits. No change in
authorKen Dyck <kd@kendyck.com>
Tue, 8 Feb 2011 02:02:47 +0000 (02:02 +0000)
committerKen Dyck <kd@kendyck.com>
Tue, 8 Feb 2011 02:02:47 +0000 (02:02 +0000)
functionality intended.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125069 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/RecordLayout.h
lib/AST/RecordLayout.cpp
lib/AST/RecordLayoutBuilder.cpp
lib/CodeGen/CGRecordLayoutBuilder.cpp

index 108fa5147d66434f3da551fab117404962d3006c..d442320042454dd0e1f0cfccea443de9702963e7 100644 (file)
@@ -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;
index cdecff66f8f35be365ecaeb9c5e27802e003ce39..32e3821ca24f8f78d4b70ba9808de06799582aab 100644 (file)
@@ -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,
index a871c3d1766a938ed3a1ec3cac2c603e0c2cf71d..6b98ecd87da9e98e683391974ae45bb4d440564c 100644 (file)
@@ -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';
 }
 
index b9b8c9d073dcc3ae22810e1c0de761f8184a964c..e158eed9878e3084e23d9423ce28bf21afe69224 100644 (file)
@@ -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) &&