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