]> granicus.if.org Git - clang/commitdiff
Add a helper function, ASTContext::toBits(), that converts sizes in
authorKen Dyck <kd@kendyck.com>
Fri, 11 Feb 2011 01:54:29 +0000 (01:54 +0000)
committerKen Dyck <kd@kendyck.com>
Fri, 11 Feb 2011 01:54:29 +0000 (01:54 +0000)
CharUnits to sizes in bits, and use it to tidy up the places where the
conversion was done explicitly.

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

include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp
lib/AST/RecordLayoutBuilder.cpp
lib/CodeGen/CGExprConstant.cpp
lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CGRecordLayoutBuilder.cpp

index 911a50cf6757f2f0ce9f967045e3c1b6d1d51d8b..244cf26b89b32beddca8435ab07e180d04b62807 100644 (file)
@@ -1015,6 +1015,9 @@ public:
   /// toCharUnitsFromBits - Convert a size in bits to a size in characters.
   CharUnits toCharUnitsFromBits(int64_t BitSize) const;
 
+  /// toBits - Convert a size in characters to a size in bits.
+  int64_t toBits(CharUnits CharSize) const;
+
   /// getTypeSizeInChars - Return the size of the specified type, in characters.
   /// This method does not work on incomplete types.
   CharUnits getTypeSizeInChars(QualType T) const;
