From: Anders Carlsson Date: Wed, 24 Nov 2010 23:20:19 +0000 (+0000) Subject: Remove the PrimaryBaseInfo class. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0b9fb2f6b4845bfe5e25b576ae8f2ffa284f9cb1;p=clang Remove the PrimaryBaseInfo class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120134 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/RecordLayout.h b/include/clang/AST/RecordLayout.h index 25617d86da..ca29c9c404 100644 --- a/include/clang/AST/RecordLayout.h +++ b/include/clang/AST/RecordLayout.h @@ -48,58 +48,6 @@ class ASTRecordLayout { // FieldCount - Number of fields. unsigned FieldCount; -public: - /// PrimaryBaseInfo - Contains info about a primary base. - struct PrimaryBaseInfo { - PrimaryBaseInfo() {} - - PrimaryBaseInfo(const CXXRecordDecl *Base, bool IsVirtual) - : Value(Base, Base && IsVirtual) {} - - /// Value - Points to the primary base. The single-bit value - /// will be non-zero when the primary base is virtual. - llvm::PointerIntPair Value; - - /// getBase - Returns the primary base. - const CXXRecordDecl *getBase() const { return Value.getPointer(); } - - /// isVirtual - Returns whether the primary base is virtual or not. - bool isVirtual() const { return Value.getInt(); } - - friend bool operator==(const PrimaryBaseInfo &X, const PrimaryBaseInfo &Y) { - return X.Value == Y.Value; - } - }; - - /// primary_base_info_iterator - An iterator for iterating the primary base - /// class chain. - class primary_base_info_iterator { - /// Current - The current base class info. - PrimaryBaseInfo Current; - - public: - primary_base_info_iterator() {} - primary_base_info_iterator(PrimaryBaseInfo Info) : Current(Info) {} - - const PrimaryBaseInfo &operator*() const { return Current; } - - primary_base_info_iterator& operator++() { - const CXXRecordDecl *RD = Current.getBase(); - Current = RD->getASTContext().getASTRecordLayout(RD).getPrimaryBaseInfo(); - return *this; - } - - friend bool operator==(const primary_base_info_iterator &X, - const primary_base_info_iterator &Y) { - return X.Current == Y.Current; - } - friend bool operator!=(const primary_base_info_iterator &X, - const primary_base_info_iterator &Y) { - return !(X == Y); - } - }; - -private: /// CXXRecordLayoutInfo - Contains C++ specific layout information. struct CXXRecordLayoutInfo { /// NonVirtualSize - The non-virtual size (in bits) of an object, which is @@ -116,7 +64,7 @@ private: CharUnits SizeOfLargestEmptySubobject; /// PrimaryBase - The primary base info for this record. - PrimaryBaseInfo PrimaryBase; + llvm::PointerIntPair PrimaryBase; /// FIXME: This should really use a SmallPtrMap, once we have one in LLVM :) typedef llvm::DenseMap BaseOffsetsMapTy; @@ -146,7 +94,7 @@ private: uint64_t nonvirtualsize, unsigned nonvirtualalign, CharUnits SizeOfLargestEmptySubobject, const CXXRecordDecl *PrimaryBase, - bool PrimaryBaseIsVirtual, + bool IsPrimaryBaseVirtual, const BaseOffsetsMapTy& BaseOffsets, const BaseOffsetsMapTy& VBaseOffsets); @@ -196,21 +144,19 @@ public: return CXXInfo->NonVirtualAlign; } - /// getPrimaryBaseInfo - Get the primary base info. - const PrimaryBaseInfo &getPrimaryBaseInfo() const { + /// getPrimaryBase - Get the primary base for this record. + const CXXRecordDecl *getPrimaryBase() const { assert(CXXInfo && "Record layout does not have C++ specific info!"); - return CXXInfo->PrimaryBase; - } - - // FIXME: Migrate off of this function and use getPrimaryBaseInfo directly. - const CXXRecordDecl *getPrimaryBase() const { - return getPrimaryBaseInfo().getBase(); + return CXXInfo->PrimaryBase.getPointer(); } - // FIXME: Migrate off of this function and use getPrimaryBaseInfo directly. + /// isPrimaryBaseVirtual - Get whether the primary base for this record + /// is virtual or not. bool isPrimaryBaseVirtual() const { - return getPrimaryBaseInfo().isVirtual(); + assert(CXXInfo && "Record layout does not have C++ specific info!"); + + return CXXInfo->PrimaryBase.getInt(); } /// getBaseClassOffset - Get the offset, in chars, for the given base class. @@ -253,18 +199,6 @@ public: assert(CXXInfo && "Record layout does not have C++ specific info!"); return CXXInfo->SizeOfLargestEmptySubobject; } - - primary_base_info_iterator primary_base_begin() const { - assert(CXXInfo && "Record layout does not have C++ specific info!"); - - return primary_base_info_iterator(getPrimaryBaseInfo()); - } - - primary_base_info_iterator primary_base_end() const { - assert(CXXInfo && "Record layout does not have C++ specific info!"); - - return primary_base_info_iterator(); - } }; } // end namespace clang diff --git a/lib/AST/RecordLayout.cpp b/lib/AST/RecordLayout.cpp index a296a2409a..2dbe737d04 100644 --- a/lib/AST/RecordLayout.cpp +++ b/lib/AST/RecordLayout.cpp @@ -48,7 +48,7 @@ ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx, unsigned nonvirtualalign, CharUnits SizeOfLargestEmptySubobject, const CXXRecordDecl *PrimaryBase, - bool PrimaryBaseIsVirtual, + bool IsPrimaryBaseVirtual, const BaseOffsetsMapTy& BaseOffsets, const BaseOffsetsMapTy& VBaseOffsets) : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment), @@ -59,7 +59,8 @@ ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx, memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets)); } - CXXInfo->PrimaryBase = PrimaryBaseInfo(PrimaryBase, PrimaryBaseIsVirtual); + CXXInfo->PrimaryBase.setPointer(PrimaryBase); + CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual); CXXInfo->NonVirtualSize = nonvirtualsize; CXXInfo->NonVirtualAlign = nonvirtualalign; CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;