blob: 123848b8fce20b958ef620f259684d11f8944725 [file] [log] [blame]
Daniel Dunbar23ee4b72010-03-31 00:11:27 +00001//===--- CGRecordLayoutBuilder.cpp - CGRecordLayout builder ----*- C++ -*-===//
Anders Carlsson307846f2009-07-23 03:17:50 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Daniel Dunbar23ee4b72010-03-31 00:11:27 +000010// Builder implementation for CGRecordLayout objects.
Anders Carlsson307846f2009-07-23 03:17:50 +000011//
12//===----------------------------------------------------------------------===//
13
Daniel Dunbar072d0bb2010-03-30 22:26:10 +000014#include "CGRecordLayout.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "CGCXXABI.h"
16#include "CodeGenTypes.h"
Anders Carlsson307846f2009-07-23 03:17:50 +000017#include "clang/AST/ASTContext.h"
18#include "clang/AST/Attr.h"
Anders Carlsson4131f002010-11-24 22:50:27 +000019#include "clang/AST/CXXInheritance.h"
Anders Carlsson307846f2009-07-23 03:17:50 +000020#include "clang/AST/DeclCXX.h"
21#include "clang/AST/Expr.h"
22#include "clang/AST/RecordLayout.h"
Daniel Dunbard3f3d932011-06-21 18:54:46 +000023#include "clang/Frontend/CodeGenOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000024#include "llvm/DataLayout.h"
Anders Carlsson307846f2009-07-23 03:17:50 +000025#include "llvm/DerivedTypes.h"
Daniel Dunbar2ba67442010-04-21 19:10:49 +000026#include "llvm/Support/Debug.h"
Daniel Dunbarb97bff92010-04-12 18:14:18 +000027#include "llvm/Support/raw_ostream.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000028#include "llvm/Type.h"
Anders Carlsson307846f2009-07-23 03:17:50 +000029using namespace clang;
30using namespace CodeGen;
31
John McCallbcd38212010-11-30 23:17:27 +000032namespace {
Daniel Dunbar23ee4b72010-03-31 00:11:27 +000033
34class CGRecordLayoutBuilder {
35public:
36 /// FieldTypes - Holds the LLVM types that the struct is created from.
John McCall0217dfc22011-02-15 06:40:56 +000037 ///
Chris Lattner0e62c1c2011-07-23 10:55:15 +000038 SmallVector<llvm::Type *, 16> FieldTypes;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +000039
John McCall0217dfc22011-02-15 06:40:56 +000040 /// BaseSubobjectType - Holds the LLVM type for the non-virtual part
Anders Carlssonc1351ca2010-11-09 05:25:47 +000041 /// of the struct. For example, consider:
42 ///
43 /// struct A { int i; };
44 /// struct B { void *v; };
45 /// struct C : virtual A, B { };
46 ///
47 /// The LLVM type of C will be
48 /// %struct.C = type { i32 (...)**, %struct.A, i32, %struct.B }
49 ///
50 /// And the LLVM type of the non-virtual base struct will be
51 /// %struct.C.base = type { i32 (...)**, %struct.A, i32 }
John McCall0217dfc22011-02-15 06:40:56 +000052 ///
53 /// This only gets initialized if the base subobject type is
54 /// different from the complete-object type.
Chris Lattnera5f58b02011-07-09 17:41:47 +000055 llvm::StructType *BaseSubobjectType;
Anders Carlssonc1351ca2010-11-09 05:25:47 +000056
John McCall0217dfc22011-02-15 06:40:56 +000057 /// FieldInfo - Holds a field and its corresponding LLVM field number.
58 llvm::DenseMap<const FieldDecl *, unsigned> Fields;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +000059
John McCall0217dfc22011-02-15 06:40:56 +000060 /// BitFieldInfo - Holds location and size information about a bit field.
61 llvm::DenseMap<const FieldDecl *, CGBitFieldInfo> BitFields;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +000062
John McCall0217dfc22011-02-15 06:40:56 +000063 llvm::DenseMap<const CXXRecordDecl *, unsigned> NonVirtualBases;
64 llvm::DenseMap<const CXXRecordDecl *, unsigned> VirtualBases;
Anders Carlsson4131f002010-11-24 22:50:27 +000065
66 /// IndirectPrimaryBases - Virtual base classes, direct or indirect, that are
67 /// primary base classes for some other direct or indirect base class.
68 CXXIndirectPrimaryBaseSet IndirectPrimaryBases;
69
Anders Carlssona459adb2010-11-28 19:18:44 +000070 /// LaidOutVirtualBases - A set of all laid out virtual bases, used to avoid
71 /// avoid laying out virtual bases more than once.
72 llvm::SmallPtrSet<const CXXRecordDecl *, 4> LaidOutVirtualBases;
73
John McCall614dbdc2010-08-22 21:01:12 +000074 /// IsZeroInitializable - Whether this struct can be C++
75 /// zero-initialized with an LLVM zeroinitializer.
76 bool IsZeroInitializable;
John McCall0217dfc22011-02-15 06:40:56 +000077 bool IsZeroInitializableAsBase;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +000078
79 /// Packed - Whether the resulting LLVM struct will be packed or not.
80 bool Packed;
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +000081
82 /// IsMsStruct - Whether ms_struct is in effect or not
83 bool IsMsStruct;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +000084
85private:
86 CodeGenTypes &Types;
87
Anders Carlssonfcaaa692011-04-17 21:56:13 +000088 /// LastLaidOutBaseInfo - Contains the offset and non-virtual size of the
89 /// last base laid out. Used so that we can replace the last laid out base
90 /// type with an i8 array if needed.
91 struct LastLaidOutBaseInfo {
92 CharUnits Offset;
93 CharUnits NonVirtualSize;
94
95 bool isValid() const { return !NonVirtualSize.isZero(); }
96 void invalidate() { NonVirtualSize = CharUnits::Zero(); }
97
98 } LastLaidOutBase;
99
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000100 /// Alignment - Contains the alignment of the RecordDecl.
John McCall4d9f1422011-02-15 22:21:29 +0000101 CharUnits Alignment;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000102
John McCall4d9f1422011-02-15 22:21:29 +0000103 /// NextFieldOffset - Holds the next field offset.
104 CharUnits NextFieldOffset;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000105
Anders Carlsson1de2f572010-04-17 20:49:27 +0000106 /// LayoutUnionField - Will layout a field in an union and return the type
107 /// that the field will have.
Chris Lattnera5f58b02011-07-09 17:41:47 +0000108 llvm::Type *LayoutUnionField(const FieldDecl *Field,
109 const ASTRecordLayout &Layout);
Anders Carlsson1de2f572010-04-17 20:49:27 +0000110
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000111 /// LayoutUnion - Will layout a union RecordDecl.
112 void LayoutUnion(const RecordDecl *D);
113
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000114 /// Lay out a sequence of contiguous bitfields.
115 bool LayoutBitfields(const ASTRecordLayout &Layout,
116 unsigned &FirstFieldNo,
117 RecordDecl::field_iterator &FI,
118 RecordDecl::field_iterator FE);
119
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000120 /// LayoutField - try to layout all fields in the record decl.
121 /// Returns false if the operation failed because the struct is not packed.
122 bool LayoutFields(const RecordDecl *D);
123
Anders Carlssona518b2a2010-12-04 23:59:48 +0000124 /// Layout a single base, virtual or non-virtual
Eli Friedman3c840aa2011-12-12 23:13:20 +0000125 bool LayoutBase(const CXXRecordDecl *base,
John McCall4d9f1422011-02-15 22:21:29 +0000126 const CGRecordLayout &baseLayout,
127 CharUnits baseOffset);
Anders Carlssona518b2a2010-12-04 23:59:48 +0000128
Anders Carlsson1f95ee32010-11-25 01:59:35 +0000129 /// LayoutVirtualBase - layout a single virtual base.
Eli Friedman3c840aa2011-12-12 23:13:20 +0000130 bool LayoutVirtualBase(const CXXRecordDecl *base,
John McCall4d9f1422011-02-15 22:21:29 +0000131 CharUnits baseOffset);
Anders Carlsson1f95ee32010-11-25 01:59:35 +0000132
Anders Carlssona459adb2010-11-28 19:18:44 +0000133 /// LayoutVirtualBases - layout the virtual bases of a record decl.
Eli Friedman3c840aa2011-12-12 23:13:20 +0000134 bool LayoutVirtualBases(const CXXRecordDecl *RD,
Anders Carlssona459adb2010-11-28 19:18:44 +0000135 const ASTRecordLayout &Layout);
John McCall0153cd32011-11-08 04:01:03 +0000136
137 /// MSLayoutVirtualBases - layout the virtual bases of a record decl,
138 /// like MSVC.
Eli Friedman3c840aa2011-12-12 23:13:20 +0000139 bool MSLayoutVirtualBases(const CXXRecordDecl *RD,
John McCall0153cd32011-11-08 04:01:03 +0000140 const ASTRecordLayout &Layout);
Anders Carlssona459adb2010-11-28 19:18:44 +0000141
Anders Carlssonaf9e5af2010-05-18 05:12:20 +0000142 /// LayoutNonVirtualBase - layout a single non-virtual base.
Eli Friedman3c840aa2011-12-12 23:13:20 +0000143 bool LayoutNonVirtualBase(const CXXRecordDecl *base,
John McCall4d9f1422011-02-15 22:21:29 +0000144 CharUnits baseOffset);
Anders Carlssonaf9e5af2010-05-18 05:12:20 +0000145
Anders Carlssona459adb2010-11-28 19:18:44 +0000146 /// LayoutNonVirtualBases - layout the virtual bases of a record decl.
Eli Friedman3c840aa2011-12-12 23:13:20 +0000147 bool LayoutNonVirtualBases(const CXXRecordDecl *RD,
Anders Carlssonaf9e5af2010-05-18 05:12:20 +0000148 const ASTRecordLayout &Layout);
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000149
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000150 /// ComputeNonVirtualBaseType - Compute the non-virtual base field types.
Argyrios Kyrtzidis648fcbe2010-12-10 00:11:00 +0000151 bool ComputeNonVirtualBaseType(const CXXRecordDecl *RD);
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000152
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000153 /// LayoutField - layout a single field. Returns false if the operation failed
154 /// because the current struct is not packed.
155 bool LayoutField(const FieldDecl *D, uint64_t FieldOffset);
156
157 /// LayoutBitField - layout a single bit field.
158 void LayoutBitField(const FieldDecl *D, uint64_t FieldOffset);
159
160 /// AppendField - Appends a field with the given offset and type.
Chris Lattnera5f58b02011-07-09 17:41:47 +0000161 void AppendField(CharUnits fieldOffset, llvm::Type *FieldTy);
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000162
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000163 /// AppendPadding - Appends enough padding bytes so that the total
164 /// struct size is a multiple of the field alignment.
John McCall4d9f1422011-02-15 22:21:29 +0000165 void AppendPadding(CharUnits fieldOffset, CharUnits fieldAlignment);
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000166
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000167 /// ResizeLastBaseFieldIfNecessary - Fields and bases can be laid out in the
168 /// tail padding of a previous base. If this happens, the type of the previous
169 /// base needs to be changed to an array of i8. Returns true if the last
170 /// laid out base was resized.
171 bool ResizeLastBaseFieldIfNecessary(CharUnits offset);
172
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000173 /// getByteArrayType - Returns a byte array type with the given number of
174 /// elements.
Chris Lattnera5f58b02011-07-09 17:41:47 +0000175 llvm::Type *getByteArrayType(CharUnits NumBytes);
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000176
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000177 /// AppendBytes - Append a given number of bytes to the record.
John McCall4d9f1422011-02-15 22:21:29 +0000178 void AppendBytes(CharUnits numBytes);
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000179
180 /// AppendTailPadding - Append enough tail padding so that the type will have
181 /// the passed size.
Ken Dyck272b6fa2011-04-24 16:53:44 +0000182 void AppendTailPadding(CharUnits RecordSize);
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000183
Chris Lattner2192fe52011-07-18 04:24:23 +0000184 CharUnits getTypeAlignment(llvm::Type *Ty) const;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000185
Anders Carlssonacf877b2010-11-28 23:06:23 +0000186 /// getAlignmentAsLLVMStruct - Returns the maximum alignment of all the
187 /// LLVM element types.
John McCall4d9f1422011-02-15 22:21:29 +0000188 CharUnits getAlignmentAsLLVMStruct() const;
Anders Carlssonacf877b2010-11-28 23:06:23 +0000189
John McCall614dbdc2010-08-22 21:01:12 +0000190 /// CheckZeroInitializable - Check if the given type contains a pointer
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000191 /// to data member.
John McCall614dbdc2010-08-22 21:01:12 +0000192 void CheckZeroInitializable(QualType T);
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000193
194public:
195 CGRecordLayoutBuilder(CodeGenTypes &Types)
John McCall0217dfc22011-02-15 06:40:56 +0000196 : BaseSubobjectType(0),
197 IsZeroInitializable(true), IsZeroInitializableAsBase(true),
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +0000198 Packed(false), IsMsStruct(false),
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000199 Types(Types) { }
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000200
201 /// Layout - Will layout a RecordDecl.
202 void Layout(const RecordDecl *D);
203};
204
205}
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000206
Anders Carlsson307846f2009-07-23 03:17:50 +0000207void CGRecordLayoutBuilder::Layout(const RecordDecl *D) {
John McCall4d9f1422011-02-15 22:21:29 +0000208 Alignment = Types.getContext().getASTRecordLayout(D).getAlignment();
Anders Carlsson09a37742009-09-02 17:51:33 +0000209 Packed = D->hasAttr<PackedAttr>();
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +0000210
Eli Friedman9ee2d0472012-10-12 23:29:20 +0000211 IsMsStruct = D->isMsStruct(Types.getContext());
Anders Carlsson28a5fa22009-08-08 19:38:24 +0000212
Anders Carlsson697f6592009-07-23 03:43:54 +0000213 if (D->isUnion()) {
214 LayoutUnion(D);
215 return;
216 }
Anders Carlsson68e0b682009-08-08 18:23:56 +0000217
Anders Carlsson307846f2009-07-23 03:17:50 +0000218 if (LayoutFields(D))
219 return;
Mike Stump11289f42009-09-09 15:08:12 +0000220
Anders Carlsson307846f2009-07-23 03:17:50 +0000221 // We weren't able to layout the struct. Try again with a packed struct
Anders Carlssond78fc892009-07-23 17:24:40 +0000222 Packed = true;
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000223 LastLaidOutBase.invalidate();
John McCall4d9f1422011-02-15 22:21:29 +0000224 NextFieldOffset = CharUnits::Zero();
Anders Carlsson307846f2009-07-23 03:17:50 +0000225 FieldTypes.clear();
John McCall0217dfc22011-02-15 06:40:56 +0000226 Fields.clear();
227 BitFields.clear();
228 NonVirtualBases.clear();
229 VirtualBases.clear();
Mike Stump11289f42009-09-09 15:08:12 +0000230
Anders Carlsson307846f2009-07-23 03:17:50 +0000231 LayoutFields(D);
232}
233
Daniel Dunbarc7f9bba2010-09-02 23:53:28 +0000234CGBitFieldInfo CGBitFieldInfo::MakeInfo(CodeGenTypes &Types,
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000235 const FieldDecl *FD,
236 uint64_t Offset, uint64_t Size,
237 uint64_t StorageSize,
238 uint64_t StorageAlignment) {
Chris Lattner2192fe52011-07-18 04:24:23 +0000239 llvm::Type *Ty = Types.ConvertTypeForMem(FD->getType());
John McCall8a3c5552011-02-26 08:41:59 +0000240 CharUnits TypeSizeInBytes =
Micah Villmowdd31ca12012-10-08 16:25:52 +0000241 CharUnits::fromQuantity(Types.getDataLayout().getTypeAllocSize(Ty));
John McCall8a3c5552011-02-26 08:41:59 +0000242 uint64_t TypeSizeInBits = Types.getContext().toBits(TypeSizeInBytes);
Daniel Dunbarf9c24f82010-04-12 21:01:28 +0000243
Douglas Gregor6ab2fa82011-05-20 16:38:50 +0000244 bool IsSigned = FD->getType()->isSignedIntegerOrEnumerationType();
Daniel Dunbarf9c24f82010-04-12 21:01:28 +0000245
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000246 if (Size > TypeSizeInBits) {
Anders Carlssond5f27b02010-04-17 22:54:57 +0000247 // We have a wide bit-field. The extra bits are only used for padding, so
248 // if we have a bitfield of type T, with size N:
249 //
250 // T t : N;
251 //
252 // We can just assume that it's:
253 //
254 // T t : sizeof(T);
255 //
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000256 Size = TypeSizeInBits;
Anders Carlssonbe6f3182010-04-16 16:23:02 +0000257 }
258
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000259 // Reverse the bit offsets for big endian machines.
260 if (Types.getDataLayout().isBigEndian())
261 Offset = Size - Offset - 1;
Chris Lattnerfb59c7c2011-02-17 22:09:58 +0000262
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000263 return CGBitFieldInfo(Offset, Size, IsSigned, StorageSize, StorageAlignment);
Daniel Dunbarf9c24f82010-04-12 21:01:28 +0000264}
265
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000266/// \brief Layout the range of bitfields from BFI to BFE as contiguous storage.
267bool CGRecordLayoutBuilder::LayoutBitfields(const ASTRecordLayout &Layout,
268 unsigned &FirstFieldNo,
269 RecordDecl::field_iterator &FI,
270 RecordDecl::field_iterator FE) {
271 assert(FI != FE);
272 uint64_t FirstFieldOffset = Layout.getFieldOffset(FirstFieldNo);
273 uint64_t NextFieldOffsetInBits = Types.getContext().toBits(NextFieldOffset);
Daniel Dunbarc7f9bba2010-09-02 23:53:28 +0000274
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000275 unsigned CharAlign = Types.getContext().getTargetInfo().getCharAlign();
276 assert(FirstFieldOffset % CharAlign == 0 &&
277 "First field offset is misaligned");
278 CharUnits FirstFieldOffsetInBytes
279 = Types.getContext().toCharUnitsFromBits(FirstFieldOffset);
Daniel Dunbarc7f9bba2010-09-02 23:53:28 +0000280
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000281 unsigned StorageAlignment
282 = llvm::MinAlign(Alignment.getQuantity(),
283 FirstFieldOffsetInBytes.getQuantity());
Mike Stump11289f42009-09-09 15:08:12 +0000284
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000285 if (FirstFieldOffset < NextFieldOffsetInBits) {
286 CharUnits FieldOffsetInCharUnits =
287 Types.getContext().toCharUnitsFromBits(FirstFieldOffset);
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000288
289 // Try to resize the last base field.
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000290 if (!ResizeLastBaseFieldIfNecessary(FieldOffsetInCharUnits))
291 llvm_unreachable("We must be able to resize the last base if we need to "
292 "pack bits into it.");
293
294 NextFieldOffsetInBits = Types.getContext().toBits(NextFieldOffset);
295 assert(FirstFieldOffset >= NextFieldOffsetInBits);
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000296 }
297
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000298 // Append padding if necessary.
299 AppendPadding(Types.getContext().toCharUnitsFromBits(FirstFieldOffset),
300 CharUnits::One());
Mike Stump11289f42009-09-09 15:08:12 +0000301
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000302 // Find the last bitfield in a contiguous run of bitfields.
303 RecordDecl::field_iterator BFI = FI;
304 unsigned LastFieldNo = FirstFieldNo;
305 uint64_t NextContiguousFieldOffset = FirstFieldOffset;
306 for (RecordDecl::field_iterator FJ = FI;
307 (FJ != FE && (*FJ)->isBitField() &&
308 NextContiguousFieldOffset == Layout.getFieldOffset(LastFieldNo) &&
309 (*FJ)->getBitWidthValue(Types.getContext()) != 0); FI = FJ++) {
310 NextContiguousFieldOffset += (*FJ)->getBitWidthValue(Types.getContext());
311 ++LastFieldNo;
Anders Carlsson307846f2009-07-23 03:17:50 +0000312
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000313 // We must use packed structs for packed fields, and also unnamed bit
314 // fields since they don't affect the struct alignment.
315 if (!Packed && ((*FJ)->hasAttr<PackedAttr>() || !(*FJ)->getDeclName()))
316 return false;
317 }
318 RecordDecl::field_iterator BFE = llvm::next(FI);
319 --LastFieldNo;
320 assert(LastFieldNo >= FirstFieldNo && "Empty run of contiguous bitfields");
321 FieldDecl *LastFD = *FI;
Mike Stump11289f42009-09-09 15:08:12 +0000322
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000323 // Find the last bitfield's offset, add its size, and round it up to the
324 // character alignment to compute the storage required.
325 uint64_t LastFieldOffset = Layout.getFieldOffset(LastFieldNo);
326 uint64_t LastFieldSize = LastFD->getBitWidthValue(Types.getContext());
327 uint64_t TotalBits = (LastFieldOffset + LastFieldSize) - FirstFieldOffset;
328 CharUnits StorageBytes = Types.getContext().toCharUnitsFromBits(
329 llvm::RoundUpToAlignment(TotalBits, CharAlign));
330 uint64_t StorageBits = Types.getContext().toBits(StorageBytes);
Mike Stump11289f42009-09-09 15:08:12 +0000331
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000332 // Grow the storage to encompass any known padding in the layout when doing
333 // so will make the storage a power-of-two. There are two cases when we can
334 // do this. The first is when we have a subsequent field and can widen up to
335 // its offset. The second is when the data size of the AST record layout is
336 // past the end of the current storage. The latter is true when there is tail
337 // padding on a struct and no members of a super class can be packed into it.
338 //
339 // Note that we widen the storage as much as possible here to express the
340 // maximum latitude the language provides, and rely on the backend to lower
341 // these in conjunction with shifts and masks to narrower operations where
342 // beneficial.
343 uint64_t EndOffset = Types.getContext().toBits(Layout.getDataSize());
344 if (BFE != FE)
345 // If there are more fields to be laid out, the offset at the end of the
346 // bitfield is the offset of the next field in the record.
347 EndOffset = Layout.getFieldOffset(LastFieldNo + 1);
348 assert(EndOffset >= (FirstFieldOffset + TotalBits) &&
349 "End offset is not past the end of the known storage bits.");
350 uint64_t SpaceBits = EndOffset - FirstFieldOffset;
351 uint64_t LongBits = Types.getContext().getTargetInfo().getLongWidth();
352 uint64_t WidenedBits = (StorageBits / LongBits) * LongBits +
353 llvm::NextPowerOf2(StorageBits % LongBits - 1);
354 assert(WidenedBits >= StorageBits && "Widening shrunk the bits!");
355 if (WidenedBits <= SpaceBits) {
356 StorageBits = WidenedBits;
357 StorageBytes = Types.getContext().toCharUnitsFromBits(StorageBits);
358 assert(StorageBits == (uint64_t)Types.getContext().toBits(StorageBytes));
Anders Carlsson307846f2009-07-23 03:17:50 +0000359 }
360
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000361 unsigned FieldIndex = FieldTypes.size();
362 AppendBytes(StorageBytes);
Mike Stump11289f42009-09-09 15:08:12 +0000363
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000364 // Now walk the bitfields associating them with this field of storage and
365 // building up the bitfield specific info.
366 unsigned FieldNo = FirstFieldNo;
367 for (; BFI != BFE; ++BFI, ++FieldNo) {
368 FieldDecl *FD = *BFI;
369 uint64_t FieldOffset = Layout.getFieldOffset(FieldNo) - FirstFieldOffset;
370 uint64_t FieldSize = FD->getBitWidthValue(Types.getContext());
371 Fields[FD] = FieldIndex;
372 BitFields[FD] = CGBitFieldInfo::MakeInfo(Types, FD, FieldOffset, FieldSize,
373 StorageBits, StorageAlignment);
374 }
375 FirstFieldNo = LastFieldNo;
376 return true;
Anders Carlsson307846f2009-07-23 03:17:50 +0000377}
378
379bool CGRecordLayoutBuilder::LayoutField(const FieldDecl *D,
John McCall4d9f1422011-02-15 22:21:29 +0000380 uint64_t fieldOffset) {
Anders Carlsson307846f2009-07-23 03:17:50 +0000381 // If the field is packed, then we need a packed struct.
Anders Carlsson68e0b682009-08-08 18:23:56 +0000382 if (!Packed && D->hasAttr<PackedAttr>())
Anders Carlsson307846f2009-07-23 03:17:50 +0000383 return false;
384
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000385 assert(!D->isBitField() && "Bitfields should be laid out seperately.");
Mike Stump11289f42009-09-09 15:08:12 +0000386
John McCall614dbdc2010-08-22 21:01:12 +0000387 CheckZeroInitializable(D->getType());
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000388
John McCall8a3c5552011-02-26 08:41:59 +0000389 assert(fieldOffset % Types.getTarget().getCharWidth() == 0
390 && "field offset is not on a byte boundary!");
391 CharUnits fieldOffsetInBytes
392 = Types.getContext().toCharUnitsFromBits(fieldOffset);
Mike Stump11289f42009-09-09 15:08:12 +0000393
Chris Lattnera5f58b02011-07-09 17:41:47 +0000394 llvm::Type *Ty = Types.ConvertTypeForMem(D->getType());
John McCall4d9f1422011-02-15 22:21:29 +0000395 CharUnits typeAlignment = getTypeAlignment(Ty);
Anders Carlsson19702bb2009-08-04 16:29:15 +0000396
Anders Carlsson28a5fa22009-08-08 19:38:24 +0000397 // If the type alignment is larger then the struct alignment, we must use
398 // a packed struct.
John McCall4d9f1422011-02-15 22:21:29 +0000399 if (typeAlignment > Alignment) {
Anders Carlsson28a5fa22009-08-08 19:38:24 +0000400 assert(!Packed && "Alignment is wrong even with packed struct!");
401 return false;
402 }
Mike Stump11289f42009-09-09 15:08:12 +0000403
John McCall4d9f1422011-02-15 22:21:29 +0000404 if (!Packed) {
405 if (const RecordType *RT = D->getType()->getAs<RecordType>()) {
406 const RecordDecl *RD = cast<RecordDecl>(RT->getDecl());
407 if (const MaxFieldAlignmentAttr *MFAA =
408 RD->getAttr<MaxFieldAlignmentAttr>()) {
John McCall8a3c5552011-02-26 08:41:59 +0000409 if (MFAA->getAlignment() != Types.getContext().toBits(typeAlignment))
John McCall4d9f1422011-02-15 22:21:29 +0000410 return false;
411 }
Anders Carlsson28a5fa22009-08-08 19:38:24 +0000412 }
413 }
414
Anders Carlsson19702bb2009-08-04 16:29:15 +0000415 // Round up the field offset to the alignment of the field type.
John McCall4d9f1422011-02-15 22:21:29 +0000416 CharUnits alignedNextFieldOffsetInBytes =
417 NextFieldOffset.RoundUpToAlignment(typeAlignment);
Anders Carlsson19702bb2009-08-04 16:29:15 +0000418
John McCall4d9f1422011-02-15 22:21:29 +0000419 if (fieldOffsetInBytes < alignedNextFieldOffsetInBytes) {
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000420 // Try to resize the last base field.
421 if (ResizeLastBaseFieldIfNecessary(fieldOffsetInBytes)) {
422 alignedNextFieldOffsetInBytes =
423 NextFieldOffset.RoundUpToAlignment(typeAlignment);
424 }
425 }
426
427 if (fieldOffsetInBytes < alignedNextFieldOffsetInBytes) {
Anders Carlsson19702bb2009-08-04 16:29:15 +0000428 assert(!Packed && "Could not place field even with packed struct!");
429 return false;
430 }
Mike Stump11289f42009-09-09 15:08:12 +0000431
John McCall4d9f1422011-02-15 22:21:29 +0000432 AppendPadding(fieldOffsetInBytes, typeAlignment);
Mike Stump11289f42009-09-09 15:08:12 +0000433
Anders Carlsson307846f2009-07-23 03:17:50 +0000434 // Now append the field.
John McCall0217dfc22011-02-15 06:40:56 +0000435 Fields[D] = FieldTypes.size();
John McCall4d9f1422011-02-15 22:21:29 +0000436 AppendField(fieldOffsetInBytes, Ty);
Mike Stump11289f42009-09-09 15:08:12 +0000437
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000438 LastLaidOutBase.invalidate();
Anders Carlsson307846f2009-07-23 03:17:50 +0000439 return true;
440}
441
Chris Lattnera5f58b02011-07-09 17:41:47 +0000442llvm::Type *
Anders Carlsson1de2f572010-04-17 20:49:27 +0000443CGRecordLayoutBuilder::LayoutUnionField(const FieldDecl *Field,
444 const ASTRecordLayout &Layout) {
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000445 Fields[Field] = 0;
Anders Carlsson1de2f572010-04-17 20:49:27 +0000446 if (Field->isBitField()) {
Richard Smithcaf33902011-10-10 18:28:20 +0000447 uint64_t FieldSize = Field->getBitWidthValue(Types.getContext());
Anders Carlsson1de2f572010-04-17 20:49:27 +0000448
449 // Ignore zero sized bit fields.
450 if (FieldSize == 0)
451 return 0;
452
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000453 unsigned StorageBits = llvm::RoundUpToAlignment(
454 FieldSize, Types.getContext().getTargetInfo().getCharAlign());
455 CharUnits NumBytesToAppend
456 = Types.getContext().toCharUnitsFromBits(StorageBits);
Anders Carlsson2295f132010-04-17 21:04:52 +0000457
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000458 llvm::Type *FieldTy = llvm::Type::getInt8Ty(Types.getLLVMContext());
Ken Dyck7a0b19f2011-04-24 16:47:33 +0000459 if (NumBytesToAppend > CharUnits::One())
460 FieldTy = llvm::ArrayType::get(FieldTy, NumBytesToAppend.getQuantity());
Anders Carlsson2295f132010-04-17 21:04:52 +0000461
Anders Carlsson1de2f572010-04-17 20:49:27 +0000462 // Add the bit field info.
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000463 BitFields[Field] = CGBitFieldInfo::MakeInfo(Types, Field, 0, FieldSize,
464 StorageBits,
465 Alignment.getQuantity());
Anders Carlsson2295f132010-04-17 21:04:52 +0000466 return FieldTy;
Anders Carlsson1de2f572010-04-17 20:49:27 +0000467 }
Daniel Dunbar20b551a2010-04-20 17:52:30 +0000468
Anders Carlsson1de2f572010-04-17 20:49:27 +0000469 // This is a regular union field.
Chris Lattnera5f58b02011-07-09 17:41:47 +0000470 return Types.ConvertTypeForMem(Field->getType());
Anders Carlsson1de2f572010-04-17 20:49:27 +0000471}
472
Anders Carlsson697f6592009-07-23 03:43:54 +0000473void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
474 assert(D->isUnion() && "Can't call LayoutUnion on a non-union record!");
Mike Stump11289f42009-09-09 15:08:12 +0000475
John McCall4d9f1422011-02-15 22:21:29 +0000476 const ASTRecordLayout &layout = Types.getContext().getASTRecordLayout(D);
Mike Stump11289f42009-09-09 15:08:12 +0000477
Chris Lattnera5f58b02011-07-09 17:41:47 +0000478 llvm::Type *unionType = 0;
John McCall4d9f1422011-02-15 22:21:29 +0000479 CharUnits unionSize = CharUnits::Zero();
480 CharUnits unionAlign = CharUnits::Zero();
Mike Stump11289f42009-09-09 15:08:12 +0000481
John McCall4d9f1422011-02-15 22:21:29 +0000482 bool hasOnlyZeroSizedBitFields = true;
Eli Friedmandae858a2011-12-07 01:30:11 +0000483 bool checkedFirstFieldZeroInit = false;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000484
John McCall4d9f1422011-02-15 22:21:29 +0000485 unsigned fieldNo = 0;
486 for (RecordDecl::field_iterator field = D->field_begin(),
487 fieldEnd = D->field_end(); field != fieldEnd; ++field, ++fieldNo) {
488 assert(layout.getFieldOffset(fieldNo) == 0 &&
Anders Carlsson697f6592009-07-23 03:43:54 +0000489 "Union field offset did not start at the beginning of record!");
David Blaikie40ed2972012-06-06 20:45:41 +0000490 llvm::Type *fieldType = LayoutUnionField(*field, layout);
Anders Carlssonf814ee62009-07-23 04:00:39 +0000491
John McCall4d9f1422011-02-15 22:21:29 +0000492 if (!fieldType)
Anders Carlsson1de2f572010-04-17 20:49:27 +0000493 continue;
Mike Stump11289f42009-09-09 15:08:12 +0000494
Eli Friedmandae858a2011-12-07 01:30:11 +0000495 if (field->getDeclName() && !checkedFirstFieldZeroInit) {
496 CheckZeroInitializable(field->getType());
497 checkedFirstFieldZeroInit = true;
498 }
499
John McCall4d9f1422011-02-15 22:21:29 +0000500 hasOnlyZeroSizedBitFields = false;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000501
John McCall4d9f1422011-02-15 22:21:29 +0000502 CharUnits fieldAlign = CharUnits::fromQuantity(
Micah Villmowdd31ca12012-10-08 16:25:52 +0000503 Types.getDataLayout().getABITypeAlignment(fieldType));
John McCall4d9f1422011-02-15 22:21:29 +0000504 CharUnits fieldSize = CharUnits::fromQuantity(
Micah Villmowdd31ca12012-10-08 16:25:52 +0000505 Types.getDataLayout().getTypeAllocSize(fieldType));
Mike Stump11289f42009-09-09 15:08:12 +0000506
John McCall4d9f1422011-02-15 22:21:29 +0000507 if (fieldAlign < unionAlign)
Anders Carlsson697f6592009-07-23 03:43:54 +0000508 continue;
Mike Stump11289f42009-09-09 15:08:12 +0000509
John McCall4d9f1422011-02-15 22:21:29 +0000510 if (fieldAlign > unionAlign || fieldSize > unionSize) {
511 unionType = fieldType;
512 unionAlign = fieldAlign;
513 unionSize = fieldSize;
Anders Carlsson697f6592009-07-23 03:43:54 +0000514 }
515 }
Mike Stump11289f42009-09-09 15:08:12 +0000516
Anders Carlsson697f6592009-07-23 03:43:54 +0000517 // Now add our field.
John McCall4d9f1422011-02-15 22:21:29 +0000518 if (unionType) {
519 AppendField(CharUnits::Zero(), unionType);
Anders Carlsson0e912752009-09-03 22:56:02 +0000520
John McCall4d9f1422011-02-15 22:21:29 +0000521 if (getTypeAlignment(unionType) > layout.getAlignment()) {
Anders Carlsson0e912752009-09-03 22:56:02 +0000522 // We need a packed struct.
523 Packed = true;
John McCall4d9f1422011-02-15 22:21:29 +0000524 unionAlign = CharUnits::One();
Anders Carlsson0e912752009-09-03 22:56:02 +0000525 }
526 }
John McCall4d9f1422011-02-15 22:21:29 +0000527 if (unionAlign.isZero()) {
Chandler Carruth52b6ac22012-03-04 12:16:40 +0000528 (void)hasOnlyZeroSizedBitFields;
John McCall4d9f1422011-02-15 22:21:29 +0000529 assert(hasOnlyZeroSizedBitFields &&
Anders Carlssonb1ef9912010-01-28 18:22:03 +0000530 "0-align record did not have all zero-sized bit-fields!");
John McCall4d9f1422011-02-15 22:21:29 +0000531 unionAlign = CharUnits::One();
Fariborz Jahaniane8e631c2009-11-06 20:47:40 +0000532 }
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000533
Anders Carlsson697f6592009-07-23 03:43:54 +0000534 // Append tail padding.
John McCall4d9f1422011-02-15 22:21:29 +0000535 CharUnits recordSize = layout.getSize();
536 if (recordSize > unionSize)
537 AppendPadding(recordSize, unionAlign);
Anders Carlsson697f6592009-07-23 03:43:54 +0000538}
539
Eli Friedman3c840aa2011-12-12 23:13:20 +0000540bool CGRecordLayoutBuilder::LayoutBase(const CXXRecordDecl *base,
John McCall4d9f1422011-02-15 22:21:29 +0000541 const CGRecordLayout &baseLayout,
542 CharUnits baseOffset) {
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000543 ResizeLastBaseFieldIfNecessary(baseOffset);
544
John McCall4d9f1422011-02-15 22:21:29 +0000545 AppendPadding(baseOffset, CharUnits::One());
Anders Carlssona518b2a2010-12-04 23:59:48 +0000546
John McCall0217dfc22011-02-15 06:40:56 +0000547 const ASTRecordLayout &baseASTLayout
548 = Types.getContext().getASTRecordLayout(base);
549
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000550 LastLaidOutBase.Offset = NextFieldOffset;
551 LastLaidOutBase.NonVirtualSize = baseASTLayout.getNonVirtualSize();
552
Chris Lattnera5f58b02011-07-09 17:41:47 +0000553 llvm::StructType *subobjectType = baseLayout.getBaseSubobjectLLVMType();
Eli Friedman3c840aa2011-12-12 23:13:20 +0000554 if (getTypeAlignment(subobjectType) > Alignment)
555 return false;
556
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000557 AppendField(baseOffset, subobjectType);
Eli Friedman3c840aa2011-12-12 23:13:20 +0000558 return true;
John McCall0217dfc22011-02-15 06:40:56 +0000559}
560
Eli Friedman3c840aa2011-12-12 23:13:20 +0000561bool CGRecordLayoutBuilder::LayoutNonVirtualBase(const CXXRecordDecl *base,
John McCall4d9f1422011-02-15 22:21:29 +0000562 CharUnits baseOffset) {
John McCall0217dfc22011-02-15 06:40:56 +0000563 // Ignore empty bases.
Eli Friedman3c840aa2011-12-12 23:13:20 +0000564 if (base->isEmpty()) return true;
John McCall0217dfc22011-02-15 06:40:56 +0000565
566 const CGRecordLayout &baseLayout = Types.getCGRecordLayout(base);
567 if (IsZeroInitializableAsBase) {
568 assert(IsZeroInitializable &&
569 "class zero-initializable as base but not as complete object");
570
571 IsZeroInitializable = IsZeroInitializableAsBase =
572 baseLayout.isZeroInitializableAsBase();
573 }
574
Eli Friedman3c840aa2011-12-12 23:13:20 +0000575 if (!LayoutBase(base, baseLayout, baseOffset))
576 return false;
John McCall0217dfc22011-02-15 06:40:56 +0000577 NonVirtualBases[base] = (FieldTypes.size() - 1);
Eli Friedman3c840aa2011-12-12 23:13:20 +0000578 return true;
Anders Carlssona518b2a2010-12-04 23:59:48 +0000579}
580
Eli Friedman3c840aa2011-12-12 23:13:20 +0000581bool
John McCall0217dfc22011-02-15 06:40:56 +0000582CGRecordLayoutBuilder::LayoutVirtualBase(const CXXRecordDecl *base,
John McCall4d9f1422011-02-15 22:21:29 +0000583 CharUnits baseOffset) {
Anders Carlsson1f95ee32010-11-25 01:59:35 +0000584 // Ignore empty bases.
Eli Friedman3c840aa2011-12-12 23:13:20 +0000585 if (base->isEmpty()) return true;
Anders Carlsson1f95ee32010-11-25 01:59:35 +0000586
John McCall0217dfc22011-02-15 06:40:56 +0000587 const CGRecordLayout &baseLayout = Types.getCGRecordLayout(base);
588 if (IsZeroInitializable)
589 IsZeroInitializable = baseLayout.isZeroInitializableAsBase();
Anders Carlsson1f95ee32010-11-25 01:59:35 +0000590
Eli Friedman3c840aa2011-12-12 23:13:20 +0000591 if (!LayoutBase(base, baseLayout, baseOffset))
592 return false;
John McCall0217dfc22011-02-15 06:40:56 +0000593 VirtualBases[base] = (FieldTypes.size() - 1);
Eli Friedman3c840aa2011-12-12 23:13:20 +0000594 return true;
Anders Carlsson1f95ee32010-11-25 01:59:35 +0000595}
596
Eli Friedman3c840aa2011-12-12 23:13:20 +0000597bool
John McCall0153cd32011-11-08 04:01:03 +0000598CGRecordLayoutBuilder::MSLayoutVirtualBases(const CXXRecordDecl *RD,
599 const ASTRecordLayout &Layout) {
600 if (!RD->getNumVBases())
Eli Friedman3c840aa2011-12-12 23:13:20 +0000601 return true;
John McCall0153cd32011-11-08 04:01:03 +0000602
603 // The vbases list is uniqued and ordered by a depth-first
604 // traversal, which is what we need here.
605 for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
606 E = RD->vbases_end(); I != E; ++I) {
607
608 const CXXRecordDecl *BaseDecl =
609 cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl());
610
611 CharUnits vbaseOffset = Layout.getVBaseClassOffset(BaseDecl);
Eli Friedman3c840aa2011-12-12 23:13:20 +0000612 if (!LayoutVirtualBase(BaseDecl, vbaseOffset))
613 return false;
John McCall0153cd32011-11-08 04:01:03 +0000614 }
Eli Friedman3c840aa2011-12-12 23:13:20 +0000615 return true;
John McCall0153cd32011-11-08 04:01:03 +0000616}
617
Anders Carlssona459adb2010-11-28 19:18:44 +0000618/// LayoutVirtualBases - layout the non-virtual bases of a record decl.
Eli Friedman3c840aa2011-12-12 23:13:20 +0000619bool
Anders Carlssona459adb2010-11-28 19:18:44 +0000620CGRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD,
621 const ASTRecordLayout &Layout) {
622 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
623 E = RD->bases_end(); I != E; ++I) {
624 const CXXRecordDecl *BaseDecl =
625 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
626
627 // We only want to lay out virtual bases that aren't indirect primary bases
628 // of some other base.
629 if (I->isVirtual() && !IndirectPrimaryBases.count(BaseDecl)) {
630 // Only lay out the base once.
631 if (!LaidOutVirtualBases.insert(BaseDecl))
632 continue;
633
John McCall4d9f1422011-02-15 22:21:29 +0000634 CharUnits vbaseOffset = Layout.getVBaseClassOffset(BaseDecl);
Eli Friedman3c840aa2011-12-12 23:13:20 +0000635 if (!LayoutVirtualBase(BaseDecl, vbaseOffset))
636 return false;
Anders Carlssona459adb2010-11-28 19:18:44 +0000637 }
638
639 if (!BaseDecl->getNumVBases()) {
640 // This base isn't interesting since it doesn't have any virtual bases.
641 continue;
642 }
643
Eli Friedman3c840aa2011-12-12 23:13:20 +0000644 if (!LayoutVirtualBases(BaseDecl, Layout))
645 return false;
Anders Carlssona459adb2010-11-28 19:18:44 +0000646 }
Eli Friedman3c840aa2011-12-12 23:13:20 +0000647 return true;
Anders Carlssona459adb2010-11-28 19:18:44 +0000648}
649
Eli Friedman3c840aa2011-12-12 23:13:20 +0000650bool
Anders Carlssonaf9e5af2010-05-18 05:12:20 +0000651CGRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD,
652 const ASTRecordLayout &Layout) {
653 const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();
654
John McCall0153cd32011-11-08 04:01:03 +0000655 // If we have a primary base, lay it out first.
656 if (PrimaryBase) {
Eli Friedman3c840aa2011-12-12 23:13:20 +0000657 if (!Layout.isPrimaryBaseVirtual()) {
658 if (!LayoutNonVirtualBase(PrimaryBase, CharUnits::Zero()))
659 return false;
660 } else {
661 if (!LayoutVirtualBase(PrimaryBase, CharUnits::Zero()))
662 return false;
663 }
Anders Carlssonaf9e5af2010-05-18 05:12:20 +0000664
John McCall0153cd32011-11-08 04:01:03 +0000665 // Otherwise, add a vtable / vf-table if the layout says to do so.
John McCalle42a3362012-05-01 08:55:32 +0000666 } else if (Layout.hasOwnVFPtr()) {
John McCall0153cd32011-11-08 04:01:03 +0000667 llvm::Type *FunctionType =
668 llvm::FunctionType::get(llvm::Type::getInt32Ty(Types.getLLVMContext()),
669 /*isVarArg=*/true);
670 llvm::Type *VTableTy = FunctionType->getPointerTo();
Eli Friedmanf927b8b2012-04-27 02:34:46 +0000671
672 if (getTypeAlignment(VTableTy) > Alignment) {
673 // FIXME: Should we allow this to happen in Sema?
674 assert(!Packed && "Alignment is wrong even with packed struct!");
675 return false;
676 }
677
John McCall0153cd32011-11-08 04:01:03 +0000678 assert(NextFieldOffset.isZero() &&
679 "VTable pointer must come first!");
680 AppendField(CharUnits::Zero(), VTableTy->getPointerTo());
Anders Carlssonaf9e5af2010-05-18 05:12:20 +0000681 }
682
683 // Layout the non-virtual bases.
684 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
685 E = RD->bases_end(); I != E; ++I) {
686 if (I->isVirtual())
687 continue;
688
689 const CXXRecordDecl *BaseDecl =
690 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
691
692 // We've already laid out the primary base.
Anders Carlsson7f95cd12010-11-24 23:12:57 +0000693 if (BaseDecl == PrimaryBase && !Layout.isPrimaryBaseVirtual())
Anders Carlssonaf9e5af2010-05-18 05:12:20 +0000694 continue;
695
Eli Friedman3c840aa2011-12-12 23:13:20 +0000696 if (!LayoutNonVirtualBase(BaseDecl, Layout.getBaseClassOffset(BaseDecl)))
697 return false;
Anders Carlssond681a292009-12-16 17:27:20 +0000698 }
John McCall0153cd32011-11-08 04:01:03 +0000699
700 // Add a vb-table pointer if the layout insists.
701 if (Layout.getVBPtrOffset() != CharUnits::fromQuantity(-1)) {
702 CharUnits VBPtrOffset = Layout.getVBPtrOffset();
703 llvm::Type *Vbptr = llvm::Type::getInt32PtrTy(Types.getLLVMContext());
704 AppendPadding(VBPtrOffset, getTypeAlignment(Vbptr));
705 AppendField(VBPtrOffset, Vbptr);
706 }
Eli Friedman3c840aa2011-12-12 23:13:20 +0000707
708 return true;
Anders Carlssond681a292009-12-16 17:27:20 +0000709}
710
Argyrios Kyrtzidis648fcbe2010-12-10 00:11:00 +0000711bool
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000712CGRecordLayoutBuilder::ComputeNonVirtualBaseType(const CXXRecordDecl *RD) {
713 const ASTRecordLayout &Layout = Types.getContext().getASTRecordLayout(RD);
714
Ken Dyckbec02852011-02-08 02:02:47 +0000715 CharUnits NonVirtualSize = Layout.getNonVirtualSize();
716 CharUnits NonVirtualAlign = Layout.getNonVirtualAlign();
John McCall4d9f1422011-02-15 22:21:29 +0000717 CharUnits AlignedNonVirtualTypeSize =
718 NonVirtualSize.RoundUpToAlignment(NonVirtualAlign);
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000719
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000720 // First check if we can use the same fields as for the complete class.
John McCall4d9f1422011-02-15 22:21:29 +0000721 CharUnits RecordSize = Layout.getSize();
John McCall0217dfc22011-02-15 06:40:56 +0000722 if (AlignedNonVirtualTypeSize == RecordSize)
Argyrios Kyrtzidis648fcbe2010-12-10 00:11:00 +0000723 return true;
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000724
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000725 // Check if we need padding.
John McCall4d9f1422011-02-15 22:21:29 +0000726 CharUnits AlignedNextFieldOffset =
727 NextFieldOffset.RoundUpToAlignment(getAlignmentAsLLVMStruct());
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000728
John McCall0217dfc22011-02-15 06:40:56 +0000729 if (AlignedNextFieldOffset > AlignedNonVirtualTypeSize) {
730 assert(!Packed && "cannot layout even as packed struct");
Argyrios Kyrtzidis648fcbe2010-12-10 00:11:00 +0000731 return false; // Needs packing.
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000732 }
733
John McCall0217dfc22011-02-15 06:40:56 +0000734 bool needsPadding = (AlignedNonVirtualTypeSize != AlignedNextFieldOffset);
735 if (needsPadding) {
John McCall4d9f1422011-02-15 22:21:29 +0000736 CharUnits NumBytes = AlignedNonVirtualTypeSize - AlignedNextFieldOffset;
John McCall0217dfc22011-02-15 06:40:56 +0000737 FieldTypes.push_back(getByteArrayType(NumBytes));
738 }
Chris Lattnera5f58b02011-07-09 17:41:47 +0000739
Chris Lattner5ec04a52011-08-12 17:43:31 +0000740 BaseSubobjectType = llvm::StructType::create(Types.getLLVMContext(),
741 FieldTypes, "", Packed);
Chris Lattnera5f58b02011-07-09 17:41:47 +0000742 Types.addRecordTypeName(RD, BaseSubobjectType, ".base");
John McCall0217dfc22011-02-15 06:40:56 +0000743
Chris Lattnera5f58b02011-07-09 17:41:47 +0000744 // Pull the padding back off.
745 if (needsPadding)
John McCall0217dfc22011-02-15 06:40:56 +0000746 FieldTypes.pop_back();
John McCall0217dfc22011-02-15 06:40:56 +0000747
Argyrios Kyrtzidis648fcbe2010-12-10 00:11:00 +0000748 return true;
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000749}
750
Anders Carlsson307846f2009-07-23 03:17:50 +0000751bool CGRecordLayoutBuilder::LayoutFields(const RecordDecl *D) {
752 assert(!D->isUnion() && "Can't call LayoutFields on a union!");
John McCall4d9f1422011-02-15 22:21:29 +0000753 assert(!Alignment.isZero() && "Did not set alignment!");
Mike Stump11289f42009-09-09 15:08:12 +0000754
Anders Carlsson697f6592009-07-23 03:43:54 +0000755 const ASTRecordLayout &Layout = Types.getContext().getASTRecordLayout(D);
Mike Stump11289f42009-09-09 15:08:12 +0000756
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000757 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D);
758 if (RD)
Eli Friedman3c840aa2011-12-12 23:13:20 +0000759 if (!LayoutNonVirtualBases(RD, Layout))
760 return false;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000761
Anders Carlsson307846f2009-07-23 03:17:50 +0000762 unsigned FieldNo = 0;
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +0000763 const FieldDecl *LastFD = 0;
764
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000765 for (RecordDecl::field_iterator FI = D->field_begin(), FE = D->field_end();
766 FI != FE; ++FI, ++FieldNo) {
767 FieldDecl *FD = *FI;
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +0000768 if (IsMsStruct) {
769 // Zero-length bitfields following non-bitfield members are
770 // ignored:
Fariborz Jahanianfc0fe6e2011-05-03 20:21:04 +0000771 if (Types.getContext().ZeroBitfieldFollowsNonBitfield(FD, LastFD)) {
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +0000772 --FieldNo;
773 continue;
774 }
775 LastFD = FD;
776 }
Chandler Carruthff0e3a12012-12-06 11:14:44 +0000777
778 // If this field is a bitfield, layout all of the consecutive
779 // non-zero-length bitfields and the last zero-length bitfield; these will
780 // all share storage.
781 if (FD->isBitField()) {
782 // If all we have is a zero-width bitfield, skip it.
783 if (FD->getBitWidthValue(Types.getContext()) == 0)
784 continue;
785
786 // Layout this range of bitfields.
787 if (!LayoutBitfields(Layout, FieldNo, FI, FE)) {
788 assert(!Packed &&
789 "Could not layout bitfields even with a packed LLVM struct!");
790 return false;
791 }
792 assert(FI != FE && "Advanced past the last bitfield");
793 continue;
794 }
795
796 if (!LayoutField(FD, Layout.getFieldOffset(FieldNo))) {
Mike Stump11289f42009-09-09 15:08:12 +0000797 assert(!Packed &&
Anders Carlsson307846f2009-07-23 03:17:50 +0000798 "Could not layout fields even with a packed LLVM struct!");
799 return false;
800 }
801 }
802
Anders Carlsson1f95ee32010-11-25 01:59:35 +0000803 if (RD) {
Anders Carlssona459adb2010-11-28 19:18:44 +0000804 // We've laid out the non-virtual bases and the fields, now compute the
805 // non-virtual base field types.
Argyrios Kyrtzidis648fcbe2010-12-10 00:11:00 +0000806 if (!ComputeNonVirtualBaseType(RD)) {
807 assert(!Packed && "Could not layout even with a packed LLVM struct!");
808 return false;
809 }
Anders Carlsson1f95ee32010-11-25 01:59:35 +0000810
John McCall0153cd32011-11-08 04:01:03 +0000811 // Lay out the virtual bases. The MS ABI uses a different
812 // algorithm here due to the lack of primary virtual bases.
813 if (Types.getContext().getTargetInfo().getCXXABI() != CXXABI_Microsoft) {
814 RD->getIndirectPrimaryBases(IndirectPrimaryBases);
815 if (Layout.isPrimaryBaseVirtual())
816 IndirectPrimaryBases.insert(Layout.getPrimaryBase());
817
Eli Friedman3c840aa2011-12-12 23:13:20 +0000818 if (!LayoutVirtualBases(RD, Layout))
819 return false;
John McCall0153cd32011-11-08 04:01:03 +0000820 } else {
Eli Friedman3c840aa2011-12-12 23:13:20 +0000821 if (!MSLayoutVirtualBases(RD, Layout))
822 return false;
John McCall0153cd32011-11-08 04:01:03 +0000823 }
Anders Carlssona459adb2010-11-28 19:18:44 +0000824 }
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000825
Anders Carlsson307846f2009-07-23 03:17:50 +0000826 // Append tail padding if necessary.
Ken Dyck272b6fa2011-04-24 16:53:44 +0000827 AppendTailPadding(Layout.getSize());
Mike Stump11289f42009-09-09 15:08:12 +0000828
Anders Carlsson307846f2009-07-23 03:17:50 +0000829 return true;
830}
831
Ken Dyck272b6fa2011-04-24 16:53:44 +0000832void CGRecordLayoutBuilder::AppendTailPadding(CharUnits RecordSize) {
833 ResizeLastBaseFieldIfNecessary(RecordSize);
Mike Stump11289f42009-09-09 15:08:12 +0000834
Ken Dyck272b6fa2011-04-24 16:53:44 +0000835 assert(NextFieldOffset <= RecordSize && "Size mismatch!");
Mike Stump11289f42009-09-09 15:08:12 +0000836
John McCall4d9f1422011-02-15 22:21:29 +0000837 CharUnits AlignedNextFieldOffset =
838 NextFieldOffset.RoundUpToAlignment(getAlignmentAsLLVMStruct());
Anders Carlsson220bf4f2009-12-08 01:24:23 +0000839
Ken Dyck272b6fa2011-04-24 16:53:44 +0000840 if (AlignedNextFieldOffset == RecordSize) {
Anders Carlsson220bf4f2009-12-08 01:24:23 +0000841 // We don't need any padding.
842 return;
843 }
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000844
Ken Dyck272b6fa2011-04-24 16:53:44 +0000845 CharUnits NumPadBytes = RecordSize - NextFieldOffset;
Anders Carlssonb97a3ec2009-07-27 14:55:54 +0000846 AppendBytes(NumPadBytes);
847}
848
John McCall4d9f1422011-02-15 22:21:29 +0000849void CGRecordLayoutBuilder::AppendField(CharUnits fieldOffset,
Chris Lattnera5f58b02011-07-09 17:41:47 +0000850 llvm::Type *fieldType) {
John McCall4d9f1422011-02-15 22:21:29 +0000851 CharUnits fieldSize =
Micah Villmowdd31ca12012-10-08 16:25:52 +0000852 CharUnits::fromQuantity(Types.getDataLayout().getTypeAllocSize(fieldType));
Anders Carlsson6e853bf2009-07-24 02:45:50 +0000853
John McCall4d9f1422011-02-15 22:21:29 +0000854 FieldTypes.push_back(fieldType);
Anders Carlsson307846f2009-07-23 03:17:50 +0000855
John McCall4d9f1422011-02-15 22:21:29 +0000856 NextFieldOffset = fieldOffset + fieldSize;
Anders Carlsson307846f2009-07-23 03:17:50 +0000857}
858
John McCall4d9f1422011-02-15 22:21:29 +0000859void CGRecordLayoutBuilder::AppendPadding(CharUnits fieldOffset,
860 CharUnits fieldAlignment) {
861 assert(NextFieldOffset <= fieldOffset &&
Anders Carlsson307846f2009-07-23 03:17:50 +0000862 "Incorrect field layout!");
Mike Stump11289f42009-09-09 15:08:12 +0000863
John McCall0153cd32011-11-08 04:01:03 +0000864 // Do nothing if we're already at the right offset.
865 if (fieldOffset == NextFieldOffset) return;
Anders Carlsson307846f2009-07-23 03:17:50 +0000866
John McCall0153cd32011-11-08 04:01:03 +0000867 // If we're not emitting a packed LLVM type, try to avoid adding
868 // unnecessary padding fields.
869 if (!Packed) {
870 // Round up the field offset to the alignment of the field type.
871 CharUnits alignedNextFieldOffset =
872 NextFieldOffset.RoundUpToAlignment(fieldAlignment);
873 assert(alignedNextFieldOffset <= fieldOffset);
Anders Carlsson307846f2009-07-23 03:17:50 +0000874
John McCall0153cd32011-11-08 04:01:03 +0000875 // If that's the right offset, we're done.
876 if (alignedNextFieldOffset == fieldOffset) return;
Anders Carlsson307846f2009-07-23 03:17:50 +0000877 }
John McCall0153cd32011-11-08 04:01:03 +0000878
879 // Otherwise we need explicit padding.
880 CharUnits padding = fieldOffset - NextFieldOffset;
881 AppendBytes(padding);
Anders Carlsson307846f2009-07-23 03:17:50 +0000882}
883
Anders Carlssonfcaaa692011-04-17 21:56:13 +0000884bool CGRecordLayoutBuilder::ResizeLastBaseFieldIfNecessary(CharUnits offset) {
885 // Check if we have a base to resize.
886 if (!LastLaidOutBase.isValid())
887 return false;
888
889 // This offset does not overlap with the tail padding.
890 if (offset >= NextFieldOffset)
891 return false;
892
893 // Restore the field offset and append an i8 array instead.
894 FieldTypes.pop_back();
895 NextFieldOffset = LastLaidOutBase.Offset;
896 AppendBytes(LastLaidOutBase.NonVirtualSize);
897 LastLaidOutBase.invalidate();
898
899 return true;
900}
901
Chris Lattnera5f58b02011-07-09 17:41:47 +0000902llvm::Type *CGRecordLayoutBuilder::getByteArrayType(CharUnits numBytes) {
John McCall4d9f1422011-02-15 22:21:29 +0000903 assert(!numBytes.isZero() && "Empty byte arrays aren't allowed.");
Mike Stump11289f42009-09-09 15:08:12 +0000904
Chris Lattnera5f58b02011-07-09 17:41:47 +0000905 llvm::Type *Ty = llvm::Type::getInt8Ty(Types.getLLVMContext());
John McCall4d9f1422011-02-15 22:21:29 +0000906 if (numBytes > CharUnits::One())
907 Ty = llvm::ArrayType::get(Ty, numBytes.getQuantity());
Mike Stump11289f42009-09-09 15:08:12 +0000908
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000909 return Ty;
910}
911
John McCall4d9f1422011-02-15 22:21:29 +0000912void CGRecordLayoutBuilder::AppendBytes(CharUnits numBytes) {
913 if (numBytes.isZero())
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000914 return;
915
Anders Carlsson307846f2009-07-23 03:17:50 +0000916 // Append the padding field
John McCall4d9f1422011-02-15 22:21:29 +0000917 AppendField(NextFieldOffset, getByteArrayType(numBytes));
Anders Carlsson307846f2009-07-23 03:17:50 +0000918}
919
Chris Lattner2192fe52011-07-18 04:24:23 +0000920CharUnits CGRecordLayoutBuilder::getTypeAlignment(llvm::Type *Ty) const {
Anders Carlssond78fc892009-07-23 17:24:40 +0000921 if (Packed)
John McCall4d9f1422011-02-15 22:21:29 +0000922 return CharUnits::One();
Mike Stump11289f42009-09-09 15:08:12 +0000923
Micah Villmowdd31ca12012-10-08 16:25:52 +0000924 return CharUnits::fromQuantity(Types.getDataLayout().getABITypeAlignment(Ty));
Anders Carlsson307846f2009-07-23 03:17:50 +0000925}
926
John McCall4d9f1422011-02-15 22:21:29 +0000927CharUnits CGRecordLayoutBuilder::getAlignmentAsLLVMStruct() const {
Anders Carlssonacf877b2010-11-28 23:06:23 +0000928 if (Packed)
John McCall4d9f1422011-02-15 22:21:29 +0000929 return CharUnits::One();
Anders Carlssonacf877b2010-11-28 23:06:23 +0000930
John McCall4d9f1422011-02-15 22:21:29 +0000931 CharUnits maxAlignment = CharUnits::One();
Anders Carlssonacf877b2010-11-28 23:06:23 +0000932 for (size_t i = 0; i != FieldTypes.size(); ++i)
John McCall4d9f1422011-02-15 22:21:29 +0000933 maxAlignment = std::max(maxAlignment, getTypeAlignment(FieldTypes[i]));
Anders Carlssonacf877b2010-11-28 23:06:23 +0000934
John McCall4d9f1422011-02-15 22:21:29 +0000935 return maxAlignment;
Anders Carlssonacf877b2010-11-28 23:06:23 +0000936}
937
John McCall0217dfc22011-02-15 06:40:56 +0000938/// Merge in whether a field of the given type is zero-initializable.
John McCall614dbdc2010-08-22 21:01:12 +0000939void CGRecordLayoutBuilder::CheckZeroInitializable(QualType T) {
Anders Carlssond606de72009-08-23 01:25:01 +0000940 // This record already contains a member pointer.
John McCall0217dfc22011-02-15 06:40:56 +0000941 if (!IsZeroInitializableAsBase)
Anders Carlssond606de72009-08-23 01:25:01 +0000942 return;
Mike Stump11289f42009-09-09 15:08:12 +0000943
Anders Carlssond606de72009-08-23 01:25:01 +0000944 // Can only have member pointers if we're compiling C++.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000945 if (!Types.getContext().getLangOpts().CPlusPlus)
Anders Carlssond606de72009-08-23 01:25:01 +0000946 return;
Mike Stump11289f42009-09-09 15:08:12 +0000947
John McCall0217dfc22011-02-15 06:40:56 +0000948 const Type *elementType = T->getBaseElementTypeUnsafe();
Mike Stump11289f42009-09-09 15:08:12 +0000949
John McCall0217dfc22011-02-15 06:40:56 +0000950 if (const MemberPointerType *MPT = elementType->getAs<MemberPointerType>()) {
John McCall614dbdc2010-08-22 21:01:12 +0000951 if (!Types.getCXXABI().isZeroInitializable(MPT))
John McCall0217dfc22011-02-15 06:40:56 +0000952 IsZeroInitializable = IsZeroInitializableAsBase = false;
953 } else if (const RecordType *RT = elementType->getAs<RecordType>()) {
Anders Carlssone8bfe412010-02-02 05:17:25 +0000954 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
John McCall0217dfc22011-02-15 06:40:56 +0000955 const CGRecordLayout &Layout = Types.getCGRecordLayout(RD);
956 if (!Layout.isZeroInitializable())
957 IsZeroInitializable = IsZeroInitializableAsBase = false;
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000958 }
Anders Carlssond606de72009-08-23 01:25:01 +0000959}
960
Chris Lattnera5f58b02011-07-09 17:41:47 +0000961CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D,
962 llvm::StructType *Ty) {
Daniel Dunbar23ee4b72010-03-31 00:11:27 +0000963 CGRecordLayoutBuilder Builder(*this);
Mike Stump11289f42009-09-09 15:08:12 +0000964
Anders Carlsson307846f2009-07-23 03:17:50 +0000965 Builder.Layout(D);
Anders Carlssone1d5ca52009-07-24 15:20:52 +0000966
Chris Lattnera5f58b02011-07-09 17:41:47 +0000967 Ty->setBody(Builder.FieldTypes, Builder.Packed);
Mike Stump11289f42009-09-09 15:08:12 +0000968
John McCall0217dfc22011-02-15 06:40:56 +0000969 // If we're in C++, compute the base subobject type.
Chris Lattnera5f58b02011-07-09 17:41:47 +0000970 llvm::StructType *BaseTy = 0;
Eli Friedman09d272d2012-01-13 03:58:31 +0000971 if (isa<CXXRecordDecl>(D) && !D->isUnion()) {
John McCall0217dfc22011-02-15 06:40:56 +0000972 BaseTy = Builder.BaseSubobjectType;
973 if (!BaseTy) BaseTy = Ty;
Anders Carlssonc1351ca2010-11-09 05:25:47 +0000974 }
975
Daniel Dunbar034299e2010-03-31 01:09:11 +0000976 CGRecordLayout *RL =
John McCall0217dfc22011-02-15 06:40:56 +0000977 new CGRecordLayout(Ty, BaseTy, Builder.IsZeroInitializable,
978 Builder.IsZeroInitializableAsBase);
Daniel Dunbar034299e2010-03-31 01:09:11 +0000979
John McCall0217dfc22011-02-15 06:40:56 +0000980 RL->NonVirtualBases.swap(Builder.NonVirtualBases);
981 RL->CompleteObjectVirtualBases.swap(Builder.VirtualBases);
Anders Carlsson061ca522010-05-18 05:22:06 +0000982
Anders Carlsson307846f2009-07-23 03:17:50 +0000983 // Add all the field numbers.
John McCall0217dfc22011-02-15 06:40:56 +0000984 RL->FieldInfo.swap(Builder.Fields);
Anders Carlsson307846f2009-07-23 03:17:50 +0000985
986 // Add bitfield info.
John McCall0217dfc22011-02-15 06:40:56 +0000987 RL->BitFields.swap(Builder.BitFields);
Mike Stump11289f42009-09-09 15:08:12 +0000988
Daniel Dunbar2ea51832010-04-19 20:44:47 +0000989 // Dump the layout, if requested.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000990 if (getContext().getLangOpts().DumpRecordLayouts) {
Daniel Dunbarccabe482010-04-19 20:44:53 +0000991 llvm::errs() << "\n*** Dumping IRgen Record Layout\n";
Daniel Dunbarb935b932010-04-13 20:58:55 +0000992 llvm::errs() << "Record: ";
993 D->dump();
994 llvm::errs() << "\nLayout: ";
Daniel Dunbarb97bff92010-04-12 18:14:18 +0000995 RL->dump();
Daniel Dunbarb935b932010-04-13 20:58:55 +0000996 }
Daniel Dunbarb97bff92010-04-12 18:14:18 +0000997
Daniel Dunbar488f55c2010-04-22 02:35:46 +0000998#ifndef NDEBUG
Daniel Dunbar2ea51832010-04-19 20:44:47 +0000999 // Verify that the computed LLVM struct size matches the AST layout size.
Anders Carlssonc1351ca2010-11-09 05:25:47 +00001000 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(D);
1001
Ken Dyckb0fcc592011-02-11 01:54:29 +00001002 uint64_t TypeSizeInBits = getContext().toBits(Layout.getSize());
Micah Villmowdd31ca12012-10-08 16:25:52 +00001003 assert(TypeSizeInBits == getDataLayout().getTypeAllocSizeInBits(Ty) &&
Daniel Dunbar2ea51832010-04-19 20:44:47 +00001004 "Type size mismatch!");
1005
Anders Carlssonc1351ca2010-11-09 05:25:47 +00001006 if (BaseTy) {
Ken Dyckbec02852011-02-08 02:02:47 +00001007 CharUnits NonVirtualSize = Layout.getNonVirtualSize();
1008 CharUnits NonVirtualAlign = Layout.getNonVirtualAlign();
1009 CharUnits AlignedNonVirtualTypeSize =
1010 NonVirtualSize.RoundUpToAlignment(NonVirtualAlign);
1011
1012 uint64_t AlignedNonVirtualTypeSizeInBits =
Ken Dyckb0fcc592011-02-11 01:54:29 +00001013 getContext().toBits(AlignedNonVirtualTypeSize);
Anders Carlssonc1351ca2010-11-09 05:25:47 +00001014
1015 assert(AlignedNonVirtualTypeSizeInBits ==
Micah Villmowdd31ca12012-10-08 16:25:52 +00001016 getDataLayout().getTypeAllocSizeInBits(BaseTy) &&
Anders Carlssonc1351ca2010-11-09 05:25:47 +00001017 "Type size mismatch!");
1018 }
1019
Daniel Dunbar2ba67442010-04-21 19:10:49 +00001020 // Verify that the LLVM and AST field offsets agree.
Chris Lattner2192fe52011-07-18 04:24:23 +00001021 llvm::StructType *ST =
Daniel Dunbar2ba67442010-04-21 19:10:49 +00001022 dyn_cast<llvm::StructType>(RL->getLLVMType());
Micah Villmowdd31ca12012-10-08 16:25:52 +00001023 const llvm::StructLayout *SL = getDataLayout().getStructLayout(ST);
Daniel Dunbar2ba67442010-04-21 19:10:49 +00001024
1025 const ASTRecordLayout &AST_RL = getContext().getASTRecordLayout(D);
1026 RecordDecl::field_iterator it = D->field_begin();
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +00001027 const FieldDecl *LastFD = 0;
Eli Friedman9ee2d0472012-10-12 23:29:20 +00001028 bool IsMsStruct = D->isMsStruct(getContext());
Daniel Dunbar2ba67442010-04-21 19:10:49 +00001029 for (unsigned i = 0, e = AST_RL.getFieldCount(); i != e; ++i, ++it) {
David Blaikie40ed2972012-06-06 20:45:41 +00001030 const FieldDecl *FD = *it;
Daniel Dunbar488f55c2010-04-22 02:35:46 +00001031
1032 // For non-bit-fields, just check that the LLVM struct offset matches the
1033 // AST offset.
1034 if (!FD->isBitField()) {
Daniel Dunbar2ba67442010-04-21 19:10:49 +00001035 unsigned FieldNo = RL->getLLVMFieldNo(FD);
1036 assert(AST_RL.getFieldOffset(i) == SL->getElementOffsetInBits(FieldNo) &&
1037 "Invalid field offset!");
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +00001038 LastFD = FD;
Daniel Dunbar488f55c2010-04-22 02:35:46 +00001039 continue;
1040 }
1041
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +00001042 if (IsMsStruct) {
1043 // Zero-length bitfields following non-bitfield members are
1044 // ignored:
Fariborz Jahanianfc0fe6e2011-05-03 20:21:04 +00001045 if (getContext().ZeroBitfieldFollowsNonBitfield(FD, LastFD)) {
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +00001046 --i;
1047 continue;
1048 }
1049 LastFD = FD;
1050 }
1051
Daniel Dunbar488f55c2010-04-22 02:35:46 +00001052 // Ignore unnamed bit-fields.
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +00001053 if (!FD->getDeclName()) {
1054 LastFD = FD;
Daniel Dunbar488f55c2010-04-22 02:35:46 +00001055 continue;
Fariborz Jahanianbcb23a12011-04-26 23:52:16 +00001056 }
Daniel Dunbar488f55c2010-04-22 02:35:46 +00001057
Chandler Carruthff0e3a12012-12-06 11:14:44 +00001058 // Don't inspect zero-length bitfields.
1059 if (FD->getBitWidthValue(getContext()) == 0)
1060 continue;
1061
1062 unsigned FieldNo = RL->getLLVMFieldNo(FD);
1063 const CGBitFieldInfo &Info = RL->getBitFieldInfo(FD);
1064 llvm::Type *ElementTy = ST->getTypeAtIndex(FieldNo);
1065 // Unions have overlapping elements dictating their layout, but for
1066 // non-unions we can verify that this section of the layout is the exact
1067 // expected size. For unions we verify that the start is zero and the size
1068 // is in-bounds.
1069 if (D->isUnion()) {
1070 assert(Info.Offset == 0 && "Union bitfield with a non-zero offset");
1071 assert(Info.StorageSize <= SL->getSizeInBits() &&
1072 "Union not large enough for bitfield storage");
1073 } else {
1074 assert(Info.StorageSize ==
1075 getDataLayout().getTypeAllocSizeInBits(ElementTy) &&
1076 "Storage size does not match the element type size");
Daniel Dunbar2ba67442010-04-21 19:10:49 +00001077 }
Chandler Carruthff0e3a12012-12-06 11:14:44 +00001078 assert(Info.Size > 0 && "Empty bitfield!");
1079 assert(Info.Offset + Info.Size <= Info.StorageSize &&
1080 "Bitfield outside of its allocated storage");
Daniel Dunbar2ba67442010-04-21 19:10:49 +00001081 }
1082#endif
Daniel Dunbar2ea51832010-04-19 20:44:47 +00001083
Daniel Dunbar034299e2010-03-31 01:09:11 +00001084 return RL;
Anders Carlsson307846f2009-07-23 03:17:50 +00001085}
Daniel Dunbarb97bff92010-04-12 18:14:18 +00001086
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001087void CGRecordLayout::print(raw_ostream &OS) const {
Daniel Dunbarb97bff92010-04-12 18:14:18 +00001088 OS << "<CGRecordLayout\n";
John McCall0217dfc22011-02-15 06:40:56 +00001089 OS << " LLVMType:" << *CompleteObjectType << "\n";
1090 if (BaseSubobjectType)
1091 OS << " NonVirtualBaseLLVMType:" << *BaseSubobjectType << "\n";
John McCall614dbdc2010-08-22 21:01:12 +00001092 OS << " IsZeroInitializable:" << IsZeroInitializable << "\n";
Daniel Dunbarb97bff92010-04-12 18:14:18 +00001093 OS << " BitFields:[\n";
Daniel Dunbarb6f4b052010-04-22 02:35:36 +00001094
1095 // Print bit-field infos in declaration order.
1096 std::vector<std::pair<unsigned, const CGBitFieldInfo*> > BFIs;
Daniel Dunbarb97bff92010-04-12 18:14:18 +00001097 for (llvm::DenseMap<const FieldDecl*, CGBitFieldInfo>::const_iterator
1098 it = BitFields.begin(), ie = BitFields.end();
1099 it != ie; ++it) {
Daniel Dunbarb6f4b052010-04-22 02:35:36 +00001100 const RecordDecl *RD = it->first->getParent();
1101 unsigned Index = 0;
1102 for (RecordDecl::field_iterator
David Blaikie40ed2972012-06-06 20:45:41 +00001103 it2 = RD->field_begin(); *it2 != it->first; ++it2)
Daniel Dunbarb6f4b052010-04-22 02:35:36 +00001104 ++Index;
1105 BFIs.push_back(std::make_pair(Index, &it->second));
1106 }
1107 llvm::array_pod_sort(BFIs.begin(), BFIs.end());
1108 for (unsigned i = 0, e = BFIs.size(); i != e; ++i) {
Daniel Dunbarb935b932010-04-13 20:58:55 +00001109 OS.indent(4);
Daniel Dunbarb6f4b052010-04-22 02:35:36 +00001110 BFIs[i].second->print(OS);
Daniel Dunbarb97bff92010-04-12 18:14:18 +00001111 OS << "\n";
1112 }
Daniel Dunbarb6f4b052010-04-22 02:35:36 +00001113
Daniel Dunbarb97bff92010-04-12 18:14:18 +00001114 OS << "]>\n";
1115}
1116
1117void CGRecordLayout::dump() const {
1118 print(llvm::errs());
1119}
1120
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001121void CGBitFieldInfo::print(raw_ostream &OS) const {
Chandler Carruthff0e3a12012-12-06 11:14:44 +00001122 OS << "<CGBitFieldInfo"
1123 << " Offset:" << Offset
1124 << " Size:" << Size
1125 << " IsSigned:" << IsSigned
1126 << " StorageSize:" << StorageSize
1127 << " StorageAlignment:" << StorageAlignment << ">";
Daniel Dunbarb97bff92010-04-12 18:14:18 +00001128}
1129
1130void CGBitFieldInfo::dump() const {
1131 print(llvm::errs());
1132}