]> granicus.if.org Git - clang/commitdiff
Use CharUnits in the EmptyClassOffsets map.
authorAnders Carlsson <andersca@mac.com>
Sun, 31 Oct 2010 21:22:43 +0000 (21:22 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 31 Oct 2010 21:22:43 +0000 (21:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117873 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/RecordLayoutBuilder.cpp

index 73d534391ce9f6f9d2eab66c1cec1e4703f16b0a..24ddea84d766e6e43a61a630690d4e56a982b7be 100644 (file)
@@ -63,7 +63,7 @@ class EmptySubobjectMap {
 
   /// EmptyClassOffsets - A map from offsets to empty record decls.
   typedef llvm::SmallVector<const CXXRecordDecl *, 1> ClassVectorTy;
-  typedef llvm::DenseMap<uint64_t, ClassVectorTy> EmptyClassOffsetsMapTy;
+  typedef llvm::DenseMap<CharUnits, ClassVectorTy> EmptyClassOffsetsMapTy;
   EmptyClassOffsetsMapTy EmptyClassOffsets;
   
   /// MaxEmptyClassOffset - The highest offset known to contain an empty
@@ -90,6 +90,14 @@ class EmptySubobjectMap {
     return Offset <= MaxEmptyClassOffset;
   }
 
+  // FIXME: Remove these.
+  CharUnits toCharUnits(uint64_t Offset) const {
+    return CharUnits::fromQuantity(Offset / Context.getCharWidth());
+  }
+  uint64_t toOffset(CharUnits Offset) const {
+    return Offset.getQuantity() * Context.getCharWidth();
+  }
+
 protected:
   bool CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD, 
                                  uint64_t Offset) const;
@@ -183,7 +191,8 @@ EmptySubobjectMap::CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
   if (!RD->isEmpty())
     return true;
 
-  EmptyClassOffsetsMapTy::const_iterator I = EmptyClassOffsets.find(Offset);
+  EmptyClassOffsetsMapTy::const_iterator I = 
+    EmptyClassOffsets.find(toCharUnits(Offset));
   if (I == EmptyClassOffsets.end())
     return true;
   
@@ -201,7 +210,7 @@ void EmptySubobjectMap::AddSubobjectAtOffset(const CXXRecordDecl *RD,
   if (!RD->isEmpty())
     return;
 
-  ClassVectorTy& Classes = EmptyClassOffsets[Offset];
+  ClassVectorTy& Classes = EmptyClassOffsets[toCharUnits(Offset)];
   assert(std::find(Classes.begin(), Classes.end(), RD) == Classes.end() &&
          "Duplicate empty class detected!");