Baby steps towards using only CharUnits for base class offsets in ASTRecordLayout. Start by storing the offsets in CharUnits in the ASTRecordLayout object.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117869 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/AST/RecordLayout.h b/include/clang/AST/RecordLayout.h
index 17fe4ad..875e314 100644
--- a/include/clang/AST/RecordLayout.h
+++ b/include/clang/AST/RecordLayout.h
@@ -119,7 +119,7 @@
     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 @@
   ~ASTRecordLayout() {}
 
   void Destroy(ASTContext &Ctx);
-
+  
   ASTRecordLayout(const ASTRecordLayout&);   // DO NOT IMPLEMENT
   void operator=(const ASTRecordLayout&); // DO NOT IMPLEMENT
 public:
@@ -218,7 +218,8 @@
     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 @@
     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;
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index 35f6d99..73d5343 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -565,7 +565,7 @@
   /// 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 @@
 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 @@
       // 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 @@
   
   // 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);
 }