index 6b2674325866e70a0df6afa43d7fff2c552c491d..03c0abd3c624ea320a78f5c90b9f94e6faed2555 100644 (file)
@@ -847,7 +847,7 @@ ASTContext::getTypeInfo(const Type *T) const {
   case Type::ObjCInterface: {
     const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
     const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
-    Width = Layout.getSize().getQuantity() * getCharWidth();
+    Width = toBits(Layout.getSize());
     Align = Layout.getAlignment();
     break;
   }
@@ -866,7 +866,7 @@ ASTContext::getTypeInfo(const Type *T) const {
 
     const RecordType *RT = cast<RecordType>(TT);
     const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
-    Width = Layout.getSize().getQuantity() * getCharWidth();
+    Width = toBits(Layout.getSize());
     Align = Layout.getAlignment();
     break;
   }
@@ -923,6 +923,11 @@ CharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const {
   return CharUnits::fromQuantity(BitSize / getCharWidth());
 }
 
+/// toBits - Convert a size in characters to a size in characters.
+int64_t ASTContext::toBits(CharUnits CharSize) const {
+  return CharSize.getQuantity() * getCharWidth();
+}
+
 /// getTypeSizeInChars - Return the size of the specified type, in characters.
 /// This method does not work on incomplete types.
 CharUnits ASTContext::getTypeSizeInChars(QualType T) const {
index 62306894ab640ded23b419cb3aa0dcc1b87831c8..9e7c9e5feb870b54f0b8536e5df9ff1779bb8dfb 100644 (file)
@@ -616,11 +616,6 @@ protected:
       DataSize(0), NonVirtualSize(0), NonVirtualAlignment(8), PrimaryBase(0),
       PrimaryBaseIsVirtual(false), FirstNearlyEmptyVBase(0) { }
 
-  // FIXME: Remove this.
-  uint64_t toOffset(CharUnits Offset) const {
-    return Offset.getQuantity() * Context.getCharWidth();
-  }
-  
   void Layout(const RecordDecl *D);
   void Layout(const CXXRecordDecl *D);
   void Layout(const ObjCInterfaceDecl *D);
@@ -1091,14 +1086,13 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
   // If we have an empty base class, try to place it at offset 0.
   if (Base->Class->isEmpty() &&
       EmptySubobjects->CanPlaceBaseAtOffset(Base, CharUnits::Zero())) {
-    Size = std::max(Size, 
-                    Layout.getSize().getQuantity() * Context.getCharWidth());
+    uint64_t RecordSizeInBits = Context.toBits(Layout.getSize());
+    Size = std::max(Size, RecordSizeInBits);
 
     return CharUnits::Zero();
   }
 
-  unsigned UnpackedBaseAlign = 
-    Layout.getNonVirtualAlign().getQuantity() * Context.getCharWidth();
+  unsigned UnpackedBaseAlign = Context.toBits(Layout.getNonVirtualAlign());
   unsigned BaseAlign = (Packed) ? 8 : UnpackedBaseAlign;
 
   // The maximum field alignment overrides base align.
@@ -1117,13 +1111,11 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
 
   if (!Base->Class->isEmpty()) {
     // Update the data size.
-    DataSize = Offset + 
-      (Layout.getNonVirtualSize().getQuantity() * Context.getCharWidth());
+    DataSize = Offset + Context.toBits(Layout.getNonVirtualSize());
 
     Size = std::max(Size, DataSize);
   } else
-    Size = std::max(Size, 
-            Offset + (Layout.getSize().getQuantity() * Context.getCharWidth()));
+    Size = std::max(Size, Offset + Context.toBits(Layout.getSize()));
 
   // Remember max struct/class alignment.
   UpdateAlignment(BaseAlign, UnpackedBaseAlign);
@@ -1885,7 +1877,7 @@ void ASTContext::DumpRecordLayout(const RecordDecl *RD,
   RD->dump();
   OS << "\nLayout: ";
   OS << "<ASTRecordLayout\n";
-  OS << "  Size:" << Info.getSize().getQuantity() * getCharWidth() << "\n";
+  OS << "  Size:" << toBits(Info.getSize()) << "\n";
   OS << "  DataSize:" << Info.getDataSize() << "\n";
   OS << "  Alignment:" << Info.getAlignment() << "\n";
   OS << "  FieldOffsets: [";
index dc84b367cf0f8ca0bfb35d0d591b2cefe9f5c67f..c569b37b9469cb1995c3e693a3e2c2b845de5ee5 100644 (file)
@@ -394,8 +394,7 @@ bool ConstStructBuilder::Build(InitListExpr *ILE) {
   }
 
   // Append tail padding if necessary.
-  AppendTailPadding(
-    Layout.getSize().getQuantity() * CGM.getContext().getCharWidth());
+  AppendTailPadding(CGM.getContext().toBits(Layout.getSize()));
 
   assert(Layout.getSize().getQuantity() == NextFieldOffsetInBytes &&
          "Tail padding mismatch!");
index 3cbb296b0b20c7bca06fb73fb72fcbb0241feff8..83672f8b10fac77e204f78c1148560a68f86f961 100644 (file)
@@ -131,8 +131,7 @@ LValue CGObjCRuntime::EmitValueForIvarAtOffset(CodeGen::CodeGenFunction &CGF,
   // a synthesized ivar can never be a bit-field, so this is safe.
   const ASTRecordLayout &RL =
     CGF.CGM.getContext().getASTObjCInterfaceLayout(OID);
-  uint64_t TypeSizeInBits = 
-    RL.getSize().getQuantity() * CGF.CGM.getContext().getCharWidth();
+  uint64_t TypeSizeInBits = CGF.CGM.getContext().toBits(RL.getSize());
   uint64_t FieldBitOffset = LookupFieldBitOffset(CGF.CGM, OID, 0, Ivar);
   uint64_t BitOffset = FieldBitOffset % 8;
   uint64_t ContainingTypeAlign = 8;
index af0c9ed499a5c0ef4ca639834ad112026bda2bae..4d928409a25837319a96612567f9f68d140ed52d 100644 (file)
@@ -300,8 +300,7 @@ CGBitFieldInfo CGBitFieldInfo::MakeInfo(CodeGenTypes &Types,
                                         uint64_t FieldSize) {
   const RecordDecl *RD = FD->getParent();
   const ASTRecordLayout &RL = Types.getContext().getASTRecordLayout(RD);
-  uint64_t ContainingTypeSizeInBits = 
-    RL.getSize().getQuantity() * Types.getContext().getCharWidth();
+  uint64_t ContainingTypeSizeInBits = Types.getContext().toBits(RL.getSize());
   unsigned ContainingTypeAlign = RL.getAlignment();
 
   return MakeInfo(Types, FD, FieldOffset, FieldSize, ContainingTypeSizeInBits,
@@ -689,8 +688,7 @@ bool CGRecordLayoutBuilder::LayoutFields(const RecordDecl *D) {
   }
   
   // Append tail padding if necessary.
-  AppendTailPadding(
-    Layout.getSize().getQuantity() * Types.getContext().getCharWidth());
+  AppendTailPadding(Types.getContext().toBits(Layout.getSize()));
 
   return true;
 }
@@ -855,8 +853,7 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
   // Verify that the computed LLVM struct size matches the AST layout size.
   const ASTRecordLayout &Layout = getContext().getASTRecordLayout(D);
 
-  uint64_t TypeSizeInBits = 
-    Layout.getSize().getQuantity() * getContext().getCharWidth();
+  uint64_t TypeSizeInBits = getContext().toBits(Layout.getSize());
   assert(TypeSizeInBits == getTargetData().getTypeAllocSizeInBits(Ty) &&
          "Type size mismatch!");
 
@@ -867,7 +864,7 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
       NonVirtualSize.RoundUpToAlignment(NonVirtualAlign);
 
     uint64_t AlignedNonVirtualTypeSizeInBits = 
-      AlignedNonVirtualTypeSize.getQuantity() * getContext().getCharWidth();
+      getContext().toBits(AlignedNonVirtualTypeSize);
 
     assert(AlignedNonVirtualTypeSizeInBits == 
            getTargetData().getTypeAllocSizeInBits(BaseTy) &&