]> granicus.if.org Git - clang/commitdiff
Convert RecordLayout::NonVirtualSize from bit units to CharUnits.
authorKen Dyck <kd@kendyck.com>
Tue, 1 Feb 2011 01:52:10 +0000 (01:52 +0000)
committerKen Dyck <kd@kendyck.com>
Tue, 1 Feb 2011 01:52:10 +0000 (01:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124646 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 4440ec8d293170bcc2c022a6c16af977d70f270d..940979fa35a66eae0a33a8980df2dc8809afc160 100644 (file)
@@ -52,7 +52,7 @@ class ASTRecordLayout {
   struct CXXRecordLayoutInfo {
     /// NonVirtualSize - The non-virtual size (in bits) of an object, which is
     /// the size of the object without virtual bases.
-    uint64_t NonVirtualSize;
+    CharUnits NonVirtualSize;
 
     /// NonVirtualAlign - The non-virtual alignment (in bits) of an object,
     /// which is the alignment of the object without virtual bases.
@@ -91,7 +91,7 @@ class ASTRecordLayout {
   ASTRecordLayout(const ASTContext &Ctx,
                   uint64_t size, unsigned alignment, uint64_t datasize,
                   const uint64_t *fieldoffsets, unsigned fieldcount,
-                  uint64_t nonvirtualsize, unsigned nonvirtualalign,
+                  CharUnits nonvirtualsize, unsigned nonvirtualalign,
                   CharUnits SizeOfLargestEmptySubobject,
                   const CXXRecordDecl *PrimaryBase,
                   bool IsPrimaryBaseVirtual,
@@ -128,9 +128,9 @@ public:
     return DataSize;
   }
 
-  /// getNonVirtualSize - Get the non-virtual size (in bits) of an object,
+  /// getNonVirtualSize - Get the non-virtual size (in chars) of an object,
   /// which is the size of the object without virtual bases.
-  uint64_t getNonVirtualSize() const {
+  CharUnits getNonVirtualSize() const {
     assert(CXXInfo && "Record layout does not have C++ specific info!");
 
     return CXXInfo->NonVirtualSize;
index ca1fffa06215c422cd67e2874f65ac711f756b6e..bed02b4c0010214a28ee9b855c167af077959eaa 100644 (file)
@@ -52,7 +52,9 @@ public:
       return false;
 
     const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
-    return Layout.getNonVirtualSize() == Context.Target.getPointerWidth(0);
+    CharUnits PointerSize = 
+      Context.toCharUnitsFromBits(Context.Target.getPointerWidth(0));
+    return Layout.getNonVirtualSize() == PointerSize;
   }
 };
 
index c4259f43a71e538dc48386258e85bc87447a47f5..4de93bb4beab03dbf1b70e5fb1b656aee361a3ae 100644 (file)
@@ -44,8 +44,10 @@ public:
     const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
     
     // In the Microsoft ABI, classes can have one or two vtable pointers.
-    return Layout.getNonVirtualSize() == Context.Target.getPointerWidth(0) ||
-      Layout.getNonVirtualSize() == Context.Target.getPointerWidth(0) * 2;
+    CharUnits PointerSize = 
+      Context.toCharUnitsFromBits(Context.Target.getPointerWidth(0));
+    return Layout.getNonVirtualSize() == PointerSize ||
+      Layout.getNonVirtualSize() == PointerSize * 2;
   }    
 };
 }
index e027c1ab8d48fc019ef6364e2db8322cb24a891c..cdecff66f8f35be365ecaeb9c5e27802e003ce39 100644 (file)
@@ -45,7 +45,7 @@ ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
                                  uint64_t datasize,
                                  const uint64_t *fieldoffsets,
                                  unsigned fieldcount,
-                                 uint64_t nonvirtualsize,
+                                 CharUnits nonvirtualsize,
                                  unsigned nonvirtualalign,
                                  CharUnits SizeOfLargestEmptySubobject,
                                  const CXXRecordDecl *PrimaryBase,
index 8c62ffdcdf04234c29baa201268b13611387714d..7e15dcce37ca9afeb98bae90cd7bb45ecdda37a6 100644 (file)
@@ -1115,7 +1115,8 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
 
   if (!Base->Class->isEmpty()) {
     // Update the data size.
-    DataSize = Offset + Layout.getNonVirtualSize();
+    DataSize = Offset + 
+      (Layout.getNonVirtualSize().getQuantity() * Context.getCharWidth());
 
     Size = std::max(Size, DataSize);
   } else
@@ -1665,7 +1666,7 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {
       new (*this) ASTRecordLayout(*this, Builder->Size, Builder->Alignment,
                                   DataSize, Builder->FieldOffsets.data(),
                                   Builder->FieldOffsets.size(),
-                                  NonVirtualSize,
+                                  toCharUnitsFromBits(NonVirtualSize),
                                   Builder->NonVirtualAlignment,
                                   EmptySubobjects.SizeOfLargestEmptySubobject,
                                   Builder->PrimaryBase,
@@ -1834,7 +1835,7 @@ static void DumpCXXRecordLayout(llvm::raw_ostream &OS,
   OS << "  sizeof=" << Layout.getSize() / 8;
   OS << ", dsize=" << Layout.getDataSize() / 8;
   OS << ", align=" << Layout.getAlignment() / 8 << '\n';
-  OS << "  nvsize=" << Layout.getNonVirtualSize() / 8;
+  OS << "  nvsize=" << Layout.getNonVirtualSize().getQuantity();
   OS << ", nvalign=" << Layout.getNonVirtualAlign() / 8 << '\n';
   OS << '\n';
 }
index 5571e43f7859fc253afcb1d40570be60ac1a3110..b9b8c9d073dcc3ae22810e1c0de761f8184a964c 100644 (file)
@@ -500,12 +500,12 @@ void CGRecordLayoutBuilder::LayoutBase(const CXXRecordDecl *BaseDecl,
   const ASTRecordLayout &Layout = 
     Types.getContext().getASTRecordLayout(BaseDecl);
   
-  uint64_t NonVirtualSize = Layout.getNonVirtualSize();
+  CharUnits NonVirtualSize = Layout.getNonVirtualSize();
   
   AppendPadding(BaseOffset / 8, 1);
   
   // FIXME: Actually use a better type than [sizeof(BaseDecl) x i8] when we can.
-  AppendBytes(NonVirtualSize / 8);
+  AppendBytes(NonVirtualSize.getQuantity());
 }
 
 void
@@ -520,12 +520,12 @@ CGRecordLayoutBuilder::LayoutVirtualBase(const CXXRecordDecl *BaseDecl,
   const ASTRecordLayout &Layout = 
     Types.getContext().getASTRecordLayout(BaseDecl);
 
-  uint64_t NonVirtualSize = Layout.getNonVirtualSize();
+  CharUnits NonVirtualSize = Layout.getNonVirtualSize();
 
   AppendPadding(BaseOffset / 8, 1);
   
   // FIXME: Actually use a better type than [sizeof(BaseDecl) x i8] when we can.
-  AppendBytes(NonVirtualSize / 8);
+  AppendBytes(NonVirtualSize.getQuantity());
 
   // FIXME: Add the vbase field info.
 }
@@ -616,8 +616,9 @@ bool
 CGRecordLayoutBuilder::ComputeNonVirtualBaseType(const CXXRecordDecl *RD) {
   const ASTRecordLayout &Layout = Types.getContext().getASTRecordLayout(RD);
 
+
   uint64_t AlignedNonVirtualTypeSize =
-    llvm::RoundUpToAlignment(Layout.getNonVirtualSize(),
+    llvm::RoundUpToAlignment(Layout.getNonVirtualSize().getQuantity() * 8,
                              Layout.getNonVirtualAlign()) / 8;
   
   
@@ -855,7 +856,7 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
 
   if (BaseTy) {
     uint64_t AlignedNonVirtualTypeSizeInBits =
-      llvm::RoundUpToAlignment(Layout.getNonVirtualSize(),
+      llvm::RoundUpToAlignment(Layout.getNonVirtualSize().getQuantity() * 8,
                                Layout.getNonVirtualAlign());
 
     assert(AlignedNonVirtualTypeSizeInBits ==