From 376bda924ac92462a22d6a22ea65d8c1bb8f26f3 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sun, 31 Oct 2010 21:01:46 +0000 Subject: [PATCH] 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 --- include/clang/AST/RecordLayout.h | 12 +++++++----- lib/AST/RecordLayoutBuilder.cpp | 14 ++++++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/clang/AST/RecordLayout.h b/include/clang/AST/RecordLayout.h index 17fe4adde3..875e314063 100644 --- a/include/clang/AST/RecordLayout.h +++ b/include/clang/AST/RecordLayout.h @@ -119,7 +119,7 @@ private: PrimaryBaseInfo PrimaryBase; /// FIXME: This should really use a SmallPtrMap, once we have one in LLVM :) - typedef llvm::DenseMap BaseOffsetsMapTy; + typedef llvm::DenseMap 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; diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 35f6d9957e..73d534391c 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -565,7 +565,7 @@ protected: /// out is virtual. bool PrimaryBaseIsVirtual; - typedef llvm::DenseMap BaseOffsetsMapTy; + typedef llvm::DenseMap 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); } -- 2.40.0