summaryrefslogtreecommitdiffstats
path: root/lib/AST/RecordLayoutBuilder.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/AST/RecordLayoutBuilder.h')
-rw-r--r--lib/AST/RecordLayoutBuilder.h58
1 files changed, 32 insertions, 26 deletions
diff --git a/lib/AST/RecordLayoutBuilder.h b/lib/AST/RecordLayoutBuilder.h
index d4171d3..a4bce75 100644
--- a/lib/AST/RecordLayoutBuilder.h
+++ b/lib/AST/RecordLayoutBuilder.h
@@ -56,21 +56,28 @@ class ASTRecordLayoutBuilder {
uint64_t NonVirtualSize;
unsigned NonVirtualAlignment;
+ /// PrimaryBase - the primary base class (if one exists) of the class
+ /// we're laying out.
ASTRecordLayout::PrimaryBaseInfo PrimaryBase;
- typedef llvm::SmallVector<std::pair<const CXXRecordDecl *,
- uint64_t>, 4> BaseOffsetsTy;
+ /// Bases - base classes and their offsets in the record.
+ ASTRecordLayout::BaseOffsetsMapTy Bases;
- /// Bases - base classes and their offsets from the record.
- BaseOffsetsTy Bases;
-
- // VBases - virtual base classes and their offsets from the record.
- BaseOffsetsTy VBases;
+ // VBases - virtual base classes and their offsets in the record.
+ ASTRecordLayout::BaseOffsetsMapTy VBases;
/// IndirectPrimaryBases - Virtual base classes, direct or indirect, that are
/// primary base classes for some other direct or indirect base class.
llvm::SmallSet<const CXXRecordDecl*, 32> IndirectPrimaryBases;
+ /// FirstNearlyEmptyVBase - The first nearly empty virtual base class in
+ /// inheritance graph order. Used for determining the primary base class.
+ const CXXRecordDecl *FirstNearlyEmptyVBase;
+
+ /// VisitedVirtualBases - A set of all the visited virtual bases, used to
+ /// avoid visiting virtual bases more than once.
+ llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBases;
+
/// EmptyClassOffsets - A map from offsets to empty record decls.
typedef std::multimap<uint64_t, const CXXRecordDecl *> EmptyClassOffsetsTy;
EmptyClassOffsetsTy EmptyClassOffsets;
@@ -86,33 +93,35 @@ class ASTRecordLayoutBuilder {
void LayoutField(const FieldDecl *D);
void LayoutBitField(const FieldDecl *D);
- void SelectPrimaryBase(const CXXRecordDecl *RD);
- void SelectPrimaryVBase(const CXXRecordDecl *RD,
- const CXXRecordDecl *&FirstPrimary);
+ /// DeterminePrimaryBase - Determine the primary base of the given class.
+ void DeterminePrimaryBase(const CXXRecordDecl *RD);
+
+ void SelectPrimaryVBase(const CXXRecordDecl *RD);
/// IdentifyPrimaryBases - Identify all virtual base classes, direct or
/// indirect, that are primary base classes for some other direct or indirect
/// base class.
void IdentifyPrimaryBases(const CXXRecordDecl *RD);
- void setPrimaryBase(const CXXRecordDecl *Base, bool IsVirtual) {
- PrimaryBase = ASTRecordLayout::PrimaryBaseInfo(Base, IsVirtual);
- }
-
bool IsNearlyEmpty(const CXXRecordDecl *RD) const;
+ /// LayoutNonVirtualBases - Determines the primary base class (if any) and
+ /// lays it out. Will then proceed to lay out all non-virtual base clasess.
+ void LayoutNonVirtualBases(const CXXRecordDecl *RD);
+
+ /// LayoutNonVirtualBase - Lays out a single non-virtual base.
+ void LayoutNonVirtualBase(const CXXRecordDecl *RD);
+
+ /// LayoutVirtualBases - Lays out all the virtual bases.
+ void LayoutVirtualBases(const CXXRecordDecl *RD, uint64_t Offset,
+ const CXXRecordDecl *MostDerivedClass);
+
+ /// LayoutVirtualBase - Lays out a single virtual base.
+ void LayoutVirtualBase(const CXXRecordDecl *RD);
+
/// LayoutBase - Will lay out a base and return the offset where it was
/// placed, in bits.
uint64_t LayoutBase(const CXXRecordDecl *RD);
-
- void LayoutVtable(const CXXRecordDecl *RD);
- void LayoutNonVirtualBases(const CXXRecordDecl *RD);
- void LayoutBaseNonVirtually(const CXXRecordDecl *RD, bool IsVBase);
- void LayoutVirtualBase(const CXXRecordDecl *RD);
- void LayoutVirtualBases(const CXXRecordDecl *Class, const CXXRecordDecl *RD,
- const CXXRecordDecl *PB, uint64_t Offset,
- llvm::SmallSet<const CXXRecordDecl*, 32> &mark,
- llvm::SmallSet<const CXXRecordDecl*, 32> &IndirectPrimary);
/// canPlaceRecordAtOffset - Return whether a record (either a base class
/// or a field) can be placed at the given offset.
@@ -134,9 +143,6 @@ class ASTRecordLayoutBuilder {
/// given offset.
void UpdateEmptyClassOffsets(const FieldDecl *FD, uint64_t Offset);
- /// getBaseOffset - Get the offset of a direct base class.
- uint64_t getBaseOffset(const CXXRecordDecl *Base);
-
/// FinishLayout - Finalize record layout. Adjust record size based on the
/// alignment.
void FinishLayout();
OpenPOWER on IntegriCloud