1270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbar//===--- CGRecordLayoutBuilder.cpp - CGRecordLayout builder  ----*- C++ -*-===//
245372a6fdcd2b0840704569478db456822e02baeAnders Carlsson//
345372a6fdcd2b0840704569478db456822e02baeAnders Carlsson//                     The LLVM Compiler Infrastructure
445372a6fdcd2b0840704569478db456822e02baeAnders Carlsson//
545372a6fdcd2b0840704569478db456822e02baeAnders Carlsson// This file is distributed under the University of Illinois Open Source
645372a6fdcd2b0840704569478db456822e02baeAnders Carlsson// License. See LICENSE.TXT for details.
745372a6fdcd2b0840704569478db456822e02baeAnders Carlsson//
845372a6fdcd2b0840704569478db456822e02baeAnders Carlsson//===----------------------------------------------------------------------===//
945372a6fdcd2b0840704569478db456822e02baeAnders Carlsson//
10270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbar// Builder implementation for CGRecordLayout objects.
1145372a6fdcd2b0840704569478db456822e02baeAnders Carlsson//
1245372a6fdcd2b0840704569478db456822e02baeAnders Carlsson//===----------------------------------------------------------------------===//
1345372a6fdcd2b0840704569478db456822e02baeAnders Carlsson
142924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar#include "CGRecordLayout.h"
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "CGCXXABI.h"
1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "CodeGenTypes.h"
1745372a6fdcd2b0840704569478db456822e02baeAnders Carlsson#include "clang/AST/ASTContext.h"
1845372a6fdcd2b0840704569478db456822e02baeAnders Carlsson#include "clang/AST/Attr.h"
1946170f9c7d561d0f94af34a4b5da909d2584370aAnders Carlsson#include "clang/AST/CXXInheritance.h"
2045372a6fdcd2b0840704569478db456822e02baeAnders Carlsson#include "clang/AST/DeclCXX.h"
2145372a6fdcd2b0840704569478db456822e02baeAnders Carlsson#include "clang/AST/Expr.h"
2245372a6fdcd2b0840704569478db456822e02baeAnders Carlsson#include "clang/AST/RecordLayout.h"
23e26bdb91b7e3912ffe895b78a446db94471a59ddDaniel Dunbar#include "clang/Frontend/CodeGenOptions.h"
243b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DataLayout.h"
253b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DerivedTypes.h"
263b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Type.h"
273b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar#include "llvm/Support/Debug.h"
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/MathExtras.h"
2993c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar#include "llvm/Support/raw_ostream.h"
3045372a6fdcd2b0840704569478db456822e02baeAnders Carlssonusing namespace clang;
3145372a6fdcd2b0840704569478db456822e02baeAnders Carlssonusing namespace CodeGen;
3245372a6fdcd2b0840704569478db456822e02baeAnders Carlsson
33d0de0ce304b3fcdda0fe081da2974420ee6f14e7John McCallnamespace {
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// The CGRecordLowering is responsible for lowering an ASTRecordLayout to an
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// llvm::Type.  Some of the lowering is straightforward, some is not.  Here we
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// detail some of the complexities and weirdnesses here.
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// * LLVM does not have unions - Unions can, in theory be represented by any
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   llvm::Type with correct size.  We choose a field via a specific heuristic
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   and add padding if necessary.
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// * LLVM does not have bitfields - Bitfields are collected into contiguous
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   runs and allocated as a single storage type for the run.  ASTRecordLayout
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   contains enough information to determine where the runs break.  Microsoft
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   and Itanium follow different rules and use different codepaths.
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// * It is desired that, when possible, bitfields use the appropriate iN type
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   when lowered to llvm types.  For example unsigned x : 24 gets lowered to
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   i24.  This isn't always possible because i24 has storage size of 32 bit
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   and if it is possible to use that extra byte of padding we must use
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   [i8 x 3] instead of i24.  The function clipTailPadding does this.
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   C++ examples that require clipping:
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   struct { int a : 24; char b; }; // a must be clipped, b goes at offset 3
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   struct A { int a : 24; }; // a must be clipped because a struct like B
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//    could exist: struct B : A { char b; }; // b goes at offset 3
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// * Clang ignores 0 sized bitfields and 0 sized bases but *not* zero sized
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   fields.  The existing asserts suggest that LLVM assumes that *every* field
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   has an underlying storage type.  Therefore empty structures containing
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   zero sized subobjects such as empty records or zero sized arrays still get
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   a zero sized (empty struct) storage type.
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// * Clang reads the complete type rather than the base type when generating
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   code to access fields.  Bitfields in tail position with tail padding may
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   be clipped in the base class but not the complete class (we may discover
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   that the tail padding is not used in the complete class.) However,
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   because LLVM reads from the complete type it can generate incorrect code
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   if we do not clip the tail padding off of the bitfield in the complete
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   layout.  This introduces a somewhat awkward extra unnecessary clip stage.
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   The location of the clip is stored internally as a sentinal of type
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   SCISSOR.  If LLVM were updated to read base types (which it probably
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   should because locations of things such as VBases are bogus in the llvm
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   type anyway) then we could eliminate the SCISSOR.
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// * Itanium allows nearly empty primary virtual bases.  These bases don't get
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   get their own storage because they're laid out as part of another base
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   or at the beginning of the structure.  Determining if a VBase actually
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///   gets storage awkwardly involves a walk of all bases.
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// * VFPtrs and VBPtrs do *not* make a record NotZeroInitializable.
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct CGRecordLowering {
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // MemberInfo is a helper structure that contains information about a record
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // member.  In additional to the standard member types, there exists a
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // sentinal member type that ensures correct rounding.
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct MemberInfo {
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CharUnits Offset;
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    enum InfoKind { VFPtr, VBPtr, Field, Base, VBase, Scissor } Kind;
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    llvm::Type *Data;
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    union {
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      const FieldDecl *FD;
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      const CXXRecordDecl *RD;
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    MemberInfo(CharUnits Offset, InfoKind Kind, llvm::Type *Data,
876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               const FieldDecl *FD = nullptr)
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : Offset(Offset), Kind(Kind), Data(Data), FD(FD) {}
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    MemberInfo(CharUnits Offset, InfoKind Kind, llvm::Type *Data,
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               const CXXRecordDecl *RD)
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : Offset(Offset), Kind(Kind), Data(Data), RD(RD) {}
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // MemberInfos are sorted so we define a < operator.
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool operator <(const MemberInfo& a) const { return Offset < a.Offset; }
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // The constructor.
96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  CGRecordLowering(CodeGenTypes &Types, const RecordDecl *D, bool Packed);
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Short helper routines.
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Constructs a MemberInfo instance from an offset and llvm::Type *.
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  MemberInfo StorageInfo(CharUnits Offset, llvm::Type *Data) {
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return MemberInfo(Offset, MemberInfo::Field, Data);
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
102b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
103b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// The Microsoft bitfield layout rule allocates discrete storage
104b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// units of the field's formal type and only combines adjacent
105b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// fields of the same formal type.  We want to emit a layout with
106b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// these discrete storage units instead of combining them into a
107b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// continuous run.
108b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  bool isDiscreteBitFieldABI() {
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Context.getTargetInfo().getCXXABI().isMicrosoft() ||
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines           D->isMsStruct(Context);
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
112b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
113b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// The Itanium base layout rule allows virtual bases to overlap
114b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// other bases, which complicates layout in specific ways.
115b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ///
116b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// Note specifically that the ms_struct attribute doesn't change this.
117b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  bool isOverlappingVBaseABI() {
118b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    return !Context.getTargetInfo().getCXXABI().isMicrosoft();
119b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  }
120b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Wraps llvm::Type::getIntNTy with some implicit arguments.
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Type *getIntNType(uint64_t NumBits) {
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return llvm::Type::getIntNTy(Types.getLLVMContext(),
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 (unsigned)llvm::alignTo(NumBits, 8));
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Gets an llvm type of size NumBytes and alignment 1.
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Type *getByteArrayType(CharUnits NumBytes) {
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(!NumBytes.isZero() && "Empty byte arrays aren't allowed.");
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    llvm::Type *Type = llvm::Type::getInt8Ty(Types.getLLVMContext());
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return NumBytes == CharUnits::One() ? Type :
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        (llvm::Type *)llvm::ArrayType::get(Type, NumBytes.getQuantity());
132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Gets the storage type for a field decl and handles storage
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// for itanium bitfields that are smaller than their declared type.
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Type *getStorageType(const FieldDecl *FD) {
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    llvm::Type *Type = Types.ConvertTypeForMem(FD->getType());
137b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (!FD->isBitField()) return Type;
138b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (isDiscreteBitFieldABI()) return Type;
139b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    return getIntNType(std::min(FD->getBitWidthValue(Context),
140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             (unsigned)Context.toBits(getSize(Type))));
141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Gets the llvm Basesubobject type from a CXXRecordDecl.
143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Type *getStorageType(const CXXRecordDecl *RD) {
144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Types.getCGRecordLayout(RD).getBaseSubobjectLLVMType();
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits bitsToCharUnits(uint64_t BitOffset) {
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Context.toCharUnitsFromBits(BitOffset);
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits getSize(llvm::Type *Type) {
150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return CharUnits::fromQuantity(DataLayout.getTypeAllocSize(Type));
151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits getAlignment(llvm::Type *Type) {
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return CharUnits::fromQuantity(DataLayout.getABITypeAlignment(Type));
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isZeroInitializable(const FieldDecl *FD) {
156b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    return Types.isZeroInitializable(FD->getType());
157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isZeroInitializable(const RecordDecl *RD) {
159b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    return Types.isZeroInitializable(RD);
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void appendPaddingBytes(CharUnits Size) {
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Size.isZero())
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      FieldTypes.push_back(getByteArrayType(Size));
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  uint64_t getFieldBitOffset(const FieldDecl *FD) {
166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Layout.getFieldOffset(FD->getFieldIndex());
167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Layout routines.
169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setBitFieldInfo(const FieldDecl *FD, CharUnits StartOffset,
170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                       llvm::Type *StorageType);
171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Lowers an ASTRecordLayout to a llvm type.
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void lower(bool NonVirtualBaseType);
173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void lowerUnion();
174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void accumulateFields();
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void accumulateBitFields(RecordDecl::field_iterator Field,
176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        RecordDecl::field_iterator FieldEnd);
177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void accumulateBases();
178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void accumulateVPtrs();
179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void accumulateVBases();
180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Recursively searches all of the bases to find out if a vbase is
181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// not the primary vbase of some base class.
182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool hasOwnStorage(const CXXRecordDecl *Decl, const CXXRecordDecl *Query);
183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void calculateZeroInit();
184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Lowers bitfield storage types to I8 arrays for bitfields with tail
185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// padding that is or can potentially be used.
186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void clipTailPadding();
187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Determines if we need a packed llvm struct.
188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void determinePacked(bool NVBaseType);
189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Inserts padding everwhere it's needed.
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void insertPadding();
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Fills out the structures that are ultimately consumed.
192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void fillOutputFields();
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Input memoization fields.
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CodeGenTypes &Types;
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const ASTContext &Context;
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const RecordDecl *D;
197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CXXRecordDecl *RD;
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const ASTRecordLayout &Layout;
199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const llvm::DataLayout &DataLayout;
200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Helpful intermediate data-structures.
201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::vector<MemberInfo> Members;
202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Output fields, consumed by CodeGenTypes::ComputeRecordLayout.
2035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<llvm::Type *, 16> FieldTypes;
2049b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  llvm::DenseMap<const FieldDecl *, unsigned> Fields;
2059b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  llvm::DenseMap<const FieldDecl *, CGBitFieldInfo> BitFields;
2069b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  llvm::DenseMap<const CXXRecordDecl *, unsigned> NonVirtualBases;
2079b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  llvm::DenseMap<const CXXRecordDecl *, unsigned> VirtualBases;
208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool IsZeroInitializable : 1;
209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool IsZeroInitializableAsBase : 1;
210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool Packed : 1;
211270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbarprivate:
2120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  CGRecordLowering(const CGRecordLowering &) = delete;
2130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  void operator =(const CGRecordLowering &) = delete;
214270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbar};
215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // namespace {
216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesCGRecordLowering::CGRecordLowering(CodeGenTypes &Types, const RecordDecl *D,                                 bool Packed)
218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  : Types(Types), Context(Types.getContext()), D(D),
219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    RD(dyn_cast<CXXRecordDecl>(D)),
220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Layout(Types.getContext().getASTRecordLayout(D)),
221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    DataLayout(Types.getDataLayout()), IsZeroInitializable(true),
222176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    IsZeroInitializableAsBase(true), Packed(Packed) {}
223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::setBitFieldInfo(
225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const FieldDecl *FD, CharUnits StartOffset, llvm::Type *StorageType) {
2266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  CGBitFieldInfo &Info = BitFields[FD->getCanonicalDecl()];
227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Info.IsSigned = FD->getType()->isSignedIntegerOrEnumerationType();
228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Info.Offset = (unsigned)(getFieldBitOffset(FD) - Context.toBits(StartOffset));
229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Info.Size = FD->getBitWidthValue(Context);
230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Info.StorageSize = (unsigned)DataLayout.getTypeAllocSizeInBits(StorageType);
23187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Info.StorageOffset = StartOffset;
232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Info.Size > Info.StorageSize)
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Info.Size = Info.StorageSize;
234ef8d516e7e015a905ca72ce99590803ca7c7e8f3Chandler Carruth  // Reverse the bit offsets for big endian machines. Because we represent
235ef8d516e7e015a905ca72ce99590803ca7c7e8f3Chandler Carruth  // a bitfield as a single large integer load, we can imagine the bits
236ef8d516e7e015a905ca72ce99590803ca7c7e8f3Chandler Carruth  // counting from the most-significant-bit instead of the
237ef8d516e7e015a905ca72ce99590803ca7c7e8f3Chandler Carruth  // least-significant-bit.
238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (DataLayout.isBigEndian())
239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Info.Offset = Info.StorageSize - (Info.Offset + Info.Size);
240e7a80bd66a80ce509de9b50f32cdd402914edd2eDaniel Dunbar}
241e7a80bd66a80ce509de9b50f32cdd402914edd2eDaniel Dunbar
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::lower(bool NVBaseType) {
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // The lowering process implemented in this function takes a variety of
244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // carefully ordered phases.
245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 1) Store all members (fields and bases) in a list and sort them by offset.
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 2) Add a 1-byte capstone member at the Size of the structure.
247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 3) Clip bitfield storages members if their tail padding is or might be
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    used by another field or base.  The clipping process uses the capstone
249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    by treating it as another object that occurs after the record.
250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 4) Determine if the llvm-struct requires packing.  It's important that this
251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    phase occur after clipping, because clipping changes the llvm type.
252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    This phase reads the offset of the capstone when determining packedness
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    and updates the alignment of the capstone to be equal of the alignment
254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    of the record after doing so.
255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 5) Insert padding everywhere it is needed.  This phase requires 'Packed' to
256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    have been computed and needs to know the alignment of the record in
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    order to understand if explicit tail padding is needed.
258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 6) Remove the capstone, we don't need it anymore.
259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 7) Determine if this record can be zero-initialized.  This phase could have
260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    been placed anywhere after phase 1.
261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 8) Format the complete list of members in a way that can be consumed by
262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //    CodeGenTypes::ComputeRecordLayout.
263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits Size = NVBaseType ? Layout.getNonVirtualSize() : Layout.getSize();
264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (D->isUnion())
265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return lowerUnion();
266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  accumulateFields();
267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // RD implies C++.
268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (RD) {
269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    accumulateVPtrs();
270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    accumulateBases();
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Members.empty())
272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return appendPaddingBytes(Size);
273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!NVBaseType)
274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      accumulateVBases();
27572d2dab6058467036df73a5f668036a519043e5bChandler Carruth  }
276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::stable_sort(Members.begin(), Members.end());
277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Members.push_back(StorageInfo(Size, getIntNType(8)));
278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  clipTailPadding();
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  determinePacked(NVBaseType);
280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  insertPadding();
281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Members.pop_back();
282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  calculateZeroInit();
283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  fillOutputFields();
28445372a6fdcd2b0840704569478db456822e02baeAnders Carlsson}
28545372a6fdcd2b0840704569478db456822e02baeAnders Carlsson
286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::lowerUnion() {
287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits LayoutSize = Layout.getSize();
2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  llvm::Type *StorageType = nullptr;
289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool SeenNamedMember = false;
290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Iterate through the fields setting bitFieldInfo and the Fields array. Also
291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // locate the "most appropriate" storage type.  The heuristic for finding the
292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // storage type isn't necessary, the first (non-0-length-bitfield) field's
293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // type would work fine and be simpler but would be different than what we've
294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // been doing and cause lit tests to change.
295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto *Field : D->fields()) {
296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Field->isBitField()) {
297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Skip 0 sized bitfields.
298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Field->getBitWidthValue(Context) == 0)
299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        continue;
300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::Type *FieldType = getStorageType(Field);
301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (LayoutSize < getSize(FieldType))
302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        FieldType = getByteArrayType(LayoutSize);
303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      setBitFieldInfo(Field, CharUnits::Zero(), FieldType);
304a5dd722bdf2f74a1a249fe6661d96a7236aee0f0Anders Carlsson    }
3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Fields[Field->getCanonicalDecl()] = 0;
306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    llvm::Type *FieldType = getStorageType(Field);
307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Compute zero-initializable status.
308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // This union might not be zero initialized: it may contain a pointer to
309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // data member which might have some exotic initialization sequence.
310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // If this is the case, then we aught not to try and come up with a "better"
311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // type, it might not be very easy to come up with a Constant which
312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // correctly initializes it.
313b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (!SeenNamedMember) {
314b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      SeenNamedMember = Field->getIdentifier();
315b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (!SeenNamedMember)
316b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        if (const auto *FieldRD =
317b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                dyn_cast_or_null<RecordDecl>(Field->getType()->getAsTagDecl()))
318b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        SeenNamedMember = FieldRD->findFirstNamedDataMember();
319b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (SeenNamedMember && !isZeroInitializable(Field)) {
320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        IsZeroInitializable = IsZeroInitializableAsBase = false;
321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        StorageType = FieldType;
322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Because our union isn't zero initializable, we won't be getting a better
325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // storage type.
326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!IsZeroInitializable)
327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      continue;
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Conditionally update our storage type if we've got a new "better" one.
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!StorageType ||
330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getAlignment(FieldType) >  getAlignment(StorageType) ||
331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        (getAlignment(FieldType) == getAlignment(StorageType) &&
332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getSize(FieldType) > getSize(StorageType)))
333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      StorageType = FieldType;
334a5dd722bdf2f74a1a249fe6661d96a7236aee0f0Anders Carlsson  }
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // If we have no storage type just pad to the appropriate size and return.
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!StorageType)
337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return appendPaddingBytes(LayoutSize);
338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // If our storage size was bigger than our required size (can happen in the
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // case of packed bitfields on Itanium) then just use an I8 array.
340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (LayoutSize < getSize(StorageType))
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    StorageType = getByteArrayType(LayoutSize);
342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FieldTypes.push_back(StorageType);
343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  appendPaddingBytes(LayoutSize - getSize(StorageType));
344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Set packed if we need it.
345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (LayoutSize % getAlignment(StorageType))
346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Packed = true;
347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
348a5dd722bdf2f74a1a249fe6661d96a7236aee0f0Anders Carlsson
349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::accumulateFields() {
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (RecordDecl::field_iterator Field = D->field_begin(),
351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                  FieldEnd = D->field_end();
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Field != FieldEnd;)
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Field->isBitField()) {
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      RecordDecl::field_iterator Start = Field;
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Iterate to gather the list of bitfields.
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      for (++Field; Field != FieldEnd && Field->isBitField(); ++Field);
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      accumulateBitFields(Start, Field);
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else {
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Members.push_back(MemberInfo(
360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          bitsToCharUnits(getFieldBitOffset(*Field)), MemberInfo::Field,
361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          getStorageType(*Field), *Field));
362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ++Field;
363eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson    }
36445372a6fdcd2b0840704569478db456822e02baeAnders Carlsson}
36545372a6fdcd2b0840704569478db456822e02baeAnders Carlsson
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid
367651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesCGRecordLowering::accumulateBitFields(RecordDecl::field_iterator Field,
368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                      RecordDecl::field_iterator FieldEnd) {
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Run stores the first element of the current run of bitfields.  FieldEnd is
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // used as a special value to note that we don't have a current run.  A
371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // bitfield run is a contiguous collection of bitfields that can be stored in
372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // the same storage block.  Zero-sized bitfields and bitfields that would
373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // cross an alignment boundary break a run and start a new one.
374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  RecordDecl::field_iterator Run = FieldEnd;
375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Tail is the offset of the first bit off the end of the current run.  It's
376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // used to determine if the ASTRecordLayout is treating these two bitfields as
377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // contiguous.  StartBitOffset is offset of the beginning of the Run.
378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  uint64_t StartBitOffset, Tail = 0;
379b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (isDiscreteBitFieldABI()) {
380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (; Field != FieldEnd; ++Field) {
381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      uint64_t BitOffset = getFieldBitOffset(*Field);
382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Zero-width bitfields end runs.
383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Field->getBitWidthValue(Context) == 0) {
384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Run = FieldEnd;
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        continue;
386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::Type *Type = Types.ConvertTypeForMem(Field->getType());
388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // If we don't have a run yet, or don't live within the previous run's
389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // allocated storage then we allocate some storage and start a new run.
390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Run == FieldEnd || BitOffset >= Tail) {
391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Run = Field;
392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        StartBitOffset = BitOffset;
393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Tail = StartBitOffset + DataLayout.getTypeAllocSizeInBits(Type);
394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // Add the storage member to the record.  This must be added to the
395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // record before the bitfield members so that it gets laid out before
396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // the bitfields it contains get laid out.
397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Members.push_back(StorageInfo(bitsToCharUnits(StartBitOffset), Type));
398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Bitfields get the offset of their storage but come afterward and remain
400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // there after a stable sort.
401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Members.push_back(MemberInfo(bitsToCharUnits(StartBitOffset),
4026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   MemberInfo::Field, nullptr, *Field));
403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
40586664465bac330871d4a476f68a1d6f7f6f102afAnders Carlsson  }
406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (;;) {
407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Check to see if we need to start a new run.
408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Run == FieldEnd) {
409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // If we're out of fields, return.
410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Field == FieldEnd)
411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Any non-zero-length bitfield can start a new run.
413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Field->getBitWidthValue(Context) != 0) {
414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Run = Field;
415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        StartBitOffset = getFieldBitOffset(*Field);
416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Tail = StartBitOffset + Field->getBitWidthValue(Context);
417651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
418651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ++Field;
41986664465bac330871d4a476f68a1d6f7f6f102afAnders Carlsson      continue;
42026e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman    }
421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Add bitfields to the run as long as they qualify.
422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Field != FieldEnd && Field->getBitWidthValue(Context) != 0 &&
423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Tail == getFieldBitOffset(*Field)) {
424651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Tail += Field->getBitWidthValue(Context);
425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ++Field;
4265a6e398eafa48c56e8741ad2cd36630badd98f30Anders Carlsson      continue;
4275a6e398eafa48c56e8741ad2cd36630badd98f30Anders Carlsson    }
428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // We've hit a break-point in the run and need to emit a storage field.
429651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    llvm::Type *Type = getIntNType(Tail - StartBitOffset);
430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Add the storage member to the record and set the bitfield info for all of
431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // the bitfields in the run.  Bitfields get the offset of their storage but
432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // come afterward and remain there after a stable sort.
433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Members.push_back(StorageInfo(bitsToCharUnits(StartBitOffset), Type));
434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (; Run != Field; ++Run)
435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Members.push_back(MemberInfo(bitsToCharUnits(StartBitOffset),
4366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   MemberInfo::Field, nullptr, *Run));
437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Run = FieldEnd;
4385a6e398eafa48c56e8741ad2cd36630badd98f30Anders Carlsson  }
439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::accumulateBases() {
442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // If we've got a primary virtual base, we need to add it with the bases.
4436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Layout.isPrimaryBaseVirtual()) {
4446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const CXXRecordDecl *BaseDecl = Layout.getPrimaryBase();
4456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Members.push_back(MemberInfo(CharUnits::Zero(), MemberInfo::Base,
4466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                 getStorageType(BaseDecl), BaseDecl));
4476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Accumulate the non-virtual bases.
449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &Base : RD->bases()) {
450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Base.isVirtual())
451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      continue;
452b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
453b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // Bases can be zero-sized even if not technically empty if they
454b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // contain only a trailing array member.
455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
456b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (!BaseDecl->isEmpty() &&
45787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        !Context.getASTRecordLayout(BaseDecl).getNonVirtualSize().isZero())
458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Members.push_back(MemberInfo(Layout.getBaseClassOffset(BaseDecl),
459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          MemberInfo::Base, getStorageType(BaseDecl), BaseDecl));
460e504170f688b0e2113011839b933a4ec450b5182Fariborz Jahanian  }
4615a6e398eafa48c56e8741ad2cd36630badd98f30Anders Carlsson}
4625a6e398eafa48c56e8741ad2cd36630badd98f30Anders Carlsson
463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::accumulateVPtrs() {
464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Layout.hasOwnVFPtr())
465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Members.push_back(MemberInfo(CharUnits::Zero(), MemberInfo::VFPtr,
466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        llvm::FunctionType::get(getIntNType(32), /*isVarArg=*/true)->
467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            getPointerTo()->getPointerTo()));
468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Layout.hasOwnVBPtr())
469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Members.push_back(MemberInfo(Layout.getVBPtrOffset(), MemberInfo::VBPtr,
470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        llvm::Type::getInt32PtrTy(Types.getLLVMContext())));
471860453c4b4768e99d72f5833771c508e6ef00cc6Anders Carlsson}
472860453c4b4768e99d72f5833771c508e6ef00cc6Anders Carlsson
473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::accumulateVBases() {
4746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  CharUnits ScissorOffset = Layout.getNonVirtualSize();
4756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // In the itanium ABI, it's possible to place a vbase at a dsize that is
4766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // smaller than the nvsize.  Here we check to see if such a base is placed
4776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // before the nvsize and set the scissor offset to that, instead of the
4786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // nvsize.
479b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (isOverlappingVBaseABI())
4806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (const auto &Base : RD->vbases()) {
4816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
4826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (BaseDecl->isEmpty())
4836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        continue;
4846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // If the vbase is a primary virtual base of some base, then it doesn't
4856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // get its own storage location but instead lives inside of that base.
4866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (Context.isNearlyEmpty(BaseDecl) && !hasOwnStorage(RD, BaseDecl))
4876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        continue;
4886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ScissorOffset = std::min(ScissorOffset,
4896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                               Layout.getVBaseClassOffset(BaseDecl));
4906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
4916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Members.push_back(MemberInfo(ScissorOffset, MemberInfo::Scissor, nullptr,
4926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                               RD));
493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &Base : RD->vbases()) {
494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (BaseDecl->isEmpty())
496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      continue;
497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CharUnits Offset = Layout.getVBaseClassOffset(BaseDecl);
498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // If the vbase is a primary virtual base of some base, then it doesn't
499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // get its own storage location but instead lives inside of that base.
500b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (isOverlappingVBaseABI() &&
501b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        Context.isNearlyEmpty(BaseDecl) &&
502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        !hasOwnStorage(RD, BaseDecl)) {
5036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Members.push_back(MemberInfo(Offset, MemberInfo::VBase, nullptr,
5046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   BaseDecl));
505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      continue;
506651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // If we've got a vtordisp, add it as a storage type.
508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Layout.getVBaseOffsetsMap().find(BaseDecl)->second.hasVtorDisp())
509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Members.push_back(StorageInfo(Offset - CharUnits::fromQuantity(4),
510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    getIntNType(32)));
511651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Members.push_back(MemberInfo(Offset, MemberInfo::VBase,
512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 getStorageType(BaseDecl), BaseDecl));
5139b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  }
5149b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall}
5158f2c6899dd14023555808dbdcbe7e371c3fb2cc2Anders Carlsson
516651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool CGRecordLowering::hasOwnStorage(const CXXRecordDecl *Decl,
517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                     const CXXRecordDecl *Query) {
518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const ASTRecordLayout &DeclLayout = Context.getASTRecordLayout(Decl);
519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (DeclLayout.isPrimaryBaseVirtual() && DeclLayout.getPrimaryBase() == Query)
520fa2b3dd31c2fa32f10156e3cbbc8d0cfa2879d03Eli Friedman    return false;
521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &Base : Decl->bases())
522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!hasOwnStorage(Base.getType()->getAsCXXRecordDecl(), Query))
523fa2b3dd31c2fa32f10156e3cbbc8d0cfa2879d03Eli Friedman      return false;
524fa2b3dd31c2fa32f10156e3cbbc8d0cfa2879d03Eli Friedman  return true;
5259da235244c2de2bcca654b518c66133c30ebde53John McCall}
5269da235244c2de2bcca654b518c66133c30ebde53John McCall
527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::calculateZeroInit() {
528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (std::vector<MemberInfo>::const_iterator Member = Members.begin(),
529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                               MemberEnd = Members.end();
530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       IsZeroInitializableAsBase && Member != MemberEnd; ++Member) {
531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member->Kind == MemberInfo::Field) {
532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (!Member->FD || isZeroInitializable(Member->FD))
5331d7dc2240717eb34672035b13ceb17710ab481c1Anders Carlsson        continue;
534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      IsZeroInitializable = IsZeroInitializableAsBase = false;
535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else if (Member->Kind == MemberInfo::Base ||
536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               Member->Kind == MemberInfo::VBase) {
537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (isZeroInitializable(Member->RD))
538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        continue;
539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      IsZeroInitializable = false;
540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Member->Kind == MemberInfo::Base)
541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        IsZeroInitializableAsBase = false;
5421d7dc2240717eb34672035b13ceb17710ab481c1Anders Carlsson    }
5431d7dc2240717eb34672035b13ceb17710ab481c1Anders Carlsson  }
5441d7dc2240717eb34672035b13ceb17710ab481c1Anders Carlsson}
5451d7dc2240717eb34672035b13ceb17710ab481c1Anders Carlsson
546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::clipTailPadding() {
547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::vector<MemberInfo>::iterator Prior = Members.begin();
548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits Tail = getSize(Prior->Data);
549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (std::vector<MemberInfo>::iterator Member = Prior + 1,
550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                         MemberEnd = Members.end();
551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       Member != MemberEnd; ++Member) {
552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Only members with data and the scissor can cut into tail padding.
553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Member->Data && Member->Kind != MemberInfo::Scissor)
55415ddfdc5d8929556c07ea7341006b31c71544325Anders Carlsson      continue;
555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member->Offset < Tail) {
556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      assert(Prior->Kind == MemberInfo::Field && !Prior->FD &&
557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             "Only storage fields have tail padding!");
5584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Prior->Data = getByteArrayType(bitsToCharUnits(llvm::alignTo(
559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          cast<llvm::IntegerType>(Prior->Data)->getIntegerBitWidth(), 8)));
560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member->Data)
562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Prior = Member;
563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Tail = Prior->Offset + getSize(Prior->Data);
5649da235244c2de2bcca654b518c66133c30ebde53John McCall  }
5654b3e5be334c93c3f48af2a49c0ea7cd9bae2a0e5Anders Carlsson}
5664b3e5be334c93c3f48af2a49c0ea7cd9bae2a0e5Anders Carlsson
567176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CGRecordLowering::determinePacked(bool NVBaseType) {
568176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Packed)
569176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return;
570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits Alignment = CharUnits::One();
571176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  CharUnits NVAlignment = CharUnits::One();
572176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  CharUnits NVSize =
573176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      !NVBaseType && RD ? Layout.getNonVirtualSize() : CharUnits::Zero();
574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (std::vector<MemberInfo>::const_iterator Member = Members.begin(),
575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                               MemberEnd = Members.end();
576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       Member != MemberEnd; ++Member) {
577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Member->Data)
578651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      continue;
579651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // If any member falls at an offset that it not a multiple of its alignment,
580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // then the entire record must be packed.
581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member->Offset % getAlignment(Member->Data))
582651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Packed = true;
583176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Member->Offset < NVSize)
584176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      NVAlignment = std::max(NVAlignment, getAlignment(Member->Data));
585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Alignment = std::max(Alignment, getAlignment(Member->Data));
5869b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  }
587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // If the size of the record (the capstone's offset) is not a multiple of the
588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // record's alignment, it must be packed.
589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Members.back().Offset % Alignment)
590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Packed = true;
591176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // If the non-virtual sub-object is not a multiple of the non-virtual
592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // sub-object's alignment, it must be packed.  We cannot have a packed
593176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // non-virtual sub-object and an unpacked complete object or vise versa.
594176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (NVSize % NVAlignment)
595176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Packed = true;
596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Update the alignment of the sentinal.
597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!Packed)
598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Members.back().Data = getIntNType(Context.toBits(Alignment));
5993d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson}
6003d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::insertPadding() {
602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::vector<std::pair<CharUnits, CharUnits> > Padding;
603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits Size = CharUnits::Zero();
604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (std::vector<MemberInfo>::const_iterator Member = Members.begin(),
605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                               MemberEnd = Members.end();
606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       Member != MemberEnd; ++Member) {
607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Member->Data)
60872d2dab6058467036df73a5f668036a519043e5bChandler Carruth      continue;
609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CharUnits Offset = Member->Offset;
610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(Offset >= Size);
611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Insert padding if we need to.
6124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Offset !=
6134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Size.alignTo(Packed ? CharUnits::One() : getAlignment(Member->Data)))
614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Padding.push_back(std::make_pair(Size, Offset - Size));
615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Size = Offset + getSize(Member->Data);
61645372a6fdcd2b0840704569478db456822e02baeAnders Carlsson  }
617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Padding.empty())
618c2456824a106455bae5d738fe65d80b14a6804c4Anders Carlsson    return;
619651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Add the padding to the Members list and sort it.
620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (std::vector<std::pair<CharUnits, CharUnits> >::const_iterator
621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Pad = Padding.begin(), PadEnd = Padding.end();
622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Pad != PadEnd; ++Pad)
623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Members.push_back(StorageInfo(Pad->first, getByteArrayType(Pad->second)));
624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::stable_sort(Members.begin(), Members.end());
625c1efe36ca75b4f4f82cdec464bab5693ed0d6058Anders Carlsson}
626c1efe36ca75b4f4f82cdec464bab5693ed0d6058Anders Carlsson
627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGRecordLowering::fillOutputFields() {
628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (std::vector<MemberInfo>::const_iterator Member = Members.begin(),
629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                               MemberEnd = Members.end();
630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       Member != MemberEnd; ++Member) {
631651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member->Data)
632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      FieldTypes.push_back(Member->Data);
633651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member->Kind == MemberInfo::Field) {
634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Member->FD)
6356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Fields[Member->FD->getCanonicalDecl()] = FieldTypes.size() - 1;
636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // A field without storage must be a bitfield.
637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (!Member->Data)
638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        setBitFieldInfo(Member->FD, Member->Offset, FieldTypes.back());
639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else if (Member->Kind == MemberInfo::Base)
640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      NonVirtualBases[Member->RD] = FieldTypes.size() - 1;
641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else if (Member->Kind == MemberInfo::VBase)
642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      VirtualBases[Member->RD] = FieldTypes.size() - 1;
64345372a6fdcd2b0840704569478db456822e02baeAnders Carlsson  }
64445372a6fdcd2b0840704569478db456822e02baeAnders Carlsson}
64545372a6fdcd2b0840704569478db456822e02baeAnders Carlsson
646651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesCGBitFieldInfo CGBitFieldInfo::MakeInfo(CodeGenTypes &Types,
647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                        const FieldDecl *FD,
648651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                        uint64_t Offset, uint64_t Size,
649651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                        uint64_t StorageSize,
65087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                        CharUnits StorageOffset) {
651651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // This function is vestigial from CGRecordLayoutBuilder days but is still
652651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // used in GCObjCRuntime.cpp.  That usage has a "fixme" attached to it that
653651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // when addressed will allow for the removal of this function.
654651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Type *Ty = Types.ConvertTypeForMem(FD->getType());
655651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CharUnits TypeSizeInBytes =
656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CharUnits::fromQuantity(Types.getDataLayout().getTypeAllocSize(Ty));
657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  uint64_t TypeSizeInBits = Types.getContext().toBits(TypeSizeInBytes);
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
659651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool IsSigned = FD->getType()->isSignedIntegerOrEnumerationType();
6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
661651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Size > TypeSizeInBits) {
662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // We have a wide bit-field. The extra bits are only used for padding, so
663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // if we have a bitfield of type T, with size N:
664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //
665651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // T t : N;
666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //
667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // We can just assume that it's:
668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //
669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // T t : sizeof(T);
670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //
671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Size = TypeSizeInBits;
672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
6731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Reverse the bit offsets for big endian machines. Because we represent
675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // a bitfield as a single large integer load, we can imagine the bits
676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // counting from the most-significant-bit instead of the
677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // least-significant-bit.
678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Types.getDataLayout().isBigEndian()) {
679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Offset = StorageSize - (Offset + Size);
680a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  }
681651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
68287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return CGBitFieldInfo(Offset, Size, IsSigned, StorageSize, StorageOffset);
683a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson}
684270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbar
6859cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris LattnerCGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D,
6869cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner                                                  llvm::StructType *Ty) {
687176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  CGRecordLowering Builder(*this, D, /*Packed=*/false);
6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
689176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Builder.lower(/*NonVirtualBaseType=*/false);
6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6919b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // If we're in C++, compute the base subobject type.
6926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  llvm::StructType *BaseTy = nullptr;
693651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isa<CXXRecordDecl>(D) && !D->isUnion() && !D->hasAttr<FinalAttr>()) {
694651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    BaseTy = Ty;
695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Builder.Layout.getNonVirtualSize() != Builder.Layout.getSize()) {
696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      CGRecordLowering BaseBuilder(*this, D, /*Packed=*/Builder.Packed);
697176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      BaseBuilder.lower(/*NonVirtualBaseType=*/true);
698651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      BaseTy = llvm::StructType::create(
699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          getLLVMContext(), BaseBuilder.FieldTypes, "", BaseBuilder.Packed);
700651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      addRecordTypeName(D, BaseTy, ".base");
701176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // BaseTy and Ty must agree on their packedness for getLLVMFieldNo to work
702176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // on both of them with the same index.
703176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      assert(Builder.Packed == BaseBuilder.Packed &&
704176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines             "Non-virtual and complete types must agree on packedness");
705651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
7063d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson  }
7073d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson
708651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Fill in the struct *after* computing the base type.  Filling in the body
709651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // signifies that the type is no longer opaque and record layout is complete,
710651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // but we may need to recursively layout D while laying D out as a base type.
711651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Ty->setBody(Builder.FieldTypes, Builder.Packed);
712651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
713198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar  CGRecordLayout *RL =
7149b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall    new CGRecordLayout(Ty, BaseTy, Builder.IsZeroInitializable,
715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        Builder.IsZeroInitializableAsBase);
716198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar
7179b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  RL->NonVirtualBases.swap(Builder.NonVirtualBases);
7189b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  RL->CompleteObjectVirtualBases.swap(Builder.VirtualBases);
719c6772ce9c80ff524c7c522b5f0b37de58786bd84Anders Carlsson
72045372a6fdcd2b0840704569478db456822e02baeAnders Carlsson  // Add all the field numbers.
7219b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  RL->FieldInfo.swap(Builder.Fields);
72245372a6fdcd2b0840704569478db456822e02baeAnders Carlsson
72345372a6fdcd2b0840704569478db456822e02baeAnders Carlsson  // Add bitfield info.
7249b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  RL->BitFields.swap(Builder.BitFields);
7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7262e7b7c2f267e0bf8047608aa1cd6691c0bf86792Daniel Dunbar  // Dump the layout, if requested.
7274e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getContext().getLangOpts().DumpRecordLayouts) {
728c250192494e0fa63be50269d2c1eb7786f8ab7a0Argyrios Kyrtzidis    llvm::outs() << "\n*** Dumping IRgen Record Layout\n";
729c250192494e0fa63be50269d2c1eb7786f8ab7a0Argyrios Kyrtzidis    llvm::outs() << "Record: ";
730c250192494e0fa63be50269d2c1eb7786f8ab7a0Argyrios Kyrtzidis    D->dump(llvm::outs());
731c250192494e0fa63be50269d2c1eb7786f8ab7a0Argyrios Kyrtzidis    llvm::outs() << "\nLayout: ";
732c250192494e0fa63be50269d2c1eb7786f8ab7a0Argyrios Kyrtzidis    RL->print(llvm::outs());
733ab970f90ce31a53fe7e6375a37536bf0832fd922Daniel Dunbar  }
73493c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar
735e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar#ifndef NDEBUG
7362e7b7c2f267e0bf8047608aa1cd6691c0bf86792Daniel Dunbar  // Verify that the computed LLVM struct size matches the AST layout size.
7373d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson  const ASTRecordLayout &Layout = getContext().getASTRecordLayout(D);
7383d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson
739dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck  uint64_t TypeSizeInBits = getContext().toBits(Layout.getSize());
74025a6a84cf5067b32c271e3ba078676dee838798dMicah Villmow  assert(TypeSizeInBits == getDataLayout().getTypeAllocSizeInBits(Ty) &&
7412e7b7c2f267e0bf8047608aa1cd6691c0bf86792Daniel Dunbar         "Type size mismatch!");
7422e7b7c2f267e0bf8047608aa1cd6691c0bf86792Daniel Dunbar
7433d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson  if (BaseTy) {
74468cf1a5a01ba43ed56a8624632fd65e0804430acKen Dyck    CharUnits NonVirtualSize  = Layout.getNonVirtualSize();
74568cf1a5a01ba43ed56a8624632fd65e0804430acKen Dyck
74668cf1a5a01ba43ed56a8624632fd65e0804430acKen Dyck    uint64_t AlignedNonVirtualTypeSizeInBits =
747651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      getContext().toBits(NonVirtualSize);
7483d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson
7493d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson    assert(AlignedNonVirtualTypeSizeInBits ==
75025a6a84cf5067b32c271e3ba078676dee838798dMicah Villmow           getDataLayout().getTypeAllocSizeInBits(BaseTy) &&
7513d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson           "Type size mismatch!");
7523d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson  }
7533d155e683a74d3783362ef1865be91544eb8a9fcAnders Carlsson
7543b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar  // Verify that the LLVM and AST field offsets agree.
7552acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::StructType *ST =
7563b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar    dyn_cast<llvm::StructType>(RL->getLLVMType());
75725a6a84cf5067b32c271e3ba078676dee838798dMicah Villmow  const llvm::StructLayout *SL = getDataLayout().getStructLayout(ST);
7583b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar
7593b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar  const ASTRecordLayout &AST_RL = getContext().getASTRecordLayout(D);
7603b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar  RecordDecl::field_iterator it = D->field_begin();
7613b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar  for (unsigned i = 0, e = AST_RL.getFieldCount(); i != e; ++i, ++it) {
762581deb3da481053c4993c7600f97acf7768caac5David Blaikie    const FieldDecl *FD = *it;
763e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar
764e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar    // For non-bit-fields, just check that the LLVM struct offset matches the
765e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar    // AST offset.
766e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar    if (!FD->isBitField()) {
7673b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar      unsigned FieldNo = RL->getLLVMFieldNo(FD);
7683b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar      assert(AST_RL.getFieldOffset(i) == SL->getElementOffsetInBits(FieldNo) &&
7693b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar             "Invalid field offset!");
770e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar      continue;
771e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar    }
77262055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian
773e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar    // Ignore unnamed bit-fields.
774cd06f26835033e879a9278941f4f6e6a4086976dEli Friedman    if (!FD->getDeclName())
775e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar      continue;
77672d2dab6058467036df73a5f668036a519043e5bChandler Carruth
77772d2dab6058467036df73a5f668036a519043e5bChandler Carruth    // Don't inspect zero-length bitfields.
77872d2dab6058467036df73a5f668036a519043e5bChandler Carruth    if (FD->getBitWidthValue(getContext()) == 0)
77972d2dab6058467036df73a5f668036a519043e5bChandler Carruth      continue;
78072d2dab6058467036df73a5f668036a519043e5bChandler Carruth
781e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar    const CGBitFieldInfo &Info = RL->getBitFieldInfo(FD);
782b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth    llvm::Type *ElementTy = ST->getTypeAtIndex(RL->getLLVMFieldNo(FD));
783b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth
78472d2dab6058467036df73a5f668036a519043e5bChandler Carruth    // Unions have overlapping elements dictating their layout, but for
78572d2dab6058467036df73a5f668036a519043e5bChandler Carruth    // non-unions we can verify that this section of the layout is the exact
786b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth    // expected size.
78772d2dab6058467036df73a5f668036a519043e5bChandler Carruth    if (D->isUnion()) {
788b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth      // For unions we verify that the start is zero and the size
789b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth      // is in-bounds. However, on BE systems, the offset may be non-zero, but
790b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth      // the size + offset should match the storage size in that case as it
791b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth      // "starts" at the back.
792b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth      if (getDataLayout().isBigEndian())
793ed6355d56cbeb1cd1a77cc46e0a519af25523ccbDavid Greene        assert(static_cast<unsigned>(Info.Offset + Info.Size) ==
794ed6355d56cbeb1cd1a77cc46e0a519af25523ccbDavid Greene               Info.StorageSize &&
795b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth               "Big endian union bitfield does not end at the back");
796b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth      else
797b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth        assert(Info.Offset == 0 &&
798b50d7a35c2f55be382d462a02fd4e21d6b582162Chandler Carruth               "Little endian union bitfield with a non-zero offset");
79972d2dab6058467036df73a5f668036a519043e5bChandler Carruth      assert(Info.StorageSize <= SL->getSizeInBits() &&
80072d2dab6058467036df73a5f668036a519043e5bChandler Carruth             "Union not large enough for bitfield storage");
80172d2dab6058467036df73a5f668036a519043e5bChandler Carruth    } else {
80272d2dab6058467036df73a5f668036a519043e5bChandler Carruth      assert(Info.StorageSize ==
80372d2dab6058467036df73a5f668036a519043e5bChandler Carruth             getDataLayout().getTypeAllocSizeInBits(ElementTy) &&
80472d2dab6058467036df73a5f668036a519043e5bChandler Carruth             "Storage size does not match the element type size");
8053b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar    }
80672d2dab6058467036df73a5f668036a519043e5bChandler Carruth    assert(Info.Size > 0 && "Empty bitfield!");
8076bd120387a0d36bb5a748d4100b3eaa399eb53c5Eli Bendersky    assert(static_cast<unsigned>(Info.Offset) + Info.Size <= Info.StorageSize &&
80872d2dab6058467036df73a5f668036a519043e5bChandler Carruth           "Bitfield outside of its allocated storage");
8093b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar  }
8103b2ae7ae59b11657416fc3f16e742713b4683e5eDaniel Dunbar#endif
8112e7b7c2f267e0bf8047608aa1cd6691c0bf86792Daniel Dunbar
812198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar  return RL;
81345372a6fdcd2b0840704569478db456822e02baeAnders Carlsson}
81493c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar
8155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CGRecordLayout::print(raw_ostream &OS) const {
81693c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar  OS << "<CGRecordLayout\n";
8179b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  OS << "  LLVMType:" << *CompleteObjectType << "\n";
8189b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  if (BaseSubobjectType)
8199b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall    OS << "  NonVirtualBaseLLVMType:" << *BaseSubobjectType << "\n";
820f16aa103d3afd42fbca2ab346f191bf745cec092John McCall  OS << "  IsZeroInitializable:" << IsZeroInitializable << "\n";
82193c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar  OS << "  BitFields:[\n";
822ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar
823ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar  // Print bit-field infos in declaration order.
824ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar  std::vector<std::pair<unsigned, const CGBitFieldInfo*> > BFIs;
82593c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar  for (llvm::DenseMap<const FieldDecl*, CGBitFieldInfo>::const_iterator
82693c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar         it = BitFields.begin(), ie = BitFields.end();
82793c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar       it != ie; ++it) {
828ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar    const RecordDecl *RD = it->first->getParent();
829ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar    unsigned Index = 0;
830ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar    for (RecordDecl::field_iterator
831581deb3da481053c4993c7600f97acf7768caac5David Blaikie           it2 = RD->field_begin(); *it2 != it->first; ++it2)
832ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar      ++Index;
833ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar    BFIs.push_back(std::make_pair(Index, &it->second));
834ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar  }
835ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar  llvm::array_pod_sort(BFIs.begin(), BFIs.end());
836ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar  for (unsigned i = 0, e = BFIs.size(); i != e; ++i) {
837ab970f90ce31a53fe7e6375a37536bf0832fd922Daniel Dunbar    OS.indent(4);
838ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar    BFIs[i].second->print(OS);
83993c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar    OS << "\n";
84093c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar  }
841ad759530ff48385255c25e71d7e05632361e0c11Daniel Dunbar
84293c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar  OS << "]>\n";
84393c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar}
84493c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar
8454967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarLLVM_DUMP_METHOD void CGRecordLayout::dump() const {
84693c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar  print(llvm::errs());
84793c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar}
84893c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar
8495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CGBitFieldInfo::print(raw_ostream &OS) const {
85072d2dab6058467036df73a5f668036a519043e5bChandler Carruth  OS << "<CGBitFieldInfo"
85172d2dab6058467036df73a5f668036a519043e5bChandler Carruth     << " Offset:" << Offset
85272d2dab6058467036df73a5f668036a519043e5bChandler Carruth     << " Size:" << Size
85372d2dab6058467036df73a5f668036a519043e5bChandler Carruth     << " IsSigned:" << IsSigned
85472d2dab6058467036df73a5f668036a519043e5bChandler Carruth     << " StorageSize:" << StorageSize
85587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar     << " StorageOffset:" << StorageOffset.getQuantity() << ">";
85693c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar}
85793c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar
8584967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarLLVM_DUMP_METHOD void CGBitFieldInfo::dump() const {
85993c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar  print(llvm::errs());
86093c62967d4ac7620a8ed2c5f875daab9adb416f0Daniel Dunbar}
861