]> granicus.if.org Git - clang/commitdiff
Baby steps towards using only CharUnits for base class offsets in ASTRecordLayout...
authorAnders Carlsson <andersca@mac.com>
Sun, 31 Oct 2010 21:01:46 +0000 (21:01 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 31 Oct 2010 21:01:46 +0000 (21:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117869 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 17fe4adde311c3ee0efdbb79c056a9b0c2bdc85a..875e314063f13f04dcda4c12dba2eb79bf6726c9 100644 (file)
@@ -119,7 +119,7 @@ private:
     PrimaryBaseInfo PrimaryBase;
     
     /// FIXME: This should really use a SmallPtrMap, once we have one in LLVM :)
-    typedef llvm::DenseMap<const CXXRecordDecl *, uint64_t> BaseOffsetsMapTy;
+    typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;
     
     /// BaseOffsets - Contains a map from base classes to their offset.
     BaseOffsetsMapTy BaseOffsets;
@@ -153,7 +153,7 @@ private:
   ~ASTRecordLayout() {}
 
   void Destroy(ASTContext &Ctx);
-
+  
   ASTRecordLayout(const ASTRecordLayout&);   // DO NOT IMPLEMENT
   void operator=(const ASTRecordLayout&); // DO NOT IMPLEMENT
 public:
@@ -218,7 +218,8 @@ public:
     assert(CXXInfo && "Record layout does not have C++ specific info!");
     assert(CXXInfo->BaseOffsets.count(Base) && "Did not find base!");
 
-    return CXXInfo->BaseOffsets[Base];
+    return CXXInfo->BaseOffsets[Base].getQuantity() * 
+      Base->getASTContext().getCharWidth();
   }
 
   /// getVBaseClassOffset - Get the offset, in bits, for the given base class.
@@ -226,9 +227,10 @@ public:
     assert(CXXInfo && "Record layout does not have C++ specific info!");
     assert(CXXInfo->VBaseOffsets.count(VBase) && "Did not find base!");
 
-    return CXXInfo->VBaseOffsets[VBase];
+    return CXXInfo->VBaseOffsets[VBase].getQuantity() *
+      VBase->getASTContext().getCharWidth();
   }
-  
+
   uint64_t getSizeOfLargestEmptySubobject() const {
     assert(CXXInfo && "Record layout does not have C++ specific info!");
     return CXXInfo->SizeOfLargestEmptySubobject;
index 35f6d9957e9c989d70aebfa346dfbb82059eb7cf..73d534391ce9f6f9d2eab66c1cec1e4703f16b0a 100644 (file)
@@ -565,7 +565,7 @@ protected:
   /// out is virtual.
   bool PrimaryBaseIsVirtual;
 
-  typedef llvm::DenseMap<const CXXRecordDecl *, uint64_t> BaseOffsetsMapTy;
+  typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;
 
   /// Bases - base classes and their offsets in the record.
   BaseOffsetsMapTy Bases;
@@ -992,10 +992,12 @@ RecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) {
 void RecordLayoutBuilder::LayoutNonVirtualBase(const BaseSubobjectInfo *Base) {
   // Layout the base.
   uint64_t Offset = LayoutBase(Base);
+  CharUnits OffsetInChars = 
+    CharUnits::fromQuantity(Offset / Context.getCharWidth());
 
   // Add its base class offset.
   assert(!Bases.count(Base->Class) && "base offset already exists!");
-  Bases.insert(std::make_pair(Base->Class, Offset));
+  Bases.insert(std::make_pair(Base->Class, OffsetInChars));
 
   AddPrimaryVirtualBaseOffsets(Base, Offset);
 }
@@ -1015,8 +1017,10 @@ RecordLayoutBuilder::AddPrimaryVirtualBaseOffsets(const BaseSubobjectInfo *Info,
       // Add the offset.
       assert(!VBases.count(Info->PrimaryVirtualBaseInfo->Class) && 
              "primary vbase offset already exists!");
+      CharUnits OffsetInChars = 
+        CharUnits::fromQuantity(Offset / Context.getCharWidth());
       VBases.insert(std::make_pair(Info->PrimaryVirtualBaseInfo->Class,
-                                   Offset));
+                                   OffsetInChars));
 
       // Traverse the primary virtual base.
       AddPrimaryVirtualBaseOffsets(Info->PrimaryVirtualBaseInfo, Offset);
@@ -1089,10 +1093,12 @@ void RecordLayoutBuilder::LayoutVirtualBase(const BaseSubobjectInfo *Base) {
   
   // Layout the base.
   uint64_t Offset = LayoutBase(Base);
+  CharUnits OffsetInChars = 
+    CharUnits::fromQuantity(Offset / Context.getCharWidth());
 
   // Add its base class offset.
   assert(!VBases.count(Base->Class) && "vbase offset already exists!");
-  VBases.insert(std::make_pair(Base->Class, Offset));
+  VBases.insert(std::make_pair(Base->Class, OffsetInChars));
   
   AddPrimaryVirtualBaseOffsets(Base, Offset);
 }