3819 lines · cpp
1//=== RecordLayoutBuilder.cpp - Helper class for building record layouts ---==//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "clang/AST/ASTContext.h"10#include "clang/AST/ASTDiagnostic.h"11#include "clang/AST/Attr.h"12#include "clang/AST/CXXInheritance.h"13#include "clang/AST/Decl.h"14#include "clang/AST/DeclCXX.h"15#include "clang/AST/DeclObjC.h"16#include "clang/AST/Expr.h"17#include "clang/AST/RecordLayout.h"18#include "clang/AST/VTableBuilder.h"19#include "clang/Basic/TargetInfo.h"20#include "llvm/Support/Format.h"21#include "llvm/Support/MathExtras.h"22 23using namespace clang;24 25namespace {26 27/// BaseSubobjectInfo - Represents a single base subobject in a complete class.28/// For a class hierarchy like29///30/// class A { };31/// class B : A { };32/// class C : A, B { };33///34/// The BaseSubobjectInfo graph for C will have three BaseSubobjectInfo35/// instances, one for B and two for A.36///37/// If a base is virtual, it will only have one BaseSubobjectInfo allocated.38struct BaseSubobjectInfo {39 /// Class - The class for this base info.40 const CXXRecordDecl *Class;41 42 /// IsVirtual - Whether the BaseInfo represents a virtual base or not.43 bool IsVirtual;44 45 /// Bases - Information about the base subobjects.46 SmallVector<BaseSubobjectInfo*, 4> Bases;47 48 /// PrimaryVirtualBaseInfo - Holds the base info for the primary virtual base49 /// of this base info (if one exists).50 BaseSubobjectInfo *PrimaryVirtualBaseInfo;51 52 // FIXME: Document.53 const BaseSubobjectInfo *Derived;54};55 56/// Externally provided layout. Typically used when the AST source, such57/// as DWARF, lacks all the information that was available at compile time, such58/// as alignment attributes on fields and pragmas in effect.59struct ExternalLayout {60 ExternalLayout() = default;61 62 /// Overall record size in bits.63 uint64_t Size = 0;64 65 /// Overall record alignment in bits.66 uint64_t Align = 0;67 68 /// Record field offsets in bits.69 llvm::DenseMap<const FieldDecl *, uint64_t> FieldOffsets;70 71 /// Direct, non-virtual base offsets.72 llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsets;73 74 /// Virtual base offsets.75 llvm::DenseMap<const CXXRecordDecl *, CharUnits> VirtualBaseOffsets;76 77 /// Get the offset of the given field. The external source must provide78 /// entries for all fields in the record.79 uint64_t getExternalFieldOffset(const FieldDecl *FD) {80 assert(FieldOffsets.count(FD) &&81 "Field does not have an external offset");82 return FieldOffsets[FD];83 }84 85 bool getExternalNVBaseOffset(const CXXRecordDecl *RD, CharUnits &BaseOffset) {86 auto Known = BaseOffsets.find(RD);87 if (Known == BaseOffsets.end())88 return false;89 BaseOffset = Known->second;90 return true;91 }92 93 bool getExternalVBaseOffset(const CXXRecordDecl *RD, CharUnits &BaseOffset) {94 auto Known = VirtualBaseOffsets.find(RD);95 if (Known == VirtualBaseOffsets.end())96 return false;97 BaseOffset = Known->second;98 return true;99 }100};101 102/// EmptySubobjectMap - Keeps track of which empty subobjects exist at different103/// offsets while laying out a C++ class.104class EmptySubobjectMap {105 const ASTContext &Context;106 uint64_t CharWidth;107 108 /// Class - The class whose empty entries we're keeping track of.109 const CXXRecordDecl *Class;110 111 /// EmptyClassOffsets - A map from offsets to empty record decls.112 typedef llvm::TinyPtrVector<const CXXRecordDecl *> ClassVectorTy;113 typedef llvm::DenseMap<CharUnits, ClassVectorTy> EmptyClassOffsetsMapTy;114 EmptyClassOffsetsMapTy EmptyClassOffsets;115 116 /// MaxEmptyClassOffset - The highest offset known to contain an empty117 /// base subobject.118 CharUnits MaxEmptyClassOffset;119 120 /// ComputeEmptySubobjectSizes - Compute the size of the largest base or121 /// member subobject that is empty.122 void ComputeEmptySubobjectSizes();123 124 void AddSubobjectAtOffset(const CXXRecordDecl *RD, CharUnits Offset);125 126 void UpdateEmptyBaseSubobjects(const BaseSubobjectInfo *Info,127 CharUnits Offset, bool PlacingEmptyBase);128 129 void UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,130 const CXXRecordDecl *Class, CharUnits Offset,131 bool PlacingOverlappingField);132 void UpdateEmptyFieldSubobjects(const FieldDecl *FD, CharUnits Offset,133 bool PlacingOverlappingField);134 135 /// AnyEmptySubobjectsBeyondOffset - Returns whether there are any empty136 /// subobjects beyond the given offset.137 bool AnyEmptySubobjectsBeyondOffset(CharUnits Offset) const {138 return Offset <= MaxEmptyClassOffset;139 }140 141 CharUnits getFieldOffset(const ASTRecordLayout &Layout,142 const FieldDecl *Field) const {143 uint64_t FieldOffset = Layout.getFieldOffset(Field->getFieldIndex());144 assert(FieldOffset % CharWidth == 0 &&145 "Field offset not at char boundary!");146 147 return Context.toCharUnitsFromBits(FieldOffset);148 }149 150protected:151 bool CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,152 CharUnits Offset) const;153 154 bool CanPlaceBaseSubobjectAtOffset(const BaseSubobjectInfo *Info,155 CharUnits Offset);156 157 bool CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,158 const CXXRecordDecl *Class,159 CharUnits Offset) const;160 bool CanPlaceFieldSubobjectAtOffset(const FieldDecl *FD,161 CharUnits Offset) const;162 163public:164 /// This holds the size of the largest empty subobject (either a base165 /// or a member). Will be zero if the record being built doesn't contain166 /// any empty classes.167 CharUnits SizeOfLargestEmptySubobject;168 169 EmptySubobjectMap(const ASTContext &Context, const CXXRecordDecl *Class)170 : Context(Context), CharWidth(Context.getCharWidth()), Class(Class) {171 ComputeEmptySubobjectSizes();172 }173 174 /// CanPlaceBaseAtOffset - Return whether the given base class can be placed175 /// at the given offset.176 /// Returns false if placing the record will result in two components177 /// (direct or indirect) of the same type having the same offset.178 bool CanPlaceBaseAtOffset(const BaseSubobjectInfo *Info,179 CharUnits Offset);180 181 /// CanPlaceFieldAtOffset - Return whether a field can be placed at the given182 /// offset.183 bool CanPlaceFieldAtOffset(const FieldDecl *FD, CharUnits Offset);184};185 186void EmptySubobjectMap::ComputeEmptySubobjectSizes() {187 // Check the bases.188 for (const CXXBaseSpecifier &Base : Class->bases()) {189 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();190 assert(BaseDecl != Class && "Class cannot inherit from itself.");191 192 CharUnits EmptySize;193 const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl);194 if (BaseDecl->isEmpty()) {195 // If the class decl is empty, get its size.196 EmptySize = Layout.getSize();197 } else {198 // Otherwise, we get the largest empty subobject for the decl.199 EmptySize = Layout.getSizeOfLargestEmptySubobject();200 }201 202 if (EmptySize > SizeOfLargestEmptySubobject)203 SizeOfLargestEmptySubobject = EmptySize;204 }205 206 // Check the fields.207 for (const FieldDecl *FD : Class->fields()) {208 // We only care about records.209 const auto *MemberDecl =210 Context.getBaseElementType(FD->getType())->getAsCXXRecordDecl();211 if (!MemberDecl)212 continue;213 214 CharUnits EmptySize;215 const ASTRecordLayout &Layout = Context.getASTRecordLayout(MemberDecl);216 if (MemberDecl->isEmpty()) {217 // If the class decl is empty, get its size.218 EmptySize = Layout.getSize();219 } else {220 // Otherwise, we get the largest empty subobject for the decl.221 EmptySize = Layout.getSizeOfLargestEmptySubobject();222 }223 224 if (EmptySize > SizeOfLargestEmptySubobject)225 SizeOfLargestEmptySubobject = EmptySize;226 }227}228 229bool230EmptySubobjectMap::CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,231 CharUnits Offset) const {232 // We only need to check empty bases.233 if (!RD->isEmpty())234 return true;235 236 EmptyClassOffsetsMapTy::const_iterator I = EmptyClassOffsets.find(Offset);237 if (I == EmptyClassOffsets.end())238 return true;239 240 const ClassVectorTy &Classes = I->second;241 if (!llvm::is_contained(Classes, RD))242 return true;243 244 // There is already an empty class of the same type at this offset.245 return false;246}247 248void EmptySubobjectMap::AddSubobjectAtOffset(const CXXRecordDecl *RD,249 CharUnits Offset) {250 // We only care about empty bases.251 if (!RD->isEmpty())252 return;253 254 // If we have empty structures inside a union, we can assign both255 // the same offset. Just avoid pushing them twice in the list.256 ClassVectorTy &Classes = EmptyClassOffsets[Offset];257 if (llvm::is_contained(Classes, RD))258 return;259 260 Classes.push_back(RD);261 262 // Update the empty class offset.263 if (Offset > MaxEmptyClassOffset)264 MaxEmptyClassOffset = Offset;265}266 267bool268EmptySubobjectMap::CanPlaceBaseSubobjectAtOffset(const BaseSubobjectInfo *Info,269 CharUnits Offset) {270 // We don't have to keep looking past the maximum offset that's known to271 // contain an empty class.272 if (!AnyEmptySubobjectsBeyondOffset(Offset))273 return true;274 275 if (!CanPlaceSubobjectAtOffset(Info->Class, Offset))276 return false;277 278 // Traverse all non-virtual bases.279 const ASTRecordLayout &Layout = Context.getASTRecordLayout(Info->Class);280 for (const BaseSubobjectInfo *Base : Info->Bases) {281 if (Base->IsVirtual)282 continue;283 284 CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(Base->Class);285 286 if (!CanPlaceBaseSubobjectAtOffset(Base, BaseOffset))287 return false;288 }289 290 if (Info->PrimaryVirtualBaseInfo) {291 BaseSubobjectInfo *PrimaryVirtualBaseInfo = Info->PrimaryVirtualBaseInfo;292 293 if (Info == PrimaryVirtualBaseInfo->Derived) {294 if (!CanPlaceBaseSubobjectAtOffset(PrimaryVirtualBaseInfo, Offset))295 return false;296 }297 }298 299 // Traverse all member variables.300 for (const FieldDecl *Field : Info->Class->fields()) {301 if (Field->isBitField())302 continue;303 304 CharUnits FieldOffset = Offset + getFieldOffset(Layout, Field);305 if (!CanPlaceFieldSubobjectAtOffset(Field, FieldOffset))306 return false;307 }308 309 return true;310}311 312void EmptySubobjectMap::UpdateEmptyBaseSubobjects(const BaseSubobjectInfo *Info,313 CharUnits Offset,314 bool PlacingEmptyBase) {315 if (!PlacingEmptyBase && Offset >= SizeOfLargestEmptySubobject) {316 // We know that the only empty subobjects that can conflict with empty317 // subobject of non-empty bases, are empty bases that can be placed at318 // offset zero. Because of this, we only need to keep track of empty base319 // subobjects with offsets less than the size of the largest empty320 // subobject for our class.321 return;322 }323 324 AddSubobjectAtOffset(Info->Class, Offset);325 326 // Traverse all non-virtual bases.327 const ASTRecordLayout &Layout = Context.getASTRecordLayout(Info->Class);328 for (const BaseSubobjectInfo *Base : Info->Bases) {329 if (Base->IsVirtual)330 continue;331 332 CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(Base->Class);333 UpdateEmptyBaseSubobjects(Base, BaseOffset, PlacingEmptyBase);334 }335 336 if (Info->PrimaryVirtualBaseInfo) {337 BaseSubobjectInfo *PrimaryVirtualBaseInfo = Info->PrimaryVirtualBaseInfo;338 339 if (Info == PrimaryVirtualBaseInfo->Derived)340 UpdateEmptyBaseSubobjects(PrimaryVirtualBaseInfo, Offset,341 PlacingEmptyBase);342 }343 344 // Traverse all member variables.345 for (const FieldDecl *Field : Info->Class->fields()) {346 if (Field->isBitField())347 continue;348 349 CharUnits FieldOffset = Offset + getFieldOffset(Layout, Field);350 UpdateEmptyFieldSubobjects(Field, FieldOffset, PlacingEmptyBase);351 }352}353 354bool EmptySubobjectMap::CanPlaceBaseAtOffset(const BaseSubobjectInfo *Info,355 CharUnits Offset) {356 // If we know this class doesn't have any empty subobjects we don't need to357 // bother checking.358 if (SizeOfLargestEmptySubobject.isZero())359 return true;360 361 if (!CanPlaceBaseSubobjectAtOffset(Info, Offset))362 return false;363 364 // We are able to place the base at this offset. Make sure to update the365 // empty base subobject map.366 UpdateEmptyBaseSubobjects(Info, Offset, Info->Class->isEmpty());367 return true;368}369 370bool371EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,372 const CXXRecordDecl *Class,373 CharUnits Offset) const {374 // We don't have to keep looking past the maximum offset that's known to375 // contain an empty class.376 if (!AnyEmptySubobjectsBeyondOffset(Offset))377 return true;378 379 if (!CanPlaceSubobjectAtOffset(RD, Offset))380 return false;381 382 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);383 384 // Traverse all non-virtual bases.385 for (const CXXBaseSpecifier &Base : RD->bases()) {386 if (Base.isVirtual())387 continue;388 389 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();390 391 CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(BaseDecl);392 if (!CanPlaceFieldSubobjectAtOffset(BaseDecl, Class, BaseOffset))393 return false;394 }395 396 if (RD == Class) {397 // This is the most derived class, traverse virtual bases as well.398 for (const CXXBaseSpecifier &Base : RD->vbases()) {399 const CXXRecordDecl *VBaseDecl = Base.getType()->getAsCXXRecordDecl();400 401 CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBaseDecl);402 if (!CanPlaceFieldSubobjectAtOffset(VBaseDecl, Class, VBaseOffset))403 return false;404 }405 }406 407 // Traverse all member variables.408 for (const FieldDecl *Field : RD->fields()) {409 if (Field->isBitField())410 continue;411 412 CharUnits FieldOffset = Offset + getFieldOffset(Layout, Field);413 if (!CanPlaceFieldSubobjectAtOffset(Field, FieldOffset))414 return false;415 }416 417 return true;418}419 420bool421EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const FieldDecl *FD,422 CharUnits Offset) const {423 // We don't have to keep looking past the maximum offset that's known to424 // contain an empty class.425 if (!AnyEmptySubobjectsBeyondOffset(Offset))426 return true;427 428 QualType T = FD->getType();429 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())430 return CanPlaceFieldSubobjectAtOffset(RD, RD, Offset);431 432 // If we have an array type we need to look at every element.433 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(T)) {434 QualType ElemTy = Context.getBaseElementType(AT);435 const auto *RD = ElemTy->getAsCXXRecordDecl();436 if (!RD)437 return true;438 439 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);440 441 uint64_t NumElements = Context.getConstantArrayElementCount(AT);442 CharUnits ElementOffset = Offset;443 for (uint64_t I = 0; I != NumElements; ++I) {444 // We don't have to keep looking past the maximum offset that's known to445 // contain an empty class.446 if (!AnyEmptySubobjectsBeyondOffset(ElementOffset))447 return true;448 449 if (!CanPlaceFieldSubobjectAtOffset(RD, RD, ElementOffset))450 return false;451 452 ElementOffset += Layout.getSize();453 }454 }455 456 return true;457}458 459bool EmptySubobjectMap::CanPlaceFieldAtOffset(const FieldDecl *FD,460 CharUnits Offset) {461 if (!CanPlaceFieldSubobjectAtOffset(FD, Offset))462 return false;463 464 // We are able to place the member variable at this offset.465 // Make sure to update the empty field subobject map.466 UpdateEmptyFieldSubobjects(FD, Offset, FD->hasAttr<NoUniqueAddressAttr>());467 return true;468}469 470void EmptySubobjectMap::UpdateEmptyFieldSubobjects(471 const CXXRecordDecl *RD, const CXXRecordDecl *Class, CharUnits Offset,472 bool PlacingOverlappingField) {473 // We know that the only empty subobjects that can conflict with empty474 // field subobjects are subobjects of empty bases and potentially-overlapping475 // fields that can be placed at offset zero. Because of this, we only need to476 // keep track of empty field subobjects with offsets less than the size of477 // the largest empty subobject for our class.478 //479 // (Proof: we will only consider placing a subobject at offset zero or at480 // >= the current dsize. The only cases where the earlier subobject can be481 // placed beyond the end of dsize is if it's an empty base or a482 // potentially-overlapping field.)483 if (!PlacingOverlappingField && Offset >= SizeOfLargestEmptySubobject)484 return;485 486 AddSubobjectAtOffset(RD, Offset);487 488 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);489 490 // Traverse all non-virtual bases.491 for (const CXXBaseSpecifier &Base : RD->bases()) {492 if (Base.isVirtual())493 continue;494 495 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();496 497 CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(BaseDecl);498 UpdateEmptyFieldSubobjects(BaseDecl, Class, BaseOffset,499 PlacingOverlappingField);500 }501 502 if (RD == Class) {503 // This is the most derived class, traverse virtual bases as well.504 for (const CXXBaseSpecifier &Base : RD->vbases()) {505 const CXXRecordDecl *VBaseDecl = Base.getType()->getAsCXXRecordDecl();506 507 CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBaseDecl);508 UpdateEmptyFieldSubobjects(VBaseDecl, Class, VBaseOffset,509 PlacingOverlappingField);510 }511 }512 513 // Traverse all member variables.514 for (const FieldDecl *Field : RD->fields()) {515 if (Field->isBitField())516 continue;517 518 CharUnits FieldOffset = Offset + getFieldOffset(Layout, Field);519 UpdateEmptyFieldSubobjects(Field, FieldOffset, PlacingOverlappingField);520 }521}522 523void EmptySubobjectMap::UpdateEmptyFieldSubobjects(524 const FieldDecl *FD, CharUnits Offset, bool PlacingOverlappingField) {525 QualType T = FD->getType();526 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {527 UpdateEmptyFieldSubobjects(RD, RD, Offset, PlacingOverlappingField);528 return;529 }530 531 // If we have an array type we need to update every element.532 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(T)) {533 QualType ElemTy = Context.getBaseElementType(AT);534 const auto *RD = ElemTy->getAsCXXRecordDecl();535 if (!RD)536 return;537 538 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);539 540 uint64_t NumElements = Context.getConstantArrayElementCount(AT);541 CharUnits ElementOffset = Offset;542 543 for (uint64_t I = 0; I != NumElements; ++I) {544 // We know that the only empty subobjects that can conflict with empty545 // field subobjects are subobjects of empty bases that can be placed at546 // offset zero. Because of this, we only need to keep track of empty field547 // subobjects with offsets less than the size of the largest empty548 // subobject for our class.549 if (!PlacingOverlappingField &&550 ElementOffset >= SizeOfLargestEmptySubobject)551 return;552 553 UpdateEmptyFieldSubobjects(RD, RD, ElementOffset,554 PlacingOverlappingField);555 ElementOffset += Layout.getSize();556 }557 }558}559 560typedef llvm::SmallPtrSet<const CXXRecordDecl*, 4> ClassSetTy;561 562class ItaniumRecordLayoutBuilder {563protected:564 // FIXME: Remove this and make the appropriate fields public.565 friend class clang::ASTContext;566 567 const ASTContext &Context;568 569 EmptySubobjectMap *EmptySubobjects;570 571 /// Size - The current size of the record layout.572 uint64_t Size;573 574 /// Alignment - The current alignment of the record layout.575 CharUnits Alignment;576 577 /// PreferredAlignment - The preferred alignment of the record layout.578 CharUnits PreferredAlignment;579 580 /// The alignment if attribute packed is not used.581 CharUnits UnpackedAlignment;582 583 /// \brief The maximum of the alignments of top-level members.584 CharUnits UnadjustedAlignment;585 586 SmallVector<uint64_t, 16> FieldOffsets;587 588 /// Whether the external AST source has provided a layout for this589 /// record.590 LLVM_PREFERRED_TYPE(bool)591 unsigned UseExternalLayout : 1;592 593 /// Whether we need to infer alignment, even when we have an594 /// externally-provided layout.595 LLVM_PREFERRED_TYPE(bool)596 unsigned InferAlignment : 1;597 598 /// Packed - Whether the record is packed or not.599 LLVM_PREFERRED_TYPE(bool)600 unsigned Packed : 1;601 602 LLVM_PREFERRED_TYPE(bool)603 unsigned IsUnion : 1;604 605 LLVM_PREFERRED_TYPE(bool)606 unsigned IsMac68kAlign : 1;607 608 LLVM_PREFERRED_TYPE(bool)609 unsigned IsNaturalAlign : 1;610 611 LLVM_PREFERRED_TYPE(bool)612 unsigned IsMsStruct : 1;613 614 /// UnfilledBitsInLastUnit - If the last field laid out was a bitfield,615 /// this contains the number of bits in the last unit that can be used for616 /// an adjacent bitfield if necessary. The unit in question is usually617 /// a byte, but larger units are used if IsMsStruct.618 unsigned char UnfilledBitsInLastUnit;619 620 /// LastBitfieldStorageUnitSize - If IsMsStruct, represents the size of the621 /// storage unit of the previous field if it was a bitfield.622 unsigned char LastBitfieldStorageUnitSize;623 624 /// MaxFieldAlignment - The maximum allowed field alignment. This is set by625 /// #pragma pack.626 CharUnits MaxFieldAlignment;627 628 /// DataSize - The data size of the record being laid out.629 uint64_t DataSize;630 631 CharUnits NonVirtualSize;632 CharUnits NonVirtualAlignment;633 CharUnits PreferredNVAlignment;634 635 /// If we've laid out a field but not included its tail padding in Size yet,636 /// this is the size up to the end of that field.637 CharUnits PaddedFieldSize;638 639 /// PrimaryBase - the primary base class (if one exists) of the class640 /// we're laying out.641 const CXXRecordDecl *PrimaryBase;642 643 /// PrimaryBaseIsVirtual - Whether the primary base of the class we're laying644 /// out is virtual.645 bool PrimaryBaseIsVirtual;646 647 /// HasOwnVFPtr - Whether the class provides its own vtable/vftbl648 /// pointer, as opposed to inheriting one from a primary base class.649 bool HasOwnVFPtr;650 651 /// the flag of field offset changing due to packed attribute.652 bool HasPackedField;653 654 /// HandledFirstNonOverlappingEmptyField - An auxiliary field used for AIX.655 /// When there are OverlappingEmptyFields existing in the aggregate, the656 /// flag shows if the following first non-empty or empty-but-non-overlapping657 /// field has been handled, if any.658 bool HandledFirstNonOverlappingEmptyField;659 660 typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;661 662 /// Bases - base classes and their offsets in the record.663 BaseOffsetsMapTy Bases;664 665 // VBases - virtual base classes and their offsets in the record.666 ASTRecordLayout::VBaseOffsetsMapTy VBases;667 668 /// IndirectPrimaryBases - Virtual base classes, direct or indirect, that are669 /// primary base classes for some other direct or indirect base class.670 CXXIndirectPrimaryBaseSet IndirectPrimaryBases;671 672 /// FirstNearlyEmptyVBase - The first nearly empty virtual base class in673 /// inheritance graph order. Used for determining the primary base class.674 const CXXRecordDecl *FirstNearlyEmptyVBase;675 676 /// VisitedVirtualBases - A set of all the visited virtual bases, used to677 /// avoid visiting virtual bases more than once.678 llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBases;679 680 /// Valid if UseExternalLayout is true.681 ExternalLayout External;682 683 ItaniumRecordLayoutBuilder(const ASTContext &Context,684 EmptySubobjectMap *EmptySubobjects)685 : Context(Context), EmptySubobjects(EmptySubobjects), Size(0),686 Alignment(CharUnits::One()), PreferredAlignment(CharUnits::One()),687 UnpackedAlignment(CharUnits::One()),688 UnadjustedAlignment(CharUnits::One()), UseExternalLayout(false),689 InferAlignment(false), Packed(false), IsUnion(false),690 IsMac68kAlign(false),691 IsNaturalAlign(!Context.getTargetInfo().getTriple().isOSAIX()),692 IsMsStruct(false), UnfilledBitsInLastUnit(0),693 LastBitfieldStorageUnitSize(0), MaxFieldAlignment(CharUnits::Zero()),694 DataSize(0), NonVirtualSize(CharUnits::Zero()),695 NonVirtualAlignment(CharUnits::One()),696 PreferredNVAlignment(CharUnits::One()),697 PaddedFieldSize(CharUnits::Zero()), PrimaryBase(nullptr),698 PrimaryBaseIsVirtual(false), HasOwnVFPtr(false), HasPackedField(false),699 HandledFirstNonOverlappingEmptyField(false),700 FirstNearlyEmptyVBase(nullptr) {}701 702 void Layout(const RecordDecl *D);703 void Layout(const CXXRecordDecl *D);704 void Layout(const ObjCInterfaceDecl *D);705 706 void LayoutFields(const RecordDecl *D);707 void LayoutField(const FieldDecl *D, bool InsertExtraPadding);708 void LayoutWideBitField(uint64_t FieldSize, uint64_t StorageUnitSize,709 bool FieldPacked, const FieldDecl *D);710 void LayoutBitField(const FieldDecl *D);711 712 TargetCXXABI getCXXABI() const {713 return Context.getTargetInfo().getCXXABI();714 }715 716 /// BaseSubobjectInfoAllocator - Allocator for BaseSubobjectInfo objects.717 llvm::SpecificBumpPtrAllocator<BaseSubobjectInfo> BaseSubobjectInfoAllocator;718 719 typedef llvm::DenseMap<const CXXRecordDecl *, BaseSubobjectInfo *>720 BaseSubobjectInfoMapTy;721 722 /// VirtualBaseInfo - Map from all the (direct or indirect) virtual bases723 /// of the class we're laying out to their base subobject info.724 BaseSubobjectInfoMapTy VirtualBaseInfo;725 726 /// NonVirtualBaseInfo - Map from all the direct non-virtual bases of the727 /// class we're laying out to their base subobject info.728 BaseSubobjectInfoMapTy NonVirtualBaseInfo;729 730 /// ComputeBaseSubobjectInfo - Compute the base subobject information for the731 /// bases of the given class.732 void ComputeBaseSubobjectInfo(const CXXRecordDecl *RD);733 734 /// ComputeBaseSubobjectInfo - Compute the base subobject information for a735 /// single class and all of its base classes.736 BaseSubobjectInfo *ComputeBaseSubobjectInfo(const CXXRecordDecl *RD,737 bool IsVirtual,738 BaseSubobjectInfo *Derived);739 740 /// DeterminePrimaryBase - Determine the primary base of the given class.741 void DeterminePrimaryBase(const CXXRecordDecl *RD);742 743 void SelectPrimaryVBase(const CXXRecordDecl *RD);744 745 void EnsureVTablePointerAlignment(CharUnits UnpackedBaseAlign);746 747 /// LayoutNonVirtualBases - Determines the primary base class (if any) and748 /// lays it out. Will then proceed to lay out all non-virtual base clasess.749 void LayoutNonVirtualBases(const CXXRecordDecl *RD);750 751 /// LayoutNonVirtualBase - Lays out a single non-virtual base.752 void LayoutNonVirtualBase(const BaseSubobjectInfo *Base);753 754 void AddPrimaryVirtualBaseOffsets(const BaseSubobjectInfo *Info,755 CharUnits Offset);756 757 /// LayoutVirtualBases - Lays out all the virtual bases.758 void LayoutVirtualBases(const CXXRecordDecl *RD,759 const CXXRecordDecl *MostDerivedClass);760 761 /// LayoutVirtualBase - Lays out a single virtual base.762 void LayoutVirtualBase(const BaseSubobjectInfo *Base);763 764 /// LayoutBase - Will lay out a base and return the offset where it was765 /// placed, in chars.766 CharUnits LayoutBase(const BaseSubobjectInfo *Base);767 768 /// InitializeLayout - Initialize record layout for the given record decl.769 void InitializeLayout(const Decl *D);770 771 /// FinishLayout - Finalize record layout. Adjust record size based on the772 /// alignment.773 void FinishLayout(const NamedDecl *D);774 775 void UpdateAlignment(CharUnits NewAlignment, CharUnits UnpackedNewAlignment,776 CharUnits PreferredAlignment);777 void UpdateAlignment(CharUnits NewAlignment, CharUnits UnpackedNewAlignment) {778 UpdateAlignment(NewAlignment, UnpackedNewAlignment, NewAlignment);779 }780 void UpdateAlignment(CharUnits NewAlignment) {781 UpdateAlignment(NewAlignment, NewAlignment, NewAlignment);782 }783 784 /// Retrieve the externally-supplied field offset for the given785 /// field.786 ///787 /// \param Field The field whose offset is being queried.788 /// \param ComputedOffset The offset that we've computed for this field.789 uint64_t updateExternalFieldOffset(const FieldDecl *Field,790 uint64_t ComputedOffset);791 792 void CheckFieldPadding(uint64_t Offset, uint64_t UnpaddedOffset,793 uint64_t UnpackedOffset, unsigned UnpackedAlign,794 bool isPacked, const FieldDecl *D);795 796 DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID);797 798 CharUnits getSize() const {799 assert(Size % Context.getCharWidth() == 0);800 return Context.toCharUnitsFromBits(Size);801 }802 uint64_t getSizeInBits() const { return Size; }803 804 void setSize(CharUnits NewSize) { Size = Context.toBits(NewSize); }805 void setSize(uint64_t NewSize) { Size = NewSize; }806 807 CharUnits getAlignment() const { return Alignment; }808 809 CharUnits getDataSize() const {810 assert(DataSize % Context.getCharWidth() == 0);811 return Context.toCharUnitsFromBits(DataSize);812 }813 uint64_t getDataSizeInBits() const { return DataSize; }814 815 void setDataSize(CharUnits NewSize) { DataSize = Context.toBits(NewSize); }816 void setDataSize(uint64_t NewSize) { DataSize = NewSize; }817 818 ItaniumRecordLayoutBuilder(const ItaniumRecordLayoutBuilder &) = delete;819 void operator=(const ItaniumRecordLayoutBuilder &) = delete;820};821} // end anonymous namespace822 823void ItaniumRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD) {824 for (const auto &I : RD->bases()) {825 assert(!I.getType()->isDependentType() &&826 "Cannot layout class with dependent bases.");827 828 const CXXRecordDecl *Base = I.getType()->getAsCXXRecordDecl();829 830 // Check if this is a nearly empty virtual base.831 if (I.isVirtual() && Context.isNearlyEmpty(Base)) {832 // If it's not an indirect primary base, then we've found our primary833 // base.834 if (!IndirectPrimaryBases.count(Base)) {835 PrimaryBase = Base;836 PrimaryBaseIsVirtual = true;837 return;838 }839 840 // Is this the first nearly empty virtual base?841 if (!FirstNearlyEmptyVBase)842 FirstNearlyEmptyVBase = Base;843 }844 845 SelectPrimaryVBase(Base);846 if (PrimaryBase)847 return;848 }849}850 851/// DeterminePrimaryBase - Determine the primary base of the given class.852void ItaniumRecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) {853 // If the class isn't dynamic, it won't have a primary base.854 if (!RD->isDynamicClass())855 return;856 857 // Compute all the primary virtual bases for all of our direct and858 // indirect bases, and record all their primary virtual base classes.859 RD->getIndirectPrimaryBases(IndirectPrimaryBases);860 861 // If the record has a dynamic base class, attempt to choose a primary base862 // class. It is the first (in direct base class order) non-virtual dynamic863 // base class, if one exists.864 for (const auto &I : RD->bases()) {865 // Ignore virtual bases.866 if (I.isVirtual())867 continue;868 869 const CXXRecordDecl *Base = I.getType()->getAsCXXRecordDecl();870 871 if (Base->isDynamicClass()) {872 // We found it.873 PrimaryBase = Base;874 PrimaryBaseIsVirtual = false;875 return;876 }877 }878 879 // Under the Itanium ABI, if there is no non-virtual primary base class,880 // try to compute the primary virtual base. The primary virtual base is881 // the first nearly empty virtual base that is not an indirect primary882 // virtual base class, if one exists.883 if (RD->getNumVBases() != 0) {884 SelectPrimaryVBase(RD);885 if (PrimaryBase)886 return;887 }888 889 // Otherwise, it is the first indirect primary base class, if one exists.890 if (FirstNearlyEmptyVBase) {891 PrimaryBase = FirstNearlyEmptyVBase;892 PrimaryBaseIsVirtual = true;893 return;894 }895 896 assert(!PrimaryBase && "Should not get here with a primary base!");897}898 899BaseSubobjectInfo *ItaniumRecordLayoutBuilder::ComputeBaseSubobjectInfo(900 const CXXRecordDecl *RD, bool IsVirtual, BaseSubobjectInfo *Derived) {901 BaseSubobjectInfo *Info;902 903 if (IsVirtual) {904 // Check if we already have info about this virtual base.905 BaseSubobjectInfo *&InfoSlot = VirtualBaseInfo[RD];906 if (InfoSlot) {907 assert(InfoSlot->Class == RD && "Wrong class for virtual base info!");908 return InfoSlot;909 }910 911 // We don't, create it.912 InfoSlot = new (BaseSubobjectInfoAllocator.Allocate()) BaseSubobjectInfo;913 Info = InfoSlot;914 } else {915 Info = new (BaseSubobjectInfoAllocator.Allocate()) BaseSubobjectInfo;916 }917 918 Info->Class = RD;919 Info->IsVirtual = IsVirtual;920 Info->Derived = nullptr;921 Info->PrimaryVirtualBaseInfo = nullptr;922 923 const CXXRecordDecl *PrimaryVirtualBase = nullptr;924 BaseSubobjectInfo *PrimaryVirtualBaseInfo = nullptr;925 926 // Check if this base has a primary virtual base.927 if (RD->getNumVBases()) {928 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);929 if (Layout.isPrimaryBaseVirtual()) {930 // This base does have a primary virtual base.931 PrimaryVirtualBase = Layout.getPrimaryBase();932 assert(PrimaryVirtualBase && "Didn't have a primary virtual base!");933 934 // Now check if we have base subobject info about this primary base.935 PrimaryVirtualBaseInfo = VirtualBaseInfo.lookup(PrimaryVirtualBase);936 937 if (PrimaryVirtualBaseInfo) {938 if (PrimaryVirtualBaseInfo->Derived) {939 // We did have info about this primary base, and it turns out that it940 // has already been claimed as a primary virtual base for another941 // base.942 PrimaryVirtualBase = nullptr;943 } else {944 // We can claim this base as our primary base.945 Info->PrimaryVirtualBaseInfo = PrimaryVirtualBaseInfo;946 PrimaryVirtualBaseInfo->Derived = Info;947 }948 }949 }950 }951 952 // Now go through all direct bases.953 for (const auto &I : RD->bases()) {954 bool IsVirtual = I.isVirtual();955 956 const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl();957 958 Info->Bases.push_back(ComputeBaseSubobjectInfo(BaseDecl, IsVirtual, Info));959 }960 961 if (PrimaryVirtualBase && !PrimaryVirtualBaseInfo) {962 // Traversing the bases must have created the base info for our primary963 // virtual base.964 PrimaryVirtualBaseInfo = VirtualBaseInfo.lookup(PrimaryVirtualBase);965 assert(PrimaryVirtualBaseInfo &&966 "Did not create a primary virtual base!");967 968 // Claim the primary virtual base as our primary virtual base.969 Info->PrimaryVirtualBaseInfo = PrimaryVirtualBaseInfo;970 PrimaryVirtualBaseInfo->Derived = Info;971 }972 973 return Info;974}975 976void ItaniumRecordLayoutBuilder::ComputeBaseSubobjectInfo(977 const CXXRecordDecl *RD) {978 for (const auto &I : RD->bases()) {979 bool IsVirtual = I.isVirtual();980 981 const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl();982 983 // Compute the base subobject info for this base.984 BaseSubobjectInfo *Info = ComputeBaseSubobjectInfo(BaseDecl, IsVirtual,985 nullptr);986 987 if (IsVirtual) {988 // ComputeBaseInfo has already added this base for us.989 assert(VirtualBaseInfo.count(BaseDecl) &&990 "Did not add virtual base!");991 } else {992 // Add the base info to the map of non-virtual bases.993 assert(!NonVirtualBaseInfo.count(BaseDecl) &&994 "Non-virtual base already exists!");995 NonVirtualBaseInfo.insert(std::make_pair(BaseDecl, Info));996 }997 }998}999 1000void ItaniumRecordLayoutBuilder::EnsureVTablePointerAlignment(1001 CharUnits UnpackedBaseAlign) {1002 CharUnits BaseAlign = Packed ? CharUnits::One() : UnpackedBaseAlign;1003 1004 // The maximum field alignment overrides base align.1005 if (!MaxFieldAlignment.isZero()) {1006 BaseAlign = std::min(BaseAlign, MaxFieldAlignment);1007 UnpackedBaseAlign = std::min(UnpackedBaseAlign, MaxFieldAlignment);1008 }1009 1010 // Round up the current record size to pointer alignment.1011 setSize(getSize().alignTo(BaseAlign));1012 1013 // Update the alignment.1014 UpdateAlignment(BaseAlign, UnpackedBaseAlign, BaseAlign);1015}1016 1017void ItaniumRecordLayoutBuilder::LayoutNonVirtualBases(1018 const CXXRecordDecl *RD) {1019 // Then, determine the primary base class.1020 DeterminePrimaryBase(RD);1021 1022 // Compute base subobject info.1023 ComputeBaseSubobjectInfo(RD);1024 1025 // If we have a primary base class, lay it out.1026 if (PrimaryBase) {1027 if (PrimaryBaseIsVirtual) {1028 // If the primary virtual base was a primary virtual base of some other1029 // base class we'll have to steal it.1030 BaseSubobjectInfo *PrimaryBaseInfo = VirtualBaseInfo.lookup(PrimaryBase);1031 PrimaryBaseInfo->Derived = nullptr;1032 1033 // We have a virtual primary base, insert it as an indirect primary base.1034 IndirectPrimaryBases.insert(PrimaryBase);1035 1036 assert(!VisitedVirtualBases.count(PrimaryBase) &&1037 "vbase already visited!");1038 VisitedVirtualBases.insert(PrimaryBase);1039 1040 LayoutVirtualBase(PrimaryBaseInfo);1041 } else {1042 BaseSubobjectInfo *PrimaryBaseInfo =1043 NonVirtualBaseInfo.lookup(PrimaryBase);1044 assert(PrimaryBaseInfo &&1045 "Did not find base info for non-virtual primary base!");1046 1047 LayoutNonVirtualBase(PrimaryBaseInfo);1048 }1049 1050 // If this class needs a vtable/vf-table and didn't get one from a1051 // primary base, add it in now.1052 } else if (RD->isDynamicClass()) {1053 assert(DataSize == 0 && "Vtable pointer must be at offset zero!");1054 CharUnits PtrWidth = Context.toCharUnitsFromBits(1055 Context.getTargetInfo().getPointerWidth(LangAS::Default));1056 CharUnits PtrAlign = Context.toCharUnitsFromBits(1057 Context.getTargetInfo().getPointerAlign(LangAS::Default));1058 EnsureVTablePointerAlignment(PtrAlign);1059 HasOwnVFPtr = true;1060 1061 assert(!IsUnion && "Unions cannot be dynamic classes.");1062 HandledFirstNonOverlappingEmptyField = true;1063 1064 setSize(getSize() + PtrWidth);1065 setDataSize(getSize());1066 }1067 1068 // Now lay out the non-virtual bases.1069 for (const auto &I : RD->bases()) {1070 1071 // Ignore virtual bases.1072 if (I.isVirtual())1073 continue;1074 1075 const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl();1076 1077 // Skip the primary base, because we've already laid it out. The1078 // !PrimaryBaseIsVirtual check is required because we might have a1079 // non-virtual base of the same type as a primary virtual base.1080 if (BaseDecl == PrimaryBase && !PrimaryBaseIsVirtual)1081 continue;1082 1083 // Lay out the base.1084 BaseSubobjectInfo *BaseInfo = NonVirtualBaseInfo.lookup(BaseDecl);1085 assert(BaseInfo && "Did not find base info for non-virtual base!");1086 1087 LayoutNonVirtualBase(BaseInfo);1088 }1089}1090 1091void ItaniumRecordLayoutBuilder::LayoutNonVirtualBase(1092 const BaseSubobjectInfo *Base) {1093 // Layout the base.1094 CharUnits Offset = LayoutBase(Base);1095 1096 // Add its base class offset.1097 assert(!Bases.count(Base->Class) && "base offset already exists!");1098 Bases.insert(std::make_pair(Base->Class, Offset));1099 1100 AddPrimaryVirtualBaseOffsets(Base, Offset);1101}1102 1103void ItaniumRecordLayoutBuilder::AddPrimaryVirtualBaseOffsets(1104 const BaseSubobjectInfo *Info, CharUnits Offset) {1105 // This base isn't interesting, it has no virtual bases.1106 if (!Info->Class->getNumVBases())1107 return;1108 1109 // First, check if we have a virtual primary base to add offsets for.1110 if (Info->PrimaryVirtualBaseInfo) {1111 assert(Info->PrimaryVirtualBaseInfo->IsVirtual &&1112 "Primary virtual base is not virtual!");1113 if (Info->PrimaryVirtualBaseInfo->Derived == Info) {1114 // Add the offset.1115 assert(!VBases.count(Info->PrimaryVirtualBaseInfo->Class) &&1116 "primary vbase offset already exists!");1117 VBases.insert(std::make_pair(Info->PrimaryVirtualBaseInfo->Class,1118 ASTRecordLayout::VBaseInfo(Offset, false)));1119 1120 // Traverse the primary virtual base.1121 AddPrimaryVirtualBaseOffsets(Info->PrimaryVirtualBaseInfo, Offset);1122 }1123 }1124 1125 // Now go through all direct non-virtual bases.1126 const ASTRecordLayout &Layout = Context.getASTRecordLayout(Info->Class);1127 for (const BaseSubobjectInfo *Base : Info->Bases) {1128 if (Base->IsVirtual)1129 continue;1130 1131 CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(Base->Class);1132 AddPrimaryVirtualBaseOffsets(Base, BaseOffset);1133 }1134}1135 1136void ItaniumRecordLayoutBuilder::LayoutVirtualBases(1137 const CXXRecordDecl *RD, const CXXRecordDecl *MostDerivedClass) {1138 const CXXRecordDecl *PrimaryBase;1139 bool PrimaryBaseIsVirtual;1140 1141 if (MostDerivedClass == RD) {1142 PrimaryBase = this->PrimaryBase;1143 PrimaryBaseIsVirtual = this->PrimaryBaseIsVirtual;1144 } else {1145 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);1146 PrimaryBase = Layout.getPrimaryBase();1147 PrimaryBaseIsVirtual = Layout.isPrimaryBaseVirtual();1148 }1149 1150 for (const CXXBaseSpecifier &Base : RD->bases()) {1151 assert(!Base.getType()->isDependentType() &&1152 "Cannot layout class with dependent bases.");1153 1154 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();1155 1156 if (Base.isVirtual()) {1157 if (PrimaryBase != BaseDecl || !PrimaryBaseIsVirtual) {1158 bool IndirectPrimaryBase = IndirectPrimaryBases.count(BaseDecl);1159 1160 // Only lay out the virtual base if it's not an indirect primary base.1161 if (!IndirectPrimaryBase) {1162 // Only visit virtual bases once.1163 if (!VisitedVirtualBases.insert(BaseDecl).second)1164 continue;1165 1166 const BaseSubobjectInfo *BaseInfo = VirtualBaseInfo.lookup(BaseDecl);1167 assert(BaseInfo && "Did not find virtual base info!");1168 LayoutVirtualBase(BaseInfo);1169 }1170 }1171 }1172 1173 if (!BaseDecl->getNumVBases()) {1174 // This base isn't interesting since it doesn't have any virtual bases.1175 continue;1176 }1177 1178 LayoutVirtualBases(BaseDecl, MostDerivedClass);1179 }1180}1181 1182void ItaniumRecordLayoutBuilder::LayoutVirtualBase(1183 const BaseSubobjectInfo *Base) {1184 assert(!Base->Derived && "Trying to lay out a primary virtual base!");1185 1186 // Layout the base.1187 CharUnits Offset = LayoutBase(Base);1188 1189 // Add its base class offset.1190 assert(!VBases.count(Base->Class) && "vbase offset already exists!");1191 VBases.insert(std::make_pair(Base->Class,1192 ASTRecordLayout::VBaseInfo(Offset, false)));1193 1194 AddPrimaryVirtualBaseOffsets(Base, Offset);1195}1196 1197CharUnits1198ItaniumRecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {1199 assert(!IsUnion && "Unions cannot have base classes.");1200 1201 const ASTRecordLayout &Layout = Context.getASTRecordLayout(Base->Class);1202 CharUnits Offset;1203 1204 // Query the external layout to see if it provides an offset.1205 bool HasExternalLayout = false;1206 if (UseExternalLayout) {1207 if (Base->IsVirtual)1208 HasExternalLayout = External.getExternalVBaseOffset(Base->Class, Offset);1209 else1210 HasExternalLayout = External.getExternalNVBaseOffset(Base->Class, Offset);1211 }1212 1213 auto getBaseOrPreferredBaseAlignFromUnpacked = [&](CharUnits UnpackedAlign) {1214 // Clang <= 6 incorrectly applied the 'packed' attribute to base classes.1215 // Per GCC's documentation, it only applies to non-static data members.1216 return (Packed && ((Context.getLangOpts().getClangABICompat() <=1217 LangOptions::ClangABI::Ver6) ||1218 Context.getTargetInfo().getTriple().isPS() ||1219 Context.getTargetInfo().getTriple().isOSAIX()))1220 ? CharUnits::One()1221 : UnpackedAlign;1222 };1223 1224 CharUnits UnpackedBaseAlign = Layout.getNonVirtualAlignment();1225 CharUnits UnpackedPreferredBaseAlign = Layout.getPreferredNVAlignment();1226 CharUnits BaseAlign =1227 getBaseOrPreferredBaseAlignFromUnpacked(UnpackedBaseAlign);1228 CharUnits PreferredBaseAlign =1229 getBaseOrPreferredBaseAlignFromUnpacked(UnpackedPreferredBaseAlign);1230 1231 const bool DefaultsToAIXPowerAlignment =1232 Context.getTargetInfo().defaultsToAIXPowerAlignment();1233 if (DefaultsToAIXPowerAlignment) {1234 // AIX `power` alignment does not apply the preferred alignment for1235 // non-union classes if the source of the alignment (the current base in1236 // this context) follows introduction of the first subobject with1237 // exclusively allocated space or zero-extent array.1238 if (!Base->Class->isEmpty() && !HandledFirstNonOverlappingEmptyField) {1239 // By handling a base class that is not empty, we're handling the1240 // "first (inherited) member".1241 HandledFirstNonOverlappingEmptyField = true;1242 } else if (!IsNaturalAlign) {1243 UnpackedPreferredBaseAlign = UnpackedBaseAlign;1244 PreferredBaseAlign = BaseAlign;1245 }1246 }1247 1248 CharUnits UnpackedAlignTo = !DefaultsToAIXPowerAlignment1249 ? UnpackedBaseAlign1250 : UnpackedPreferredBaseAlign;1251 // If we have an empty base class, try to place it at offset 0.1252 if (Base->Class->isEmpty() &&1253 (!HasExternalLayout || Offset == CharUnits::Zero()) &&1254 EmptySubobjects->CanPlaceBaseAtOffset(Base, CharUnits::Zero())) {1255 setSize(std::max(getSize(), Layout.getSize()));1256 // On PS4/PS5, don't update the alignment, to preserve compatibility.1257 if (!Context.getTargetInfo().getTriple().isPS())1258 UpdateAlignment(BaseAlign, UnpackedAlignTo, PreferredBaseAlign);1259 1260 return CharUnits::Zero();1261 }1262 1263 // The maximum field alignment overrides the base align/(AIX-only) preferred1264 // base align.1265 if (!MaxFieldAlignment.isZero()) {1266 BaseAlign = std::min(BaseAlign, MaxFieldAlignment);1267 PreferredBaseAlign = std::min(PreferredBaseAlign, MaxFieldAlignment);1268 UnpackedAlignTo = std::min(UnpackedAlignTo, MaxFieldAlignment);1269 }1270 1271 CharUnits AlignTo =1272 !DefaultsToAIXPowerAlignment ? BaseAlign : PreferredBaseAlign;1273 if (!HasExternalLayout) {1274 // Round up the current record size to the base's alignment boundary.1275 Offset = getDataSize().alignTo(AlignTo);1276 1277 // Try to place the base.1278 while (!EmptySubobjects->CanPlaceBaseAtOffset(Base, Offset))1279 Offset += AlignTo;1280 } else {1281 bool Allowed = EmptySubobjects->CanPlaceBaseAtOffset(Base, Offset);1282 (void)Allowed;1283 assert(Allowed && "Base subobject externally placed at overlapping offset");1284 1285 if (InferAlignment && Offset < getDataSize().alignTo(AlignTo)) {1286 // The externally-supplied base offset is before the base offset we1287 // computed. Assume that the structure is packed.1288 Alignment = CharUnits::One();1289 InferAlignment = false;1290 }1291 }1292 1293 if (!Base->Class->isEmpty()) {1294 // Update the data size.1295 setDataSize(Offset + Layout.getNonVirtualSize());1296 1297 setSize(std::max(getSize(), getDataSize()));1298 } else1299 setSize(std::max(getSize(), Offset + Layout.getSize()));1300 1301 // Remember max struct/class alignment.1302 UnadjustedAlignment = std::max(UnadjustedAlignment, BaseAlign);1303 UpdateAlignment(BaseAlign, UnpackedAlignTo, PreferredBaseAlign);1304 1305 return Offset;1306}1307 1308void ItaniumRecordLayoutBuilder::InitializeLayout(const Decl *D) {1309 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {1310 IsUnion = RD->isUnion();1311 IsMsStruct = RD->isMsStruct(Context);1312 }1313 1314 Packed = D->hasAttr<PackedAttr>();1315 1316 // Honor the default struct packing maximum alignment flag.1317 if (unsigned DefaultMaxFieldAlignment = Context.getLangOpts().PackStruct) {1318 MaxFieldAlignment = CharUnits::fromQuantity(DefaultMaxFieldAlignment);1319 }1320 1321 // mac68k alignment supersedes maximum field alignment and attribute aligned,1322 // and forces all structures to have 2-byte alignment. The IBM docs on it1323 // allude to additional (more complicated) semantics, especially with regard1324 // to bit-fields, but gcc appears not to follow that.1325 if (D->hasAttr<AlignMac68kAttr>()) {1326 assert(1327 !D->hasAttr<AlignNaturalAttr>() &&1328 "Having both mac68k and natural alignment on a decl is not allowed.");1329 IsMac68kAlign = true;1330 MaxFieldAlignment = CharUnits::fromQuantity(2);1331 Alignment = CharUnits::fromQuantity(2);1332 PreferredAlignment = CharUnits::fromQuantity(2);1333 } else {1334 if (D->hasAttr<AlignNaturalAttr>())1335 IsNaturalAlign = true;1336 1337 if (const MaxFieldAlignmentAttr *MFAA = D->getAttr<MaxFieldAlignmentAttr>())1338 MaxFieldAlignment = Context.toCharUnitsFromBits(MFAA->getAlignment());1339 1340 if (unsigned MaxAlign = D->getMaxAlignment())1341 UpdateAlignment(Context.toCharUnitsFromBits(MaxAlign));1342 }1343 1344 HandledFirstNonOverlappingEmptyField =1345 !Context.getTargetInfo().defaultsToAIXPowerAlignment() || IsNaturalAlign;1346 1347 // If there is an external AST source, ask it for the various offsets.1348 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))1349 if (ExternalASTSource *Source = Context.getExternalSource()) {1350 UseExternalLayout = Source->layoutRecordType(1351 RD, External.Size, External.Align, External.FieldOffsets,1352 External.BaseOffsets, External.VirtualBaseOffsets);1353 1354 // Update based on external alignment.1355 if (UseExternalLayout) {1356 if (External.Align > 0) {1357 Alignment = Context.toCharUnitsFromBits(External.Align);1358 PreferredAlignment = Context.toCharUnitsFromBits(External.Align);1359 } else {1360 // The external source didn't have alignment information; infer it.1361 InferAlignment = true;1362 }1363 }1364 }1365}1366 1367void ItaniumRecordLayoutBuilder::Layout(const RecordDecl *D) {1368 InitializeLayout(D);1369 LayoutFields(D);1370 1371 // Finally, round the size of the total struct up to the alignment of the1372 // struct itself.1373 FinishLayout(D);1374}1375 1376void ItaniumRecordLayoutBuilder::Layout(const CXXRecordDecl *RD) {1377 InitializeLayout(RD);1378 1379 // Lay out the vtable and the non-virtual bases.1380 LayoutNonVirtualBases(RD);1381 1382 LayoutFields(RD);1383 1384 NonVirtualSize = Context.toCharUnitsFromBits(1385 llvm::alignTo(getSizeInBits(), Context.getTargetInfo().getCharAlign()));1386 NonVirtualAlignment = Alignment;1387 PreferredNVAlignment = PreferredAlignment;1388 1389 // Lay out the virtual bases and add the primary virtual base offsets.1390 LayoutVirtualBases(RD, RD);1391 1392 // Finally, round the size of the total struct up to the alignment1393 // of the struct itself.1394 FinishLayout(RD);1395 1396#ifndef NDEBUG1397 // Check that we have base offsets for all bases.1398 for (const CXXBaseSpecifier &Base : RD->bases()) {1399 if (Base.isVirtual())1400 continue;1401 1402 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();1403 1404 assert(Bases.count(BaseDecl) && "Did not find base offset!");1405 }1406 1407 // And all virtual bases.1408 for (const CXXBaseSpecifier &Base : RD->vbases()) {1409 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();1410 1411 assert(VBases.count(BaseDecl) && "Did not find base offset!");1412 }1413#endif1414}1415 1416void ItaniumRecordLayoutBuilder::Layout(const ObjCInterfaceDecl *D) {1417 if (ObjCInterfaceDecl *SD = D->getSuperClass()) {1418 const ASTRecordLayout &SL = Context.getASTObjCInterfaceLayout(SD);1419 1420 UpdateAlignment(SL.getAlignment());1421 1422 // We start laying out ivars not at the end of the superclass1423 // structure, but at the next byte following the last field.1424 setDataSize(SL.getDataSize());1425 setSize(getDataSize());1426 }1427 1428 InitializeLayout(D);1429 // Layout each ivar sequentially.1430 for (const ObjCIvarDecl *IVD = D->all_declared_ivar_begin(); IVD;1431 IVD = IVD->getNextIvar())1432 LayoutField(IVD, false);1433 1434 // Finally, round the size of the total struct up to the alignment of the1435 // struct itself.1436 FinishLayout(D);1437}1438 1439void ItaniumRecordLayoutBuilder::LayoutFields(const RecordDecl *D) {1440 // Layout each field, for now, just sequentially, respecting alignment. In1441 // the future, this will need to be tweakable by targets.1442 bool InsertExtraPadding = D->mayInsertExtraPadding(/*EmitRemark=*/true);1443 bool HasFlexibleArrayMember = D->hasFlexibleArrayMember();1444 for (auto I = D->field_begin(), End = D->field_end(); I != End; ++I) {1445 LayoutField(*I, InsertExtraPadding &&1446 (std::next(I) != End || !HasFlexibleArrayMember));1447 }1448}1449 1450// Rounds the specified size to have it a multiple of the char size.1451static uint64_t1452roundUpSizeToCharAlignment(uint64_t Size,1453 const ASTContext &Context) {1454 uint64_t CharAlignment = Context.getTargetInfo().getCharAlign();1455 return llvm::alignTo(Size, CharAlignment);1456}1457 1458void ItaniumRecordLayoutBuilder::LayoutWideBitField(uint64_t FieldSize,1459 uint64_t StorageUnitSize,1460 bool FieldPacked,1461 const FieldDecl *D) {1462 assert(Context.getLangOpts().CPlusPlus &&1463 "Can only have wide bit-fields in C++!");1464 1465 // Itanium C++ ABI 2.4:1466 // If sizeof(T)*8 < n, let T' be the largest integral POD type with1467 // sizeof(T')*8 <= n.1468 1469 QualType IntegralPODTypes[] = {1470 Context.UnsignedCharTy, Context.UnsignedShortTy,1471 Context.UnsignedIntTy, Context.UnsignedLongTy,1472 Context.UnsignedLongLongTy, Context.UnsignedInt128Ty,1473 };1474 1475 QualType Type;1476 uint64_t MaxSize =1477 Context.getTargetInfo().getLargestOverSizedBitfieldContainer();1478 for (const QualType &QT : IntegralPODTypes) {1479 uint64_t Size = Context.getTypeSize(QT);1480 1481 if (Size > FieldSize || Size > MaxSize)1482 break;1483 1484 Type = QT;1485 }1486 assert(!Type.isNull() && "Did not find a type!");1487 1488 CharUnits TypeAlign = Context.getTypeAlignInChars(Type);1489 1490 // We're not going to use any of the unfilled bits in the last byte.1491 UnfilledBitsInLastUnit = 0;1492 LastBitfieldStorageUnitSize = 0;1493 1494 uint64_t FieldOffset;1495 uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastUnit;1496 1497 if (IsUnion) {1498 uint64_t RoundedFieldSize = roundUpSizeToCharAlignment(FieldSize,1499 Context);1500 setDataSize(std::max(getDataSizeInBits(), RoundedFieldSize));1501 FieldOffset = 0;1502 } else {1503 // The bitfield is allocated starting at the next offset aligned1504 // appropriately for T', with length n bits.1505 FieldOffset = llvm::alignTo(getDataSizeInBits(), Context.toBits(TypeAlign));1506 1507 uint64_t NewSizeInBits = FieldOffset + FieldSize;1508 1509 setDataSize(1510 llvm::alignTo(NewSizeInBits, Context.getTargetInfo().getCharAlign()));1511 UnfilledBitsInLastUnit = getDataSizeInBits() - NewSizeInBits;1512 }1513 1514 // Place this field at the current location.1515 FieldOffsets.push_back(FieldOffset);1516 1517 CheckFieldPadding(FieldOffset, UnpaddedFieldOffset, FieldOffset,1518 Context.toBits(TypeAlign), FieldPacked, D);1519 1520 // Update the size.1521 setSize(std::max(getSizeInBits(), getDataSizeInBits()));1522 1523 // Remember max struct/class alignment.1524 UnadjustedAlignment = std::max(UnadjustedAlignment, TypeAlign);1525 UpdateAlignment(TypeAlign);1526}1527 1528static bool isAIXLayout(const ASTContext &Context) {1529 return Context.getTargetInfo().getTriple().getOS() == llvm::Triple::AIX;1530}1531 1532void ItaniumRecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {1533 bool FieldPacked = Packed || D->hasAttr<PackedAttr>();1534 uint64_t FieldSize = D->getBitWidthValue();1535 TypeInfo FieldInfo = Context.getTypeInfo(D->getType());1536 uint64_t StorageUnitSize = FieldInfo.Width;1537 unsigned FieldAlign = FieldInfo.Align;1538 bool AlignIsRequired = FieldInfo.isAlignRequired();1539 unsigned char PaddingInLastUnit = 0;1540 1541 // UnfilledBitsInLastUnit is the difference between the end of the1542 // last allocated bitfield (i.e. the first bit offset available for1543 // bitfields) and the end of the current data size in bits (i.e. the1544 // first bit offset available for non-bitfields). The current data1545 // size in bits is always a multiple of the char size; additionally,1546 // for ms_struct records it's also a multiple of the1547 // LastBitfieldStorageUnitSize (if set).1548 1549 // The struct-layout algorithm is dictated by the platform ABI,1550 // which in principle could use almost any rules it likes. In1551 // practice, UNIXy targets tend to inherit the algorithm described1552 // in the System V generic ABI. The basic bitfield layout rule in1553 // System V is to place bitfields at the next available bit offset1554 // where the entire bitfield would fit in an aligned storage unit of1555 // the declared type; it's okay if an earlier or later non-bitfield1556 // is allocated in the same storage unit. However, some targets1557 // (those that !useBitFieldTypeAlignment(), e.g. ARM APCS) don't1558 // require this storage unit to be aligned, and therefore always put1559 // the bitfield at the next available bit offset.1560 1561 // ms_struct basically requests a complete replacement of the1562 // platform ABI's struct-layout algorithm, with the high-level goal1563 // of duplicating MSVC's layout. For non-bitfields, this follows1564 // the standard algorithm. The basic bitfield layout rule is to1565 // allocate an entire unit of the bitfield's declared type1566 // (e.g. 'unsigned long'), then parcel it up among successive1567 // bitfields whose declared types have the same size, making a new1568 // unit as soon as the last can no longer store the whole value.1569 // Since it completely replaces the platform ABI's algorithm,1570 // settings like !useBitFieldTypeAlignment() do not apply.1571 1572 // A zero-width bitfield forces the use of a new storage unit for1573 // later bitfields. In general, this occurs by rounding up the1574 // current size of the struct as if the algorithm were about to1575 // place a non-bitfield of the field's formal type. Usually this1576 // does not change the alignment of the struct itself, but it does1577 // on some targets (those that useZeroLengthBitfieldAlignment(),1578 // e.g. ARM). In ms_struct layout, zero-width bitfields are1579 // ignored unless they follow a non-zero-width bitfield.1580 1581 // A field alignment restriction (e.g. from #pragma pack) or1582 // specification (e.g. from __attribute__((aligned))) changes the1583 // formal alignment of the field. For System V, this alters the1584 // required alignment of the notional storage unit that must contain1585 // the bitfield. For ms_struct, this only affects the placement of1586 // new storage units. In both cases, the effect of #pragma pack is1587 // ignored on zero-width bitfields.1588 1589 // On System V, a packed field (e.g. from #pragma pack or1590 // __attribute__((packed))) always uses the next available bit1591 // offset.1592 1593 // In an ms_struct struct, the alignment of a fundamental type is1594 // always equal to its size. This is necessary in order to mimic1595 // the i386 alignment rules on targets which might not fully align1596 // all types (e.g. Darwin PPC32, where alignof(long long) == 4).1597 1598 // First, some simple bookkeeping to perform for ms_struct structs.1599 if (IsMsStruct) {1600 // The field alignment for integer types is always the size.1601 FieldAlign = StorageUnitSize;1602 1603 // If the previous field was not a bitfield, or was a bitfield1604 // with a different storage unit size, or if this field doesn't fit into1605 // the current storage unit, we're done with that storage unit.1606 if (LastBitfieldStorageUnitSize != StorageUnitSize ||1607 UnfilledBitsInLastUnit < FieldSize) {1608 // Also, ignore zero-length bitfields after non-bitfields.1609 if (!LastBitfieldStorageUnitSize && !FieldSize)1610 FieldAlign = 1;1611 1612 PaddingInLastUnit = UnfilledBitsInLastUnit;1613 UnfilledBitsInLastUnit = 0;1614 LastBitfieldStorageUnitSize = 0;1615 }1616 }1617 1618 if (isAIXLayout(Context)) {1619 if (StorageUnitSize < Context.getTypeSize(Context.UnsignedIntTy)) {1620 // On AIX, [bool, char, short] bitfields have the same alignment1621 // as [unsigned].1622 StorageUnitSize = Context.getTypeSize(Context.UnsignedIntTy);1623 } else if (StorageUnitSize > Context.getTypeSize(Context.UnsignedIntTy) &&1624 Context.getTargetInfo().getTriple().isArch32Bit() &&1625 FieldSize <= 32) {1626 // Under 32-bit compile mode, the bitcontainer is 32 bits if a single1627 // long long bitfield has length no greater than 32 bits.1628 StorageUnitSize = 32;1629 1630 if (!AlignIsRequired)1631 FieldAlign = 32;1632 }1633 1634 if (FieldAlign < StorageUnitSize) {1635 // The bitfield alignment should always be greater than or equal to1636 // bitcontainer size.1637 FieldAlign = StorageUnitSize;1638 }1639 }1640 1641 // If the field is wider than its declared type, it follows1642 // different rules in all cases, except on AIX.1643 // On AIX, wide bitfield follows the same rules as normal bitfield.1644 if (FieldSize > StorageUnitSize && !isAIXLayout(Context)) {1645 LayoutWideBitField(FieldSize, StorageUnitSize, FieldPacked, D);1646 return;1647 }1648 1649 // Compute the next available bit offset.1650 uint64_t FieldOffset =1651 IsUnion ? 0 : (getDataSizeInBits() - UnfilledBitsInLastUnit);1652 1653 // Handle targets that don't honor bitfield type alignment.1654 if (!IsMsStruct && !Context.getTargetInfo().useBitFieldTypeAlignment()) {1655 // Some such targets do honor it on zero-width bitfields.1656 if (FieldSize == 0 &&1657 Context.getTargetInfo().useZeroLengthBitfieldAlignment()) {1658 // Some targets don't honor leading zero-width bitfield.1659 if (!IsUnion && FieldOffset == 0 &&1660 !Context.getTargetInfo().useLeadingZeroLengthBitfield())1661 FieldAlign = 1;1662 else {1663 // The alignment to round up to is the max of the field's natural1664 // alignment and a target-specific fixed value (sometimes zero).1665 unsigned ZeroLengthBitfieldBoundary =1666 Context.getTargetInfo().getZeroLengthBitfieldBoundary();1667 FieldAlign = std::max(FieldAlign, ZeroLengthBitfieldBoundary);1668 }1669 // If that doesn't apply, just ignore the field alignment.1670 } else {1671 FieldAlign = 1;1672 }1673 }1674 1675 // Remember the alignment we would have used if the field were not packed.1676 unsigned UnpackedFieldAlign = FieldAlign;1677 1678 // Ignore the field alignment if the field is packed unless it has zero-size.1679 if (!IsMsStruct && FieldPacked && FieldSize != 0)1680 FieldAlign = 1;1681 1682 // But, if there's an 'aligned' attribute on the field, honor that.1683 unsigned ExplicitFieldAlign = D->getMaxAlignment();1684 if (ExplicitFieldAlign) {1685 FieldAlign = std::max(FieldAlign, ExplicitFieldAlign);1686 UnpackedFieldAlign = std::max(UnpackedFieldAlign, ExplicitFieldAlign);1687 }1688 1689 // But, if there's a #pragma pack in play, that takes precedent over1690 // even the 'aligned' attribute, for non-zero-width bitfields.1691 unsigned MaxFieldAlignmentInBits = Context.toBits(MaxFieldAlignment);1692 if (!MaxFieldAlignment.isZero() && FieldSize) {1693 UnpackedFieldAlign = std::min(UnpackedFieldAlign, MaxFieldAlignmentInBits);1694 if (FieldPacked)1695 FieldAlign = UnpackedFieldAlign;1696 else1697 FieldAlign = std::min(FieldAlign, MaxFieldAlignmentInBits);1698 }1699 1700 // But, ms_struct just ignores all of that in unions, even explicit1701 // alignment attributes.1702 if (IsMsStruct && IsUnion) {1703 FieldAlign = UnpackedFieldAlign = 1;1704 }1705 1706 // For purposes of diagnostics, we're going to simultaneously1707 // compute the field offsets that we would have used if we weren't1708 // adding any alignment padding or if the field weren't packed.1709 uint64_t UnpaddedFieldOffset = FieldOffset - PaddingInLastUnit;1710 uint64_t UnpackedFieldOffset = FieldOffset;1711 1712 // Check if we need to add padding to fit the bitfield within an1713 // allocation unit with the right size and alignment. The rules are1714 // somewhat different here for ms_struct structs.1715 if (IsMsStruct) {1716 // If it's not a zero-width bitfield, and we can fit the bitfield1717 // into the active storage unit (and we haven't already decided to1718 // start a new storage unit), just do so, regardless of any other1719 // other consideration. Otherwise, round up to the right alignment.1720 if (FieldSize == 0 || FieldSize > UnfilledBitsInLastUnit) {1721 FieldOffset = llvm::alignTo(FieldOffset, FieldAlign);1722 UnpackedFieldOffset =1723 llvm::alignTo(UnpackedFieldOffset, UnpackedFieldAlign);1724 UnfilledBitsInLastUnit = 0;1725 }1726 1727 } else {1728 // #pragma pack, with any value, suppresses the insertion of padding.1729 bool AllowPadding = MaxFieldAlignment.isZero();1730 1731 // Compute the real offset.1732 if (FieldSize == 0 ||1733 (AllowPadding &&1734 (FieldOffset & (FieldAlign - 1)) + FieldSize > StorageUnitSize)) {1735 FieldOffset = llvm::alignTo(FieldOffset, FieldAlign);1736 } else if (ExplicitFieldAlign &&1737 (MaxFieldAlignmentInBits == 0 ||1738 ExplicitFieldAlign <= MaxFieldAlignmentInBits) &&1739 Context.getTargetInfo().useExplicitBitFieldAlignment()) {1740 // TODO: figure it out what needs to be done on targets that don't honor1741 // bit-field type alignment like ARM APCS ABI.1742 FieldOffset = llvm::alignTo(FieldOffset, ExplicitFieldAlign);1743 }1744 1745 // Repeat the computation for diagnostic purposes.1746 if (FieldSize == 0 ||1747 (AllowPadding &&1748 (UnpackedFieldOffset & (UnpackedFieldAlign - 1)) + FieldSize >1749 StorageUnitSize))1750 UnpackedFieldOffset =1751 llvm::alignTo(UnpackedFieldOffset, UnpackedFieldAlign);1752 else if (ExplicitFieldAlign &&1753 (MaxFieldAlignmentInBits == 0 ||1754 ExplicitFieldAlign <= MaxFieldAlignmentInBits) &&1755 Context.getTargetInfo().useExplicitBitFieldAlignment())1756 UnpackedFieldOffset =1757 llvm::alignTo(UnpackedFieldOffset, ExplicitFieldAlign);1758 }1759 1760 // If we're using external layout, give the external layout a chance1761 // to override this information.1762 if (UseExternalLayout)1763 FieldOffset = updateExternalFieldOffset(D, FieldOffset);1764 1765 // Okay, place the bitfield at the calculated offset.1766 FieldOffsets.push_back(FieldOffset);1767 1768 // Bookkeeping:1769 1770 // Anonymous members don't affect the overall record alignment,1771 // except on targets where they do.1772 if (!IsMsStruct &&1773 !Context.getTargetInfo().useZeroLengthBitfieldAlignment() &&1774 !D->getIdentifier())1775 FieldAlign = UnpackedFieldAlign = 1;1776 1777 // On AIX, zero-width bitfields pad out to the natural alignment boundary,1778 // but do not increase the alignment greater than the MaxFieldAlignment, or 11779 // if packed.1780 if (isAIXLayout(Context) && !FieldSize) {1781 if (FieldPacked)1782 FieldAlign = 1;1783 if (!MaxFieldAlignment.isZero()) {1784 UnpackedFieldAlign =1785 std::min(UnpackedFieldAlign, MaxFieldAlignmentInBits);1786 FieldAlign = std::min(FieldAlign, MaxFieldAlignmentInBits);1787 }1788 }1789 1790 // Diagnose differences in layout due to padding or packing.1791 if (!UseExternalLayout)1792 CheckFieldPadding(FieldOffset, UnpaddedFieldOffset, UnpackedFieldOffset,1793 UnpackedFieldAlign, FieldPacked, D);1794 1795 // Update DataSize to include the last byte containing (part of) the bitfield.1796 1797 // For unions, this is just a max operation, as usual.1798 if (IsUnion) {1799 // For ms_struct, allocate the entire storage unit --- unless this1800 // is a zero-width bitfield, in which case just use a size of 1.1801 uint64_t RoundedFieldSize;1802 if (IsMsStruct) {1803 RoundedFieldSize = (FieldSize ? StorageUnitSize1804 : Context.getTargetInfo().getCharWidth());1805 1806 // Otherwise, allocate just the number of bytes required to store1807 // the bitfield.1808 } else {1809 RoundedFieldSize = roundUpSizeToCharAlignment(FieldSize, Context);1810 }1811 setDataSize(std::max(getDataSizeInBits(), RoundedFieldSize));1812 1813 // For non-zero-width bitfields in ms_struct structs, allocate a new1814 // storage unit if necessary.1815 } else if (IsMsStruct && FieldSize) {1816 // We should have cleared UnfilledBitsInLastUnit in every case1817 // where we changed storage units.1818 if (!UnfilledBitsInLastUnit) {1819 setDataSize(FieldOffset + StorageUnitSize);1820 UnfilledBitsInLastUnit = StorageUnitSize;1821 }1822 UnfilledBitsInLastUnit -= FieldSize;1823 LastBitfieldStorageUnitSize = StorageUnitSize;1824 1825 // Otherwise, bump the data size up to include the bitfield,1826 // including padding up to char alignment, and then remember how1827 // bits we didn't use.1828 } else {1829 uint64_t NewSizeInBits = FieldOffset + FieldSize;1830 uint64_t CharAlignment = Context.getTargetInfo().getCharAlign();1831 setDataSize(llvm::alignTo(NewSizeInBits, CharAlignment));1832 UnfilledBitsInLastUnit = getDataSizeInBits() - NewSizeInBits;1833 1834 // The only time we can get here for an ms_struct is if this is a1835 // zero-width bitfield, which doesn't count as anything for the1836 // purposes of unfilled bits.1837 LastBitfieldStorageUnitSize = 0;1838 }1839 1840 // Update the size.1841 setSize(std::max(getSizeInBits(), getDataSizeInBits()));1842 1843 // Remember max struct/class alignment.1844 UnadjustedAlignment =1845 std::max(UnadjustedAlignment, Context.toCharUnitsFromBits(FieldAlign));1846 UpdateAlignment(Context.toCharUnitsFromBits(FieldAlign),1847 Context.toCharUnitsFromBits(UnpackedFieldAlign));1848}1849 1850void ItaniumRecordLayoutBuilder::LayoutField(const FieldDecl *D,1851 bool InsertExtraPadding) {1852 auto *FieldClass = D->getType()->getAsCXXRecordDecl();1853 bool IsOverlappingEmptyField =1854 D->isPotentiallyOverlapping() && FieldClass->isEmpty();1855 1856 CharUnits FieldOffset =1857 (IsUnion || IsOverlappingEmptyField) ? CharUnits::Zero() : getDataSize();1858 1859 const bool DefaultsToAIXPowerAlignment =1860 Context.getTargetInfo().defaultsToAIXPowerAlignment();1861 bool FoundFirstNonOverlappingEmptyFieldForAIX = false;1862 if (DefaultsToAIXPowerAlignment && !HandledFirstNonOverlappingEmptyField) {1863 assert(FieldOffset == CharUnits::Zero() &&1864 "The first non-overlapping empty field should have been handled.");1865 1866 if (!IsOverlappingEmptyField) {1867 FoundFirstNonOverlappingEmptyFieldForAIX = true;1868 1869 // We're going to handle the "first member" based on1870 // `FoundFirstNonOverlappingEmptyFieldForAIX` during the current1871 // invocation of this function; record it as handled for future1872 // invocations (except for unions, because the current field does not1873 // represent all "firsts").1874 HandledFirstNonOverlappingEmptyField = !IsUnion;1875 }1876 }1877 1878 if (D->isBitField()) {1879 LayoutBitField(D);1880 return;1881 }1882 1883 uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastUnit;1884 // Reset the unfilled bits.1885 UnfilledBitsInLastUnit = 0;1886 LastBitfieldStorageUnitSize = 0;1887 1888 llvm::Triple Target = Context.getTargetInfo().getTriple();1889 1890 AlignRequirementKind AlignRequirement = AlignRequirementKind::None;1891 CharUnits FieldSize;1892 CharUnits FieldAlign;1893 // The amount of this class's dsize occupied by the field.1894 // This is equal to FieldSize unless we're permitted to pack1895 // into the field's tail padding.1896 CharUnits EffectiveFieldSize;1897 1898 auto setDeclInfo = [&](bool IsIncompleteArrayType) {1899 auto TI = Context.getTypeInfoInChars(D->getType());1900 FieldAlign = TI.Align;1901 // Flexible array members don't have any size, but they have to be1902 // aligned appropriately for their element type.1903 EffectiveFieldSize = FieldSize =1904 IsIncompleteArrayType ? CharUnits::Zero() : TI.Width;1905 AlignRequirement = TI.AlignRequirement;1906 };1907 1908 if (D->getType()->isIncompleteArrayType()) {1909 setDeclInfo(true /* IsIncompleteArrayType */);1910 } else {1911 setDeclInfo(false /* IsIncompleteArrayType */);1912 1913 // A potentially-overlapping field occupies its dsize or nvsize, whichever1914 // is larger.1915 if (D->isPotentiallyOverlapping()) {1916 const ASTRecordLayout &Layout = Context.getASTRecordLayout(FieldClass);1917 EffectiveFieldSize =1918 std::max(Layout.getNonVirtualSize(), Layout.getDataSize());1919 }1920 1921 if (IsMsStruct) {1922 // If MS bitfield layout is required, figure out what type is being1923 // laid out and align the field to the width of that type.1924 1925 // Resolve all typedefs down to their base type and round up the field1926 // alignment if necessary.1927 QualType T = Context.getBaseElementType(D->getType());1928 if (const BuiltinType *BTy = T->getAs<BuiltinType>()) {1929 CharUnits TypeSize = Context.getTypeSizeInChars(BTy);1930 1931 if (!llvm::isPowerOf2_64(TypeSize.getQuantity())) {1932 assert(1933 !Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment() &&1934 "Non PowerOf2 size in MSVC mode");1935 // Base types with sizes that aren't a power of two don't work1936 // with the layout rules for MS structs. This isn't an issue in1937 // MSVC itself since there are no such base data types there.1938 // On e.g. x86_32 mingw and linux, long double is 12 bytes though.1939 // Any structs involving that data type obviously can't be ABI1940 // compatible with MSVC regardless of how it is laid out.1941 1942 // Since ms_struct can be mass enabled (via a pragma or via the1943 // -mms-bitfields command line parameter), this can trigger for1944 // structs that don't actually need MSVC compatibility, so we1945 // need to be able to sidestep the ms_struct layout for these types.1946 1947 // Since the combination of -mms-bitfields together with structs1948 // like max_align_t (which contains a long double) for mingw is1949 // quite common (and GCC handles it silently), just handle it1950 // silently there. For other targets that have ms_struct enabled1951 // (most probably via a pragma or attribute), trigger a diagnostic1952 // that defaults to an error.1953 if (!Context.getTargetInfo().getTriple().isOSCygMing())1954 Diag(D->getLocation(), diag::warn_npot_ms_struct);1955 }1956 if (TypeSize > FieldAlign &&1957 llvm::isPowerOf2_64(TypeSize.getQuantity()))1958 FieldAlign = TypeSize;1959 }1960 }1961 }1962 1963 bool FieldPacked = (Packed && (!FieldClass || FieldClass->isPOD() ||1964 FieldClass->hasAttr<PackedAttr>() ||1965 Context.getLangOpts().getClangABICompat() <=1966 LangOptions::ClangABI::Ver15 ||1967 Target.isPS() || Target.isOSDarwin() ||1968 Target.isOSAIX())) ||1969 D->hasAttr<PackedAttr>();1970 1971 // When used as part of a typedef, or together with a 'packed' attribute, the1972 // 'aligned' attribute can be used to decrease alignment. In that case, it1973 // overrides any computed alignment we have, and there is no need to upgrade1974 // the alignment.1975 auto alignedAttrCanDecreaseAIXAlignment = [AlignRequirement, FieldPacked] {1976 // Enum alignment sources can be safely ignored here, because this only1977 // helps decide whether we need the AIX alignment upgrade, which only1978 // applies to floating-point types.1979 return AlignRequirement == AlignRequirementKind::RequiredByTypedef ||1980 (AlignRequirement == AlignRequirementKind::RequiredByRecord &&1981 FieldPacked);1982 };1983 1984 // The AIX `power` alignment rules apply the natural alignment of the1985 // "first member" if it is of a floating-point data type (or is an aggregate1986 // whose recursively "first" member or element is such a type). The alignment1987 // associated with these types for subsequent members use an alignment value1988 // where the floating-point data type is considered to have 4-byte alignment.1989 //1990 // For the purposes of the foregoing: vtable pointers, non-empty base classes,1991 // and zero-width bit-fields count as prior members; members of empty class1992 // types marked `no_unique_address` are not considered to be prior members.1993 CharUnits PreferredAlign = FieldAlign;1994 if (DefaultsToAIXPowerAlignment && !alignedAttrCanDecreaseAIXAlignment() &&1995 (FoundFirstNonOverlappingEmptyFieldForAIX || IsNaturalAlign)) {1996 auto performBuiltinTypeAlignmentUpgrade = [&](const BuiltinType *BTy) {1997 if (BTy->getKind() == BuiltinType::Double ||1998 BTy->getKind() == BuiltinType::LongDouble) {1999 assert(PreferredAlign == CharUnits::fromQuantity(4) &&2000 "No need to upgrade the alignment value.");2001 PreferredAlign = CharUnits::fromQuantity(8);2002 }2003 };2004 2005 const Type *BaseTy = D->getType()->getBaseElementTypeUnsafe();2006 if (const ComplexType *CTy = BaseTy->getAs<ComplexType>()) {2007 performBuiltinTypeAlignmentUpgrade(2008 CTy->getElementType()->castAs<BuiltinType>());2009 } else if (const BuiltinType *BTy = BaseTy->getAs<BuiltinType>()) {2010 performBuiltinTypeAlignmentUpgrade(BTy);2011 } else if (const RecordType *RT = BaseTy->getAsCanonical<RecordType>()) {2012 const RecordDecl *RD = RT->getDecl();2013 const ASTRecordLayout &FieldRecord = Context.getASTRecordLayout(RD);2014 PreferredAlign = FieldRecord.getPreferredAlignment();2015 }2016 }2017 2018 // The align if the field is not packed. This is to check if the attribute2019 // was unnecessary (-Wpacked).2020 CharUnits UnpackedFieldAlign = FieldAlign;2021 CharUnits PackedFieldAlign = CharUnits::One();2022 CharUnits UnpackedFieldOffset = FieldOffset;2023 CharUnits OriginalFieldAlign = UnpackedFieldAlign;2024 2025 CharUnits MaxAlignmentInChars =2026 Context.toCharUnitsFromBits(D->getMaxAlignment());2027 PackedFieldAlign = std::max(PackedFieldAlign, MaxAlignmentInChars);2028 PreferredAlign = std::max(PreferredAlign, MaxAlignmentInChars);2029 UnpackedFieldAlign = std::max(UnpackedFieldAlign, MaxAlignmentInChars);2030 2031 // The maximum field alignment overrides the aligned attribute.2032 if (!MaxFieldAlignment.isZero()) {2033 PackedFieldAlign = std::min(PackedFieldAlign, MaxFieldAlignment);2034 PreferredAlign = std::min(PreferredAlign, MaxFieldAlignment);2035 UnpackedFieldAlign = std::min(UnpackedFieldAlign, MaxFieldAlignment);2036 }2037 2038 2039 if (!FieldPacked)2040 FieldAlign = UnpackedFieldAlign;2041 if (DefaultsToAIXPowerAlignment)2042 UnpackedFieldAlign = PreferredAlign;2043 if (FieldPacked) {2044 PreferredAlign = PackedFieldAlign;2045 FieldAlign = PackedFieldAlign;2046 }2047 2048 CharUnits AlignTo =2049 !DefaultsToAIXPowerAlignment ? FieldAlign : PreferredAlign;2050 // Round up the current record size to the field's alignment boundary.2051 FieldOffset = FieldOffset.alignTo(AlignTo);2052 UnpackedFieldOffset = UnpackedFieldOffset.alignTo(UnpackedFieldAlign);2053 2054 if (UseExternalLayout) {2055 FieldOffset = Context.toCharUnitsFromBits(2056 updateExternalFieldOffset(D, Context.toBits(FieldOffset)));2057 2058 if (!IsUnion && EmptySubobjects) {2059 // Record the fact that we're placing a field at this offset.2060 bool Allowed = EmptySubobjects->CanPlaceFieldAtOffset(D, FieldOffset);2061 (void)Allowed;2062 assert(Allowed && "Externally-placed field cannot be placed here");2063 }2064 } else {2065 if (!IsUnion && EmptySubobjects) {2066 // Check if we can place the field at this offset.2067 while (!EmptySubobjects->CanPlaceFieldAtOffset(D, FieldOffset)) {2068 // We couldn't place the field at the offset. Try again at a new offset.2069 // We try offset 0 (for an empty field) and then dsize(C) onwards.2070 if (FieldOffset == CharUnits::Zero() &&2071 getDataSize() != CharUnits::Zero())2072 FieldOffset = getDataSize().alignTo(AlignTo);2073 else2074 FieldOffset += AlignTo;2075 }2076 }2077 }2078 2079 // Place this field at the current location.2080 FieldOffsets.push_back(Context.toBits(FieldOffset));2081 2082 if (!UseExternalLayout)2083 CheckFieldPadding(Context.toBits(FieldOffset), UnpaddedFieldOffset,2084 Context.toBits(UnpackedFieldOffset),2085 Context.toBits(UnpackedFieldAlign), FieldPacked, D);2086 2087 if (InsertExtraPadding) {2088 CharUnits ASanAlignment = CharUnits::fromQuantity(8);2089 CharUnits ExtraSizeForAsan = ASanAlignment;2090 if (!FieldSize.isMultipleOf(ASanAlignment))2091 ExtraSizeForAsan += ASanAlignment - (FieldSize % ASanAlignment);2092 EffectiveFieldSize = FieldSize = FieldSize + ExtraSizeForAsan;2093 }2094 2095 // Reserve space for this field.2096 if (!IsOverlappingEmptyField) {2097 uint64_t EffectiveFieldSizeInBits = Context.toBits(EffectiveFieldSize);2098 if (IsUnion)2099 setDataSize(std::max(getDataSizeInBits(), EffectiveFieldSizeInBits));2100 else2101 setDataSize(FieldOffset + EffectiveFieldSize);2102 2103 PaddedFieldSize = std::max(PaddedFieldSize, FieldOffset + FieldSize);2104 setSize(std::max(getSizeInBits(), getDataSizeInBits()));2105 } else {2106 setSize(std::max(getSizeInBits(),2107 (uint64_t)Context.toBits(FieldOffset + FieldSize)));2108 }2109 2110 // Remember max struct/class ABI-specified alignment.2111 UnadjustedAlignment = std::max(UnadjustedAlignment, FieldAlign);2112 UpdateAlignment(FieldAlign, UnpackedFieldAlign, PreferredAlign);2113 2114 // For checking the alignment of inner fields against2115 // the alignment of its parent record.2116 if (const RecordDecl *RD = D->getParent()) {2117 // Check if packed attribute or pragma pack is present.2118 if (RD->hasAttr<PackedAttr>() || !MaxFieldAlignment.isZero())2119 if (FieldAlign < OriginalFieldAlign)2120 if (D->getType()->isRecordType()) {2121 // If the offset is not a multiple of the alignment of2122 // the type, raise the warning.2123 // TODO: Takes no account the alignment of the outer struct2124 if (!FieldOffset.isMultipleOf(OriginalFieldAlign))2125 Diag(D->getLocation(), diag::warn_unaligned_access)2126 << Context.getCanonicalTagType(RD) << D->getName()2127 << D->getType();2128 }2129 }2130 2131 if (Packed && !FieldPacked && PackedFieldAlign < FieldAlign)2132 Diag(D->getLocation(), diag::warn_unpacked_field) << D;2133}2134 2135void ItaniumRecordLayoutBuilder::FinishLayout(const NamedDecl *D) {2136 // In C++, records cannot be of size 0.2137 if (Context.getLangOpts().CPlusPlus && getSizeInBits() == 0) {2138 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {2139 // Compatibility with gcc requires a class (pod or non-pod)2140 // which is not empty but of size 0; such as having fields of2141 // array of zero-length, remains of Size 02142 if (RD->isEmpty())2143 setSize(CharUnits::One());2144 }2145 else2146 setSize(CharUnits::One());2147 }2148 2149 // If we have any remaining field tail padding, include that in the overall2150 // size.2151 setSize(std::max(getSizeInBits(), (uint64_t)Context.toBits(PaddedFieldSize)));2152 2153 // Finally, round the size of the record up to the alignment of the2154 // record itself.2155 uint64_t UnpaddedSize = getSizeInBits() - UnfilledBitsInLastUnit;2156 uint64_t UnpackedSizeInBits =2157 llvm::alignTo(getSizeInBits(), Context.toBits(UnpackedAlignment));2158 2159 uint64_t RoundedSize = llvm::alignTo(2160 getSizeInBits(),2161 Context.toBits(!Context.getTargetInfo().defaultsToAIXPowerAlignment()2162 ? Alignment2163 : PreferredAlignment));2164 2165 if (UseExternalLayout) {2166 // If we're inferring alignment, and the external size is smaller than2167 // our size after we've rounded up to alignment, conservatively set the2168 // alignment to 1.2169 if (InferAlignment && External.Size < RoundedSize) {2170 Alignment = CharUnits::One();2171 PreferredAlignment = CharUnits::One();2172 InferAlignment = false;2173 }2174 setSize(External.Size);2175 return;2176 }2177 2178 // Set the size to the final size.2179 setSize(RoundedSize);2180 2181 unsigned CharBitNum = Context.getTargetInfo().getCharWidth();2182 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {2183 // Warn if padding was introduced to the struct/class/union.2184 if (getSizeInBits() > UnpaddedSize) {2185 unsigned PadSize = getSizeInBits() - UnpaddedSize;2186 bool InBits = true;2187 if (PadSize % CharBitNum == 0) {2188 PadSize = PadSize / CharBitNum;2189 InBits = false;2190 }2191 Diag(RD->getLocation(), diag::warn_padded_struct_size)2192 << Context.getCanonicalTagType(RD) << PadSize2193 << (InBits ? 1 : 0); // (byte|bit)2194 }2195 2196 const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD);2197 2198 // Warn if we packed it unnecessarily, when the unpacked alignment is not2199 // greater than the one after packing, the size in bits doesn't change and2200 // the offset of each field is identical.2201 // Unless the type is non-POD (for Clang ABI > 15), where the packed2202 // attribute on such a type does allow the type to be packed into other2203 // structures that use the packed attribute.2204 if (Packed && UnpackedAlignment <= Alignment &&2205 UnpackedSizeInBits == getSizeInBits() && !HasPackedField &&2206 (!CXXRD || CXXRD->isPOD() ||2207 Context.getLangOpts().getClangABICompat() <=2208 LangOptions::ClangABI::Ver15))2209 Diag(D->getLocation(), diag::warn_unnecessary_packed)2210 << Context.getCanonicalTagType(RD);2211 }2212}2213 2214void ItaniumRecordLayoutBuilder::UpdateAlignment(2215 CharUnits NewAlignment, CharUnits UnpackedNewAlignment,2216 CharUnits PreferredNewAlignment) {2217 // The alignment is not modified when using 'mac68k' alignment or when2218 // we have an externally-supplied layout that also provides overall alignment.2219 if (IsMac68kAlign || (UseExternalLayout && !InferAlignment))2220 return;2221 2222 if (NewAlignment > Alignment) {2223 assert(llvm::isPowerOf2_64(NewAlignment.getQuantity()) &&2224 "Alignment not a power of 2");2225 Alignment = NewAlignment;2226 }2227 2228 if (UnpackedNewAlignment > UnpackedAlignment) {2229 assert(llvm::isPowerOf2_64(UnpackedNewAlignment.getQuantity()) &&2230 "Alignment not a power of 2");2231 UnpackedAlignment = UnpackedNewAlignment;2232 }2233 2234 if (PreferredNewAlignment > PreferredAlignment) {2235 assert(llvm::isPowerOf2_64(PreferredNewAlignment.getQuantity()) &&2236 "Alignment not a power of 2");2237 PreferredAlignment = PreferredNewAlignment;2238 }2239}2240 2241uint64_t2242ItaniumRecordLayoutBuilder::updateExternalFieldOffset(const FieldDecl *Field,2243 uint64_t ComputedOffset) {2244 uint64_t ExternalFieldOffset = External.getExternalFieldOffset(Field);2245 2246 if (InferAlignment && ExternalFieldOffset < ComputedOffset) {2247 // The externally-supplied field offset is before the field offset we2248 // computed. Assume that the structure is packed.2249 Alignment = CharUnits::One();2250 PreferredAlignment = CharUnits::One();2251 InferAlignment = false;2252 }2253 2254 // Use the externally-supplied field offset.2255 return ExternalFieldOffset;2256}2257 2258/// Get diagnostic %select index for tag kind for2259/// field padding diagnostic message.2260/// WARNING: Indexes apply to particular diagnostics only!2261///2262/// \returns diagnostic %select index.2263static unsigned getPaddingDiagFromTagKind(TagTypeKind Tag) {2264 switch (Tag) {2265 case TagTypeKind::Struct:2266 return 0;2267 case TagTypeKind::Interface:2268 return 1;2269 case TagTypeKind::Class:2270 return 2;2271 default: llvm_unreachable("Invalid tag kind for field padding diagnostic!");2272 }2273}2274 2275static void CheckFieldPadding(const ASTContext &Context, bool IsUnion,2276 uint64_t Offset, uint64_t UnpaddedOffset,2277 const FieldDecl *D) {2278 // We let objc ivars without warning, objc interfaces generally are not used2279 // for padding tricks.2280 if (isa<ObjCIvarDecl>(D))2281 return;2282 2283 // Don't warn about structs created without a SourceLocation. This can2284 // be done by clients of the AST, such as codegen.2285 if (D->getLocation().isInvalid())2286 return;2287 2288 unsigned CharBitNum = Context.getTargetInfo().getCharWidth();2289 2290 // Warn if padding was introduced to the struct/class.2291 if (!IsUnion && Offset > UnpaddedOffset) {2292 unsigned PadSize = Offset - UnpaddedOffset;2293 bool InBits = true;2294 if (PadSize % CharBitNum == 0) {2295 PadSize = PadSize / CharBitNum;2296 InBits = false;2297 }2298 if (D->getIdentifier()) {2299 auto Diagnostic = D->isBitField() ? diag::warn_padded_struct_bitfield2300 : diag::warn_padded_struct_field;2301 Context.getDiagnostics().Report(D->getLocation(),2302 Diagnostic)2303 << getPaddingDiagFromTagKind(D->getParent()->getTagKind())2304 << Context.getCanonicalTagType(D->getParent()) << PadSize2305 << (InBits ? 1 : 0) // (byte|bit)2306 << D->getIdentifier();2307 } else {2308 auto Diagnostic = D->isBitField() ? diag::warn_padded_struct_anon_bitfield2309 : diag::warn_padded_struct_anon_field;2310 Context.getDiagnostics().Report(D->getLocation(),2311 Diagnostic)2312 << getPaddingDiagFromTagKind(D->getParent()->getTagKind())2313 << Context.getCanonicalTagType(D->getParent()) << PadSize2314 << (InBits ? 1 : 0); // (byte|bit)2315 }2316 }2317}2318 2319void ItaniumRecordLayoutBuilder::CheckFieldPadding(2320 uint64_t Offset, uint64_t UnpaddedOffset, uint64_t UnpackedOffset,2321 unsigned UnpackedAlign, bool isPacked, const FieldDecl *D) {2322 ::CheckFieldPadding(Context, IsUnion, Offset, UnpaddedOffset, D);2323 if (isPacked && Offset != UnpackedOffset) {2324 HasPackedField = true;2325 }2326}2327 2328static const CXXMethodDecl *computeKeyFunction(ASTContext &Context,2329 const CXXRecordDecl *RD) {2330 // If a class isn't polymorphic it doesn't have a key function.2331 if (!RD->isPolymorphic())2332 return nullptr;2333 2334 // A class that is not externally visible doesn't have a key function. (Or2335 // at least, there's no point to assigning a key function to such a class;2336 // this doesn't affect the ABI.)2337 if (!RD->isExternallyVisible())2338 return nullptr;2339 2340 // Template instantiations don't have key functions per Itanium C++ ABI 5.2.6.2341 // Same behavior as GCC.2342 TemplateSpecializationKind TSK = RD->getTemplateSpecializationKind();2343 if (TSK == TSK_ImplicitInstantiation ||2344 TSK == TSK_ExplicitInstantiationDeclaration ||2345 TSK == TSK_ExplicitInstantiationDefinition)2346 return nullptr;2347 2348 bool allowInlineFunctions =2349 Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline();2350 2351 for (const CXXMethodDecl *MD : RD->methods()) {2352 if (!MD->isVirtual())2353 continue;2354 2355 if (MD->isPureVirtual())2356 continue;2357 2358 // Ignore implicit member functions, they are always marked as inline, but2359 // they don't have a body until they're defined.2360 if (MD->isImplicit())2361 continue;2362 2363 if (MD->isInlineSpecified() || MD->isConstexpr())2364 continue;2365 2366 if (MD->hasInlineBody())2367 continue;2368 2369 // Ignore inline deleted or defaulted functions.2370 if (!MD->isUserProvided())2371 continue;2372 2373 // In certain ABIs, ignore functions with out-of-line inline definitions.2374 if (!allowInlineFunctions) {2375 const FunctionDecl *Def;2376 if (MD->hasBody(Def) && Def->isInlineSpecified())2377 continue;2378 }2379 2380 if (Context.getLangOpts().CUDA) {2381 // While compiler may see key method in this TU, during CUDA2382 // compilation we should ignore methods that are not accessible2383 // on this side of compilation.2384 if (Context.getLangOpts().CUDAIsDevice) {2385 // In device mode ignore methods without __device__ attribute.2386 if (!MD->hasAttr<CUDADeviceAttr>())2387 continue;2388 } else {2389 // In host mode ignore __device__-only methods.2390 if (!MD->hasAttr<CUDAHostAttr>() && MD->hasAttr<CUDADeviceAttr>())2391 continue;2392 }2393 }2394 2395 // If the key function is dllimport but the class isn't, then the class has2396 // no key function. The DLL that exports the key function won't export the2397 // vtable in this case.2398 if (MD->hasAttr<DLLImportAttr>() && !RD->hasAttr<DLLImportAttr>() &&2399 !Context.getTargetInfo().hasPS4DLLImportExport())2400 return nullptr;2401 2402 // We found it.2403 return MD;2404 }2405 2406 return nullptr;2407}2408 2409DiagnosticBuilder ItaniumRecordLayoutBuilder::Diag(SourceLocation Loc,2410 unsigned DiagID) {2411 return Context.getDiagnostics().Report(Loc, DiagID);2412}2413 2414/// Does the target C++ ABI require us to skip over the tail-padding2415/// of the given class (considering it as a base class) when allocating2416/// objects?2417static bool mustSkipTailPadding(TargetCXXABI ABI, const CXXRecordDecl *RD) {2418 switch (ABI.getTailPaddingUseRules()) {2419 case TargetCXXABI::AlwaysUseTailPadding:2420 return false;2421 2422 case TargetCXXABI::UseTailPaddingUnlessPOD03:2423 // FIXME: To the extent that this is meant to cover the Itanium ABI2424 // rules, we should implement the restrictions about over-sized2425 // bitfields:2426 //2427 // http://itanium-cxx-abi.github.io/cxx-abi/abi.html#POD :2428 // In general, a type is considered a POD for the purposes of2429 // layout if it is a POD type (in the sense of ISO C++2430 // [basic.types]). However, a POD-struct or POD-union (in the2431 // sense of ISO C++ [class]) with a bitfield member whose2432 // declared width is wider than the declared type of the2433 // bitfield is not a POD for the purpose of layout. Similarly,2434 // an array type is not a POD for the purpose of layout if the2435 // element type of the array is not a POD for the purpose of2436 // layout.2437 //2438 // Where references to the ISO C++ are made in this paragraph,2439 // the Technical Corrigendum 1 version of the standard is2440 // intended.2441 return RD->isPOD();2442 2443 case TargetCXXABI::UseTailPaddingUnlessPOD11:2444 // This is equivalent to RD->getTypeForDecl().isCXX11PODType(),2445 // but with a lot of abstraction penalty stripped off. This does2446 // assume that these properties are set correctly even in C++982447 // mode; fortunately, that is true because we want to assign2448 // consistently semantics to the type-traits intrinsics (or at2449 // least as many of them as possible).2450 return RD->isTrivial() && RD->isCXX11StandardLayout();2451 }2452 2453 llvm_unreachable("bad tail-padding use kind");2454}2455 2456// This section contains an implementation of struct layout that is, up to the2457// included tests, compatible with cl.exe (2013). The layout produced is2458// significantly different than those produced by the Itanium ABI. Here we note2459// the most important differences.2460//2461// * The alignment of bitfields in unions is ignored when computing the2462// alignment of the union.2463// * The existence of zero-width bitfield that occurs after anything other than2464// a non-zero length bitfield is ignored.2465// * There is no explicit primary base for the purposes of layout. All bases2466// with vfptrs are laid out first, followed by all bases without vfptrs.2467// * The Itanium equivalent vtable pointers are split into a vfptr (virtual2468// function pointer) and a vbptr (virtual base pointer). They can each be2469// shared with a, non-virtual bases. These bases need not be the same. vfptrs2470// always occur at offset 0. vbptrs can occur at an arbitrary offset and are2471// placed after the lexicographically last non-virtual base. This placement2472// is always before fields but can be in the middle of the non-virtual bases2473// due to the two-pass layout scheme for non-virtual-bases.2474// * Virtual bases sometimes require a 'vtordisp' field that is laid out before2475// the virtual base and is used in conjunction with virtual overrides during2476// construction and destruction. This is always a 4 byte value and is used as2477// an alternative to constructor vtables.2478// * vtordisps are allocated in a block of memory with size and alignment equal2479// to the alignment of the completed structure (before applying __declspec(2480// align())). The vtordisp always occur at the end of the allocation block,2481// immediately prior to the virtual base.2482// * vfptrs are injected after all bases and fields have been laid out. In2483// order to guarantee proper alignment of all fields, the vfptr injection2484// pushes all bases and fields back by the alignment imposed by those bases2485// and fields. This can potentially add a significant amount of padding.2486// vfptrs are always injected at offset 0.2487// * vbptrs are injected after all bases and fields have been laid out. In2488// order to guarantee proper alignment of all fields, the vfptr injection2489// pushes all bases and fields back by the alignment imposed by those bases2490// and fields. This can potentially add a significant amount of padding.2491// vbptrs are injected immediately after the last non-virtual base as2492// lexicographically ordered in the code. If this site isn't pointer aligned2493// the vbptr is placed at the next properly aligned location. Enough padding2494// is added to guarantee a fit.2495// * The last zero sized non-virtual base can be placed at the end of the2496// struct (potentially aliasing another object), or may alias with the first2497// field, even if they are of the same type.2498// * The last zero size virtual base may be placed at the end of the struct2499// potentially aliasing another object.2500// * The ABI attempts to avoid aliasing of zero sized bases by adding padding2501// between bases or vbases with specific properties. The criteria for2502// additional padding between two bases is that the first base is zero sized2503// or ends with a zero sized subobject and the second base is zero sized or2504// trails with a zero sized base or field (sharing of vfptrs can reorder the2505// layout of the so the leading base is not always the first one declared).2506// This rule does take into account fields that are not records, so padding2507// will occur even if the last field is, e.g. an int. The padding added for2508// bases is 1 byte. The padding added between vbases depends on the alignment2509// of the object but is at least 4 bytes (in both 32 and 64 bit modes).2510// * There is no concept of non-virtual alignment, non-virtual alignment and2511// alignment are always identical.2512// * There is a distinction between alignment and required alignment.2513// __declspec(align) changes the required alignment of a struct. This2514// alignment is _always_ obeyed, even in the presence of #pragma pack. A2515// record inherits required alignment from all of its fields and bases.2516// * __declspec(align) on bitfields has the effect of changing the bitfield's2517// alignment instead of its required alignment. This is the only known way2518// to make the alignment of a struct bigger than 8. Interestingly enough2519// this alignment is also immune to the effects of #pragma pack and can be2520// used to create structures with large alignment under #pragma pack.2521// However, because it does not impact required alignment, such a structure,2522// when used as a field or base, will not be aligned if #pragma pack is2523// still active at the time of use.2524//2525// Known incompatibilities:2526// * all: #pragma pack between fields in a record2527// * 2010 and back: If the last field in a record is a bitfield, every object2528// laid out after the record will have extra padding inserted before it. The2529// extra padding will have size equal to the size of the storage class of the2530// bitfield. 0 sized bitfields don't exhibit this behavior and the extra2531// padding can be avoided by adding a 0 sized bitfield after the non-zero-2532// sized bitfield.2533// * 2012 and back: In 64-bit mode, if the alignment of a record is 16 or2534// greater due to __declspec(align()) then a second layout phase occurs after2535// The locations of the vf and vb pointers are known. This layout phase2536// suffers from the "last field is a bitfield" bug in 2010 and results in2537// _every_ field getting padding put in front of it, potentially including the2538// vfptr, leaving the vfprt at a non-zero location which results in a fault if2539// anything tries to read the vftbl. The second layout phase also treats2540// bitfields as separate entities and gives them each storage rather than2541// packing them. Additionally, because this phase appears to perform a2542// (an unstable) sort on the members before laying them out and because merged2543// bitfields have the same address, the bitfields end up in whatever order2544// the sort left them in, a behavior we could never hope to replicate.2545 2546namespace {2547struct MicrosoftRecordLayoutBuilder {2548 struct ElementInfo {2549 CharUnits Size;2550 CharUnits Alignment;2551 };2552 typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;2553 MicrosoftRecordLayoutBuilder(const ASTContext &Context,2554 EmptySubobjectMap *EmptySubobjects)2555 : Context(Context), EmptySubobjects(EmptySubobjects),2556 RemainingBitsInField(0) {}2557 2558private:2559 MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;2560 void operator=(const MicrosoftRecordLayoutBuilder &) = delete;2561public:2562 void layout(const RecordDecl *RD);2563 void cxxLayout(const CXXRecordDecl *RD);2564 /// Initializes size and alignment and honors some flags.2565 void initializeLayout(const RecordDecl *RD);2566 /// Initialized C++ layout, compute alignment and virtual alignment and2567 /// existence of vfptrs and vbptrs. Alignment is needed before the vfptr is2568 /// laid out.2569 void initializeCXXLayout(const CXXRecordDecl *RD);2570 void layoutNonVirtualBases(const CXXRecordDecl *RD);2571 void layoutNonVirtualBase(const CXXRecordDecl *RD,2572 const CXXRecordDecl *BaseDecl,2573 const ASTRecordLayout &BaseLayout,2574 const ASTRecordLayout *&PreviousBaseLayout);2575 void injectVFPtr(const CXXRecordDecl *RD);2576 void injectVBPtr(const CXXRecordDecl *RD);2577 /// Lays out the fields of the record. Also rounds size up to2578 /// alignment.2579 void layoutFields(const RecordDecl *RD);2580 void layoutField(const FieldDecl *FD);2581 void layoutBitField(const FieldDecl *FD);2582 /// Lays out a single zero-width bit-field in the record and handles2583 /// special cases associated with zero-width bit-fields.2584 void layoutZeroWidthBitField(const FieldDecl *FD);2585 void layoutVirtualBases(const CXXRecordDecl *RD);2586 void finalizeLayout(const RecordDecl *RD);2587 /// Gets the size and alignment of a base taking pragma pack and2588 /// __declspec(align) into account.2589 ElementInfo getAdjustedElementInfo(const ASTRecordLayout &Layout);2590 /// Gets the size and alignment of a field taking pragma pack and2591 /// __declspec(align) into account. It also updates RequiredAlignment as a2592 /// side effect because it is most convenient to do so here.2593 ElementInfo getAdjustedElementInfo(const FieldDecl *FD);2594 /// Places a field at an offset in CharUnits.2595 void placeFieldAtOffset(CharUnits FieldOffset) {2596 FieldOffsets.push_back(Context.toBits(FieldOffset));2597 }2598 /// Places a bitfield at a bit offset.2599 void placeFieldAtBitOffset(uint64_t FieldOffset) {2600 FieldOffsets.push_back(FieldOffset);2601 }2602 /// Compute the set of virtual bases for which vtordisps are required.2603 void computeVtorDispSet(2604 llvm::SmallPtrSetImpl<const CXXRecordDecl *> &HasVtorDispSet,2605 const CXXRecordDecl *RD) const;2606 const ASTContext &Context;2607 EmptySubobjectMap *EmptySubobjects;2608 2609 /// The size of the record being laid out.2610 CharUnits Size;2611 /// The non-virtual size of the record layout.2612 CharUnits NonVirtualSize;2613 /// The data size of the record layout.2614 CharUnits DataSize;2615 /// The current alignment of the record layout.2616 CharUnits Alignment;2617 /// The maximum allowed field alignment. This is set by #pragma pack.2618 CharUnits MaxFieldAlignment;2619 /// The alignment that this record must obey. This is imposed by2620 /// __declspec(align()) on the record itself or one of its fields or bases.2621 CharUnits RequiredAlignment;2622 /// The size of the allocation of the currently active bitfield.2623 /// This value isn't meaningful unless LastFieldIsNonZeroWidthBitfield2624 /// is true.2625 CharUnits CurrentBitfieldSize;2626 /// Offset to the virtual base table pointer (if one exists).2627 CharUnits VBPtrOffset;2628 /// Minimum record size possible.2629 CharUnits MinEmptyStructSize;2630 /// The size and alignment info of a pointer.2631 ElementInfo PointerInfo;2632 /// The primary base class (if one exists).2633 const CXXRecordDecl *PrimaryBase;2634 /// The class we share our vb-pointer with.2635 const CXXRecordDecl *SharedVBPtrBase;2636 /// The collection of field offsets.2637 SmallVector<uint64_t, 16> FieldOffsets;2638 /// Base classes and their offsets in the record.2639 BaseOffsetsMapTy Bases;2640 /// virtual base classes and their offsets in the record.2641 ASTRecordLayout::VBaseOffsetsMapTy VBases;2642 /// The number of remaining bits in our last bitfield allocation.2643 unsigned RemainingBitsInField;2644 bool IsUnion : 1;2645 /// True if the last field laid out was a bitfield and was not 02646 /// width.2647 bool LastFieldIsNonZeroWidthBitfield : 1;2648 /// True if the class has its own vftable pointer.2649 bool HasOwnVFPtr : 1;2650 /// True if the class has a vbtable pointer.2651 bool HasVBPtr : 1;2652 /// True if the last sub-object within the type is zero sized or the2653 /// object itself is zero sized. This *does not* count members that are not2654 /// records. Only used for MS-ABI.2655 bool EndsWithZeroSizedObject : 1;2656 /// True if this class is zero sized or first base is zero sized or2657 /// has this property. Only used for MS-ABI.2658 bool LeadsWithZeroSizedBase : 1;2659 2660 /// True if the external AST source provided a layout for this record.2661 bool UseExternalLayout : 1;2662 2663 /// The layout provided by the external AST source. Only active if2664 /// UseExternalLayout is true.2665 ExternalLayout External;2666};2667} // namespace2668 2669MicrosoftRecordLayoutBuilder::ElementInfo2670MicrosoftRecordLayoutBuilder::getAdjustedElementInfo(2671 const ASTRecordLayout &Layout) {2672 ElementInfo Info;2673 Info.Alignment = Layout.getAlignment();2674 // Respect pragma pack.2675 if (!MaxFieldAlignment.isZero())2676 Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment);2677 // Track zero-sized subobjects here where it's already available.2678 EndsWithZeroSizedObject = Layout.endsWithZeroSizedObject();2679 // Respect required alignment, this is necessary because we may have adjusted2680 // the alignment in the case of pragma pack. Note that the required alignment2681 // doesn't actually apply to the struct alignment at this point.2682 Alignment = std::max(Alignment, Info.Alignment);2683 RequiredAlignment = std::max(RequiredAlignment, Layout.getRequiredAlignment());2684 Info.Alignment = std::max(Info.Alignment, Layout.getRequiredAlignment());2685 Info.Size = Layout.getNonVirtualSize();2686 return Info;2687}2688 2689MicrosoftRecordLayoutBuilder::ElementInfo2690MicrosoftRecordLayoutBuilder::getAdjustedElementInfo(2691 const FieldDecl *FD) {2692 // Get the alignment of the field type's natural alignment, ignore any2693 // alignment attributes.2694 auto TInfo =2695 Context.getTypeInfoInChars(FD->getType()->getUnqualifiedDesugaredType());2696 ElementInfo Info{TInfo.Width, TInfo.Align};2697 // Respect align attributes on the field.2698 CharUnits FieldRequiredAlignment =2699 Context.toCharUnitsFromBits(FD->getMaxAlignment());2700 // Respect align attributes on the type.2701 if (Context.isAlignmentRequired(FD->getType()))2702 FieldRequiredAlignment = std::max(2703 Context.getTypeAlignInChars(FD->getType()), FieldRequiredAlignment);2704 // Respect attributes applied to subobjects of the field.2705 if (FD->isBitField())2706 // For some reason __declspec align impacts alignment rather than required2707 // alignment when it is applied to bitfields.2708 Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment);2709 else {2710 if (const auto *RT = FD->getType()2711 ->getBaseElementTypeUnsafe()2712 ->getAsCanonical<RecordType>()) {2713 auto const &Layout = Context.getASTRecordLayout(RT->getDecl());2714 EndsWithZeroSizedObject = Layout.endsWithZeroSizedObject();2715 FieldRequiredAlignment = std::max(FieldRequiredAlignment,2716 Layout.getRequiredAlignment());2717 }2718 // Capture required alignment as a side-effect.2719 RequiredAlignment = std::max(RequiredAlignment, FieldRequiredAlignment);2720 }2721 // Respect pragma pack, attribute pack and declspec align2722 if (!MaxFieldAlignment.isZero())2723 Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment);2724 if (FD->hasAttr<PackedAttr>())2725 Info.Alignment = CharUnits::One();2726 Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment);2727 return Info;2728}2729 2730void MicrosoftRecordLayoutBuilder::layout(const RecordDecl *RD) {2731 // For C record layout, zero-sized records always have size 4.2732 MinEmptyStructSize = CharUnits::fromQuantity(4);2733 initializeLayout(RD);2734 layoutFields(RD);2735 DataSize = Size = Size.alignTo(Alignment);2736 RequiredAlignment = std::max(2737 RequiredAlignment, Context.toCharUnitsFromBits(RD->getMaxAlignment()));2738 finalizeLayout(RD);2739}2740 2741void MicrosoftRecordLayoutBuilder::cxxLayout(const CXXRecordDecl *RD) {2742 // The C++ standard says that empty structs have size 1.2743 MinEmptyStructSize = CharUnits::One();2744 initializeLayout(RD);2745 initializeCXXLayout(RD);2746 layoutNonVirtualBases(RD);2747 layoutFields(RD);2748 injectVBPtr(RD);2749 injectVFPtr(RD);2750 if (HasOwnVFPtr || (HasVBPtr && !SharedVBPtrBase))2751 Alignment = std::max(Alignment, PointerInfo.Alignment);2752 auto RoundingAlignment = Alignment;2753 if (!MaxFieldAlignment.isZero())2754 RoundingAlignment = std::min(RoundingAlignment, MaxFieldAlignment);2755 if (!UseExternalLayout)2756 Size = Size.alignTo(RoundingAlignment);2757 NonVirtualSize = Size;2758 RequiredAlignment = std::max(2759 RequiredAlignment, Context.toCharUnitsFromBits(RD->getMaxAlignment()));2760 layoutVirtualBases(RD);2761 finalizeLayout(RD);2762}2763 2764void MicrosoftRecordLayoutBuilder::initializeLayout(const RecordDecl *RD) {2765 IsUnion = RD->isUnion();2766 Size = CharUnits::Zero();2767 Alignment = CharUnits::One();2768 // In 64-bit mode we always perform an alignment step after laying out vbases.2769 // In 32-bit mode we do not. The check to see if we need to perform alignment2770 // checks the RequiredAlignment field and performs alignment if it isn't 0.2771 RequiredAlignment = Context.getTargetInfo().getTriple().isArch64Bit()2772 ? CharUnits::One()2773 : CharUnits::Zero();2774 // Compute the maximum field alignment.2775 MaxFieldAlignment = CharUnits::Zero();2776 // Honor the default struct packing maximum alignment flag.2777 if (unsigned DefaultMaxFieldAlignment = Context.getLangOpts().PackStruct)2778 MaxFieldAlignment = CharUnits::fromQuantity(DefaultMaxFieldAlignment);2779 // Honor the packing attribute. The MS-ABI ignores pragma pack if its larger2780 // than the pointer size.2781 if (const MaxFieldAlignmentAttr *MFAA = RD->getAttr<MaxFieldAlignmentAttr>()){2782 unsigned PackedAlignment = MFAA->getAlignment();2783 if (PackedAlignment <=2784 Context.getTargetInfo().getPointerWidth(LangAS::Default))2785 MaxFieldAlignment = Context.toCharUnitsFromBits(PackedAlignment);2786 }2787 // Packed attribute forces max field alignment to be 1.2788 if (RD->hasAttr<PackedAttr>())2789 MaxFieldAlignment = CharUnits::One();2790 2791 // Try to respect the external layout if present.2792 UseExternalLayout = false;2793 if (ExternalASTSource *Source = Context.getExternalSource())2794 UseExternalLayout = Source->layoutRecordType(2795 RD, External.Size, External.Align, External.FieldOffsets,2796 External.BaseOffsets, External.VirtualBaseOffsets);2797}2798 2799void2800MicrosoftRecordLayoutBuilder::initializeCXXLayout(const CXXRecordDecl *RD) {2801 EndsWithZeroSizedObject = false;2802 LeadsWithZeroSizedBase = false;2803 HasOwnVFPtr = false;2804 HasVBPtr = false;2805 PrimaryBase = nullptr;2806 SharedVBPtrBase = nullptr;2807 // Calculate pointer size and alignment. These are used for vfptr and vbprt2808 // injection.2809 PointerInfo.Size = Context.toCharUnitsFromBits(2810 Context.getTargetInfo().getPointerWidth(LangAS::Default));2811 PointerInfo.Alignment = Context.toCharUnitsFromBits(2812 Context.getTargetInfo().getPointerAlign(LangAS::Default));2813 // Respect pragma pack.2814 if (!MaxFieldAlignment.isZero())2815 PointerInfo.Alignment = std::min(PointerInfo.Alignment, MaxFieldAlignment);2816}2817 2818void2819MicrosoftRecordLayoutBuilder::layoutNonVirtualBases(const CXXRecordDecl *RD) {2820 // The MS-ABI lays out all bases that contain leading vfptrs before it lays2821 // out any bases that do not contain vfptrs. We implement this as two passes2822 // over the bases. This approach guarantees that the primary base is laid out2823 // first. We use these passes to calculate some additional aggregated2824 // information about the bases, such as required alignment and the presence of2825 // zero sized members.2826 const ASTRecordLayout *PreviousBaseLayout = nullptr;2827 bool HasPolymorphicBaseClass = false;2828 // Iterate through the bases and lay out the non-virtual ones.2829 for (const CXXBaseSpecifier &Base : RD->bases()) {2830 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();2831 HasPolymorphicBaseClass |= BaseDecl->isPolymorphic();2832 const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);2833 // Mark and skip virtual bases.2834 if (Base.isVirtual()) {2835 HasVBPtr = true;2836 continue;2837 }2838 // Check for a base to share a VBPtr with.2839 if (!SharedVBPtrBase && BaseLayout.hasVBPtr()) {2840 SharedVBPtrBase = BaseDecl;2841 HasVBPtr = true;2842 }2843 // Only lay out bases with extendable VFPtrs on the first pass.2844 if (!BaseLayout.hasExtendableVFPtr())2845 continue;2846 // If we don't have a primary base, this one qualifies.2847 if (!PrimaryBase) {2848 PrimaryBase = BaseDecl;2849 LeadsWithZeroSizedBase = BaseLayout.leadsWithZeroSizedBase();2850 }2851 // Lay out the base.2852 layoutNonVirtualBase(RD, BaseDecl, BaseLayout, PreviousBaseLayout);2853 }2854 // Figure out if we need a fresh VFPtr for this class.2855 if (RD->isPolymorphic()) {2856 if (!HasPolymorphicBaseClass)2857 // This class introduces polymorphism, so we need a vftable to store the2858 // RTTI information.2859 HasOwnVFPtr = true;2860 else if (!PrimaryBase) {2861 // We have a polymorphic base class but can't extend its vftable. Add a2862 // new vfptr if we would use any vftable slots.2863 for (CXXMethodDecl *M : RD->methods()) {2864 if (MicrosoftVTableContext::hasVtableSlot(M) &&2865 M->size_overridden_methods() == 0) {2866 HasOwnVFPtr = true;2867 break;2868 }2869 }2870 }2871 }2872 // If we don't have a primary base then we have a leading object that could2873 // itself lead with a zero-sized object, something we track.2874 bool CheckLeadingLayout = !PrimaryBase;2875 // Iterate through the bases and lay out the non-virtual ones.2876 for (const CXXBaseSpecifier &Base : RD->bases()) {2877 if (Base.isVirtual())2878 continue;2879 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();2880 const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);2881 // Only lay out bases without extendable VFPtrs on the second pass.2882 if (BaseLayout.hasExtendableVFPtr()) {2883 VBPtrOffset = Bases[BaseDecl] + BaseLayout.getNonVirtualSize();2884 continue;2885 }2886 // If this is the first layout, check to see if it leads with a zero sized2887 // object. If it does, so do we.2888 if (CheckLeadingLayout) {2889 CheckLeadingLayout = false;2890 LeadsWithZeroSizedBase = BaseLayout.leadsWithZeroSizedBase();2891 }2892 // Lay out the base.2893 layoutNonVirtualBase(RD, BaseDecl, BaseLayout, PreviousBaseLayout);2894 VBPtrOffset = Bases[BaseDecl] + BaseLayout.getNonVirtualSize();2895 }2896 // Set our VBPtroffset if we know it at this point.2897 if (!HasVBPtr)2898 VBPtrOffset = CharUnits::fromQuantity(-1);2899 else if (SharedVBPtrBase) {2900 const ASTRecordLayout &Layout = Context.getASTRecordLayout(SharedVBPtrBase);2901 VBPtrOffset = Bases[SharedVBPtrBase] + Layout.getVBPtrOffset();2902 }2903}2904 2905static bool recordUsesEBO(const RecordDecl *RD) {2906 if (!isa<CXXRecordDecl>(RD))2907 return false;2908 if (RD->hasAttr<EmptyBasesAttr>())2909 return true;2910 if (auto *LVA = RD->getAttr<LayoutVersionAttr>())2911 // TODO: Double check with the next version of MSVC.2912 if (LVA->getVersion() <= LangOptions::MSVC2015)2913 return false;2914 // TODO: Some later version of MSVC will change the default behavior of the2915 // compiler to enable EBO by default. When this happens, we will need an2916 // additional isCompatibleWithMSVC check.2917 return false;2918}2919 2920void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase(2921 const CXXRecordDecl *RD, const CXXRecordDecl *BaseDecl,2922 const ASTRecordLayout &BaseLayout,2923 const ASTRecordLayout *&PreviousBaseLayout) {2924 // Insert padding between two bases if the left first one is zero sized or2925 // contains a zero sized subobject and the right is zero sized or one leads2926 // with a zero sized base.2927 bool MDCUsesEBO = recordUsesEBO(RD);2928 if (PreviousBaseLayout && PreviousBaseLayout->endsWithZeroSizedObject() &&2929 BaseLayout.leadsWithZeroSizedBase() && !MDCUsesEBO)2930 Size++;2931 ElementInfo Info = getAdjustedElementInfo(BaseLayout);2932 CharUnits BaseOffset;2933 2934 // Respect the external AST source base offset, if present.2935 bool FoundBase = false;2936 if (UseExternalLayout) {2937 FoundBase = External.getExternalNVBaseOffset(BaseDecl, BaseOffset);2938 if (BaseOffset > Size) {2939 Size = BaseOffset;2940 }2941 }2942 2943 if (!FoundBase) {2944 if (MDCUsesEBO && BaseDecl->isEmpty() &&2945 (BaseLayout.getNonVirtualSize() == CharUnits::Zero())) {2946 BaseOffset = CharUnits::Zero();2947 } else {2948 // Otherwise, lay the base out at the end of the MDC.2949 BaseOffset = Size = Size.alignTo(Info.Alignment);2950 }2951 }2952 Bases.insert(std::make_pair(BaseDecl, BaseOffset));2953 Size += BaseLayout.getNonVirtualSize();2954 DataSize = Size;2955 PreviousBaseLayout = &BaseLayout;2956}2957 2958void MicrosoftRecordLayoutBuilder::layoutFields(const RecordDecl *RD) {2959 LastFieldIsNonZeroWidthBitfield = false;2960 for (const FieldDecl *Field : RD->fields())2961 layoutField(Field);2962}2963 2964void MicrosoftRecordLayoutBuilder::layoutField(const FieldDecl *FD) {2965 if (FD->isBitField()) {2966 layoutBitField(FD);2967 return;2968 }2969 LastFieldIsNonZeroWidthBitfield = false;2970 ElementInfo Info = getAdjustedElementInfo(FD);2971 Alignment = std::max(Alignment, Info.Alignment);2972 2973 const CXXRecordDecl *FieldClass = FD->getType()->getAsCXXRecordDecl();2974 bool IsOverlappingEmptyField = FD->isPotentiallyOverlapping() &&2975 FieldClass->isEmpty() &&2976 FieldClass->fields().empty();2977 CharUnits FieldOffset = CharUnits::Zero();2978 2979 if (UseExternalLayout) {2980 FieldOffset =2981 Context.toCharUnitsFromBits(External.getExternalFieldOffset(FD));2982 } else if (IsUnion) {2983 FieldOffset = CharUnits::Zero();2984 } else if (EmptySubobjects) {2985 if (!IsOverlappingEmptyField)2986 FieldOffset = DataSize.alignTo(Info.Alignment);2987 2988 while (!EmptySubobjects->CanPlaceFieldAtOffset(FD, FieldOffset)) {2989 const CXXRecordDecl *ParentClass = cast<CXXRecordDecl>(FD->getParent());2990 bool HasBases = ParentClass && (!ParentClass->bases().empty() ||2991 !ParentClass->vbases().empty());2992 if (FieldOffset == CharUnits::Zero() && DataSize != CharUnits::Zero() &&2993 HasBases) {2994 // MSVC appears to only do this when there are base classes;2995 // otherwise it overlaps no_unique_address fields in non-zero offsets.2996 FieldOffset = DataSize.alignTo(Info.Alignment);2997 } else {2998 FieldOffset += Info.Alignment;2999 }3000 }3001 } else {3002 FieldOffset = Size.alignTo(Info.Alignment);3003 }3004 3005 uint64_t UnpaddedFielddOffsetInBits =3006 Context.toBits(DataSize) - RemainingBitsInField;3007 3008 ::CheckFieldPadding(Context, IsUnion, Context.toBits(FieldOffset),3009 UnpaddedFielddOffsetInBits, FD);3010 3011 RemainingBitsInField = 0;3012 3013 placeFieldAtOffset(FieldOffset);3014 3015 if (!IsOverlappingEmptyField)3016 DataSize = std::max(DataSize, FieldOffset + Info.Size);3017 3018 Size = std::max(Size, FieldOffset + Info.Size);3019}3020 3021void MicrosoftRecordLayoutBuilder::layoutBitField(const FieldDecl *FD) {3022 unsigned Width = FD->getBitWidthValue();3023 if (Width == 0) {3024 layoutZeroWidthBitField(FD);3025 return;3026 }3027 ElementInfo Info = getAdjustedElementInfo(FD);3028 // Clamp the bitfield to a containable size for the sake of being able3029 // to lay them out. Sema will throw an error.3030 if (Width > Context.toBits(Info.Size))3031 Width = Context.toBits(Info.Size);3032 // Check to see if this bitfield fits into an existing allocation. Note:3033 // MSVC refuses to pack bitfields of formal types with different sizes3034 // into the same allocation.3035 if (!UseExternalLayout && !IsUnion && LastFieldIsNonZeroWidthBitfield &&3036 CurrentBitfieldSize == Info.Size && Width <= RemainingBitsInField) {3037 placeFieldAtBitOffset(Context.toBits(Size) - RemainingBitsInField);3038 RemainingBitsInField -= Width;3039 return;3040 }3041 LastFieldIsNonZeroWidthBitfield = true;3042 CurrentBitfieldSize = Info.Size;3043 if (UseExternalLayout) {3044 auto FieldBitOffset = External.getExternalFieldOffset(FD);3045 placeFieldAtBitOffset(FieldBitOffset);3046 auto NewSize = Context.toCharUnitsFromBits(3047 llvm::alignDown(FieldBitOffset, Context.toBits(Info.Alignment)) +3048 Context.toBits(Info.Size));3049 Size = std::max(Size, NewSize);3050 Alignment = std::max(Alignment, Info.Alignment);3051 } else if (IsUnion) {3052 placeFieldAtOffset(CharUnits::Zero());3053 Size = std::max(Size, Info.Size);3054 // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.3055 } else {3056 // Allocate a new block of memory and place the bitfield in it.3057 CharUnits FieldOffset = Size.alignTo(Info.Alignment);3058 uint64_t UnpaddedFieldOffsetInBits =3059 Context.toBits(DataSize) - RemainingBitsInField;3060 placeFieldAtOffset(FieldOffset);3061 Size = FieldOffset + Info.Size;3062 Alignment = std::max(Alignment, Info.Alignment);3063 RemainingBitsInField = Context.toBits(Info.Size) - Width;3064 ::CheckFieldPadding(Context, IsUnion, Context.toBits(FieldOffset),3065 UnpaddedFieldOffsetInBits, FD);3066 }3067 DataSize = Size;3068}3069 3070void3071MicrosoftRecordLayoutBuilder::layoutZeroWidthBitField(const FieldDecl *FD) {3072 // Zero-width bitfields are ignored unless they follow a non-zero-width3073 // bitfield.3074 if (!LastFieldIsNonZeroWidthBitfield) {3075 placeFieldAtOffset(IsUnion ? CharUnits::Zero() : Size);3076 // TODO: Add a Sema warning that MS ignores alignment for zero3077 // sized bitfields that occur after zero-size bitfields or non-bitfields.3078 return;3079 }3080 LastFieldIsNonZeroWidthBitfield = false;3081 ElementInfo Info = getAdjustedElementInfo(FD);3082 if (IsUnion) {3083 placeFieldAtOffset(CharUnits::Zero());3084 Size = std::max(Size, Info.Size);3085 // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.3086 } else {3087 // Round up the current record size to the field's alignment boundary.3088 CharUnits FieldOffset = Size.alignTo(Info.Alignment);3089 uint64_t UnpaddedFieldOffsetInBits =3090 Context.toBits(DataSize) - RemainingBitsInField;3091 placeFieldAtOffset(FieldOffset);3092 RemainingBitsInField = 0;3093 Size = FieldOffset;3094 Alignment = std::max(Alignment, Info.Alignment);3095 ::CheckFieldPadding(Context, IsUnion, Context.toBits(FieldOffset),3096 UnpaddedFieldOffsetInBits, FD);3097 }3098 DataSize = Size;3099}3100 3101void MicrosoftRecordLayoutBuilder::injectVBPtr(const CXXRecordDecl *RD) {3102 if (!HasVBPtr || SharedVBPtrBase)3103 return;3104 // Inject the VBPointer at the injection site.3105 CharUnits InjectionSite = VBPtrOffset;3106 // But before we do, make sure it's properly aligned.3107 VBPtrOffset = VBPtrOffset.alignTo(PointerInfo.Alignment);3108 // Determine where the first field should be laid out after the vbptr.3109 CharUnits FieldStart = VBPtrOffset + PointerInfo.Size;3110 // Shift everything after the vbptr down, unless we're using an external3111 // layout.3112 if (UseExternalLayout) {3113 // It is possible that there were no fields or bases located after vbptr,3114 // so the size was not adjusted before.3115 if (Size < FieldStart)3116 Size = FieldStart;3117 return;3118 }3119 // Make sure that the amount we push the fields back by is a multiple of the3120 // alignment.3121 CharUnits Offset = (FieldStart - InjectionSite)3122 .alignTo(std::max(RequiredAlignment, Alignment));3123 Size += Offset;3124 for (uint64_t &FieldOffset : FieldOffsets)3125 FieldOffset += Context.toBits(Offset);3126 for (BaseOffsetsMapTy::value_type &Base : Bases)3127 if (Base.second >= InjectionSite)3128 Base.second += Offset;3129}3130 3131void MicrosoftRecordLayoutBuilder::injectVFPtr(const CXXRecordDecl *RD) {3132 if (!HasOwnVFPtr)3133 return;3134 // Make sure that the amount we push the struct back by is a multiple of the3135 // alignment.3136 CharUnits Offset =3137 PointerInfo.Size.alignTo(std::max(RequiredAlignment, Alignment));3138 // Push back the vbptr, but increase the size of the object and push back3139 // regular fields by the offset only if not using external record layout.3140 if (HasVBPtr)3141 VBPtrOffset += Offset;3142 3143 if (UseExternalLayout) {3144 // The class may have size 0 and a vfptr (e.g. it's an interface class). The3145 // size was not correctly set before in this case.3146 if (Size.isZero())3147 Size += Offset;3148 return;3149 }3150 3151 Size += Offset;3152 3153 // If we're using an external layout, the fields offsets have already3154 // accounted for this adjustment.3155 for (uint64_t &FieldOffset : FieldOffsets)3156 FieldOffset += Context.toBits(Offset);3157 for (BaseOffsetsMapTy::value_type &Base : Bases)3158 Base.second += Offset;3159}3160 3161void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {3162 if (!HasVBPtr)3163 return;3164 // Vtordisps are always 4 bytes (even in 64-bit mode)3165 CharUnits VtorDispSize = CharUnits::fromQuantity(4);3166 CharUnits VtorDispAlignment = VtorDispSize;3167 // vtordisps respect pragma pack.3168 if (!MaxFieldAlignment.isZero())3169 VtorDispAlignment = std::min(VtorDispAlignment, MaxFieldAlignment);3170 // The alignment of the vtordisp is at least the required alignment of the3171 // entire record. This requirement may be present to support vtordisp3172 // injection.3173 for (const CXXBaseSpecifier &VBase : RD->vbases()) {3174 const CXXRecordDecl *BaseDecl = VBase.getType()->getAsCXXRecordDecl();3175 const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);3176 RequiredAlignment =3177 std::max(RequiredAlignment, BaseLayout.getRequiredAlignment());3178 }3179 VtorDispAlignment = std::max(VtorDispAlignment, RequiredAlignment);3180 // Compute the vtordisp set.3181 llvm::SmallPtrSet<const CXXRecordDecl *, 2> HasVtorDispSet;3182 computeVtorDispSet(HasVtorDispSet, RD);3183 // Iterate through the virtual bases and lay them out.3184 const ASTRecordLayout *PreviousBaseLayout = nullptr;3185 for (const CXXBaseSpecifier &VBase : RD->vbases()) {3186 const CXXRecordDecl *BaseDecl = VBase.getType()->getAsCXXRecordDecl();3187 const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);3188 bool HasVtordisp = HasVtorDispSet.contains(BaseDecl);3189 // Insert padding between two bases if the left first one is zero sized or3190 // contains a zero sized subobject and the right is zero sized or one leads3191 // with a zero sized base. The padding between virtual bases is 43192 // bytes (in both 32 and 64 bits modes) and always involves rounding up to3193 // the required alignment, we don't know why.3194 if ((PreviousBaseLayout && PreviousBaseLayout->endsWithZeroSizedObject() &&3195 BaseLayout.leadsWithZeroSizedBase() && !recordUsesEBO(RD)) ||3196 HasVtordisp) {3197 Size = Size.alignTo(VtorDispAlignment) + VtorDispSize;3198 Alignment = std::max(VtorDispAlignment, Alignment);3199 }3200 // Insert the virtual base.3201 ElementInfo Info = getAdjustedElementInfo(BaseLayout);3202 CharUnits BaseOffset;3203 3204 // Respect the external AST source base offset, if present.3205 if (UseExternalLayout) {3206 if (!External.getExternalVBaseOffset(BaseDecl, BaseOffset))3207 BaseOffset = Size;3208 } else3209 BaseOffset = Size.alignTo(Info.Alignment);3210 3211 assert(BaseOffset >= Size && "base offset already allocated");3212 3213 VBases.insert(std::make_pair(BaseDecl,3214 ASTRecordLayout::VBaseInfo(BaseOffset, HasVtordisp)));3215 Size = BaseOffset + BaseLayout.getNonVirtualSize();3216 PreviousBaseLayout = &BaseLayout;3217 }3218}3219 3220void MicrosoftRecordLayoutBuilder::finalizeLayout(const RecordDecl *RD) {3221 uint64_t UnpaddedSizeInBits = Context.toBits(DataSize);3222 UnpaddedSizeInBits -= RemainingBitsInField;3223 3224 // MS ABI allocates 1 byte for empty class3225 // (not padding)3226 if (Size.isZero())3227 UnpaddedSizeInBits += 8;3228 3229 // Respect required alignment. Note that in 32-bit mode Required alignment3230 // may be 0 and cause size not to be updated.3231 DataSize = Size;3232 if (!RequiredAlignment.isZero()) {3233 Alignment = std::max(Alignment, RequiredAlignment);3234 auto RoundingAlignment = Alignment;3235 if (!MaxFieldAlignment.isZero())3236 RoundingAlignment = std::min(RoundingAlignment, MaxFieldAlignment);3237 RoundingAlignment = std::max(RoundingAlignment, RequiredAlignment);3238 Size = Size.alignTo(RoundingAlignment);3239 }3240 if (Size.isZero()) {3241 if (!recordUsesEBO(RD) || !cast<CXXRecordDecl>(RD)->isEmpty()) {3242 EndsWithZeroSizedObject = true;3243 LeadsWithZeroSizedBase = true;3244 }3245 // Zero-sized structures have size equal to their alignment if a3246 // __declspec(align) came into play.3247 if (RequiredAlignment >= MinEmptyStructSize)3248 Size = Alignment;3249 else3250 Size = MinEmptyStructSize;3251 }3252 3253 if (UseExternalLayout) {3254 Size = Context.toCharUnitsFromBits(External.Size);3255 if (External.Align)3256 Alignment = Context.toCharUnitsFromBits(External.Align);3257 return;3258 }3259 unsigned CharBitNum = Context.getTargetInfo().getCharWidth();3260 uint64_t SizeInBits = Context.toBits(Size);3261 3262 if (SizeInBits > UnpaddedSizeInBits) {3263 unsigned int PadSize = SizeInBits - UnpaddedSizeInBits;3264 bool InBits = true;3265 if (PadSize % CharBitNum == 0) {3266 PadSize = PadSize / CharBitNum;3267 InBits = false;3268 }3269 3270 Context.getDiagnostics().Report(RD->getLocation(),3271 diag::warn_padded_struct_size)3272 << Context.getCanonicalTagType(RD) << PadSize3273 << (InBits ? 1 : 0); // (byte|bit)3274 }3275}3276 3277// Recursively walks the non-virtual bases of a class and determines if any of3278// them are in the bases with overridden methods set.3279static bool3280RequiresVtordisp(const llvm::SmallPtrSetImpl<const CXXRecordDecl *> &3281 BasesWithOverriddenMethods,3282 const CXXRecordDecl *RD) {3283 if (BasesWithOverriddenMethods.count(RD))3284 return true;3285 // If any of a virtual bases non-virtual bases (recursively) requires a3286 // vtordisp than so does this virtual base.3287 for (const CXXBaseSpecifier &Base : RD->bases())3288 if (!Base.isVirtual() &&3289 RequiresVtordisp(BasesWithOverriddenMethods,3290 Base.getType()->getAsCXXRecordDecl()))3291 return true;3292 return false;3293}3294 3295void MicrosoftRecordLayoutBuilder::computeVtorDispSet(3296 llvm::SmallPtrSetImpl<const CXXRecordDecl *> &HasVtordispSet,3297 const CXXRecordDecl *RD) const {3298 // /vd2 or #pragma vtordisp(2): Always use vtordisps for virtual bases with3299 // vftables.3300 if (RD->getMSVtorDispMode() == MSVtorDispMode::ForVFTable) {3301 for (const CXXBaseSpecifier &Base : RD->vbases()) {3302 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();3303 const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl);3304 if (Layout.hasExtendableVFPtr())3305 HasVtordispSet.insert(BaseDecl);3306 }3307 return;3308 }3309 3310 // If any of our bases need a vtordisp for this type, so do we. Check our3311 // direct bases for vtordisp requirements.3312 for (const CXXBaseSpecifier &Base : RD->bases()) {3313 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();3314 const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl);3315 for (const auto &bi : Layout.getVBaseOffsetsMap())3316 if (bi.second.hasVtorDisp())3317 HasVtordispSet.insert(bi.first);3318 }3319 // We don't introduce any additional vtordisps if either:3320 // * A user declared constructor or destructor aren't declared.3321 // * #pragma vtordisp(0) or the /vd0 flag are in use.3322 if ((!RD->hasUserDeclaredConstructor() && !RD->hasUserDeclaredDestructor()) ||3323 RD->getMSVtorDispMode() == MSVtorDispMode::Never)3324 return;3325 // /vd1 or #pragma vtordisp(1): Try to guess based on whether we think it's3326 // possible for a partially constructed object with virtual base overrides to3327 // escape a non-trivial constructor.3328 assert(RD->getMSVtorDispMode() == MSVtorDispMode::ForVBaseOverride);3329 // Compute a set of base classes which define methods we override. A virtual3330 // base in this set will require a vtordisp. A virtual base that transitively3331 // contains one of these bases as a non-virtual base will also require a3332 // vtordisp.3333 llvm::SmallPtrSet<const CXXMethodDecl *, 8> Work;3334 llvm::SmallPtrSet<const CXXRecordDecl *, 2> BasesWithOverriddenMethods;3335 // Seed the working set with our non-destructor, non-pure virtual methods.3336 for (const CXXMethodDecl *MD : RD->methods())3337 if (MicrosoftVTableContext::hasVtableSlot(MD) &&3338 !isa<CXXDestructorDecl>(MD) && !MD->isPureVirtual())3339 Work.insert(MD);3340 while (!Work.empty()) {3341 const CXXMethodDecl *MD = *Work.begin();3342 auto MethodRange = MD->overridden_methods();3343 // If a virtual method has no-overrides it lives in its parent's vtable.3344 if (MethodRange.begin() == MethodRange.end())3345 BasesWithOverriddenMethods.insert(MD->getParent());3346 else3347 Work.insert_range(MethodRange);3348 // We've finished processing this element, remove it from the working set.3349 Work.erase(MD);3350 }3351 // For each of our virtual bases, check if it is in the set of overridden3352 // bases or if it transitively contains a non-virtual base that is.3353 for (const CXXBaseSpecifier &Base : RD->vbases()) {3354 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();3355 if (!HasVtordispSet.count(BaseDecl) &&3356 RequiresVtordisp(BasesWithOverriddenMethods, BaseDecl))3357 HasVtordispSet.insert(BaseDecl);3358 }3359}3360 3361/// getASTRecordLayout - Get or compute information about the layout of the3362/// specified record (struct/union/class), which indicates its size and field3363/// position information.3364const ASTRecordLayout &3365ASTContext::getASTRecordLayout(const RecordDecl *D) const {3366 if (D->hasExternalLexicalStorage() && !D->getDefinition())3367 getExternalSource()->CompleteType(const_cast<RecordDecl*>(D));3368 // Complete the redecl chain (if necessary).3369 (void)D->getMostRecentDecl();3370 3371 // These asserts test different things. A record has a definition3372 // as soon as we begin to parse the definition. That definition is3373 // not a complete definition (which is what isCompleteDefinition() tests)3374 // until we *finish* parsing the definition.3375 D = D->getDefinition();3376 assert(D && "Cannot get layout of forward declarations!");3377 assert(!D->isInvalidDecl() && "Cannot get layout of invalid decl!");3378 assert(D->isCompleteDefinition() && "Cannot layout type before complete!");3379 3380 // Look up this layout, if already laid out, return what we have.3381 // Note that we can't save a reference to the entry because this function3382 // is recursive.3383 const ASTRecordLayout *Entry = ASTRecordLayouts[D];3384 if (Entry) return *Entry;3385 3386 const ASTRecordLayout *NewEntry = nullptr;3387 3388 if (getTargetInfo().hasMicrosoftRecordLayout()) {3389 if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {3390 EmptySubobjectMap EmptySubobjects(*this, RD);3391 MicrosoftRecordLayoutBuilder Builder(*this, &EmptySubobjects);3392 Builder.cxxLayout(RD);3393 NewEntry = new (*this) ASTRecordLayout(3394 *this, Builder.Size, Builder.Alignment, Builder.Alignment,3395 Builder.Alignment, Builder.RequiredAlignment, Builder.HasOwnVFPtr,3396 Builder.HasOwnVFPtr || Builder.PrimaryBase, Builder.VBPtrOffset,3397 Builder.DataSize, Builder.FieldOffsets, Builder.NonVirtualSize,3398 Builder.Alignment, Builder.Alignment, CharUnits::Zero(),3399 Builder.PrimaryBase, false, Builder.SharedVBPtrBase,3400 Builder.EndsWithZeroSizedObject, Builder.LeadsWithZeroSizedBase,3401 Builder.Bases, Builder.VBases);3402 } else {3403 MicrosoftRecordLayoutBuilder Builder(*this, /*EmptySubobjects=*/nullptr);3404 Builder.layout(D);3405 NewEntry = new (*this) ASTRecordLayout(3406 *this, Builder.Size, Builder.Alignment, Builder.Alignment,3407 Builder.Alignment, Builder.RequiredAlignment, Builder.Size,3408 Builder.FieldOffsets);3409 }3410 } else {3411 if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {3412 EmptySubobjectMap EmptySubobjects(*this, RD);3413 ItaniumRecordLayoutBuilder Builder(*this, &EmptySubobjects);3414 Builder.Layout(RD);3415 3416 // In certain situations, we are allowed to lay out objects in the3417 // tail-padding of base classes. This is ABI-dependent.3418 // FIXME: this should be stored in the record layout.3419 bool skipTailPadding =3420 mustSkipTailPadding(getTargetInfo().getCXXABI(), RD);3421 3422 // FIXME: This should be done in FinalizeLayout.3423 CharUnits DataSize =3424 skipTailPadding ? Builder.getSize() : Builder.getDataSize();3425 CharUnits NonVirtualSize =3426 skipTailPadding ? DataSize : Builder.NonVirtualSize;3427 NewEntry = new (*this) ASTRecordLayout(3428 *this, Builder.getSize(), Builder.Alignment,3429 Builder.PreferredAlignment, Builder.UnadjustedAlignment,3430 /*RequiredAlignment : used by MS-ABI)*/3431 Builder.Alignment, Builder.HasOwnVFPtr, RD->isDynamicClass(),3432 CharUnits::fromQuantity(-1), DataSize, Builder.FieldOffsets,3433 NonVirtualSize, Builder.NonVirtualAlignment,3434 Builder.PreferredNVAlignment,3435 EmptySubobjects.SizeOfLargestEmptySubobject, Builder.PrimaryBase,3436 Builder.PrimaryBaseIsVirtual, nullptr, false, false, Builder.Bases,3437 Builder.VBases);3438 } else {3439 ItaniumRecordLayoutBuilder Builder(*this, /*EmptySubobjects=*/nullptr);3440 Builder.Layout(D);3441 3442 NewEntry = new (*this) ASTRecordLayout(3443 *this, Builder.getSize(), Builder.Alignment,3444 Builder.PreferredAlignment, Builder.UnadjustedAlignment,3445 /*RequiredAlignment : used by MS-ABI)*/3446 Builder.Alignment, Builder.getSize(), Builder.FieldOffsets);3447 }3448 }3449 3450 ASTRecordLayouts[D] = NewEntry;3451 3452 constexpr uint64_t MaxStructSizeInBytes = 1ULL << 60;3453 CharUnits StructSize = NewEntry->getSize();3454 if (static_cast<uint64_t>(StructSize.getQuantity()) >= MaxStructSizeInBytes) {3455 getDiagnostics().Report(D->getLocation(), diag::err_struct_too_large)3456 << D->getName() << MaxStructSizeInBytes;3457 }3458 3459 if (getLangOpts().DumpRecordLayouts) {3460 llvm::outs() << "\n*** Dumping AST Record Layout\n";3461 DumpRecordLayout(D, llvm::outs(), getLangOpts().DumpRecordLayoutsSimple);3462 }3463 3464 return *NewEntry;3465}3466 3467const CXXMethodDecl *ASTContext::getCurrentKeyFunction(const CXXRecordDecl *RD) {3468 if (!getTargetInfo().getCXXABI().hasKeyFunctions())3469 return nullptr;3470 3471 assert(RD->getDefinition() && "Cannot get key function for forward decl!");3472 RD = RD->getDefinition();3473 3474 // Beware:3475 // 1) computing the key function might trigger deserialization, which might3476 // invalidate iterators into KeyFunctions3477 // 2) 'get' on the LazyDeclPtr might also trigger deserialization and3478 // invalidate the LazyDeclPtr within the map itself3479 LazyDeclPtr Entry = KeyFunctions[RD];3480 const Decl *Result =3481 Entry ? Entry.get(getExternalSource()) : computeKeyFunction(*this, RD);3482 3483 // Store it back if it changed.3484 if (Entry.isOffset() || Entry.isValid() != bool(Result))3485 KeyFunctions[RD] = const_cast<Decl*>(Result);3486 3487 return cast_or_null<CXXMethodDecl>(Result);3488}3489 3490void ASTContext::setNonKeyFunction(const CXXMethodDecl *Method) {3491 assert(Method == Method->getFirstDecl() &&3492 "not working with method declaration from class definition");3493 3494 // Look up the cache entry. Since we're working with the first3495 // declaration, its parent must be the class definition, which is3496 // the correct key for the KeyFunctions hash.3497 const auto &Map = KeyFunctions;3498 auto I = Map.find(Method->getParent());3499 3500 // If it's not cached, there's nothing to do.3501 if (I == Map.end()) return;3502 3503 // If it is cached, check whether it's the target method, and if so,3504 // remove it from the cache. Note, the call to 'get' might invalidate3505 // the iterator and the LazyDeclPtr object within the map.3506 LazyDeclPtr Ptr = I->second;3507 if (Ptr.get(getExternalSource()) == Method) {3508 // FIXME: remember that we did this for module / chained PCH state?3509 KeyFunctions.erase(Method->getParent());3510 }3511}3512 3513static uint64_t getFieldOffset(const ASTContext &C, const FieldDecl *FD) {3514 const ASTRecordLayout &Layout = C.getASTRecordLayout(FD->getParent());3515 return Layout.getFieldOffset(FD->getFieldIndex());3516}3517 3518uint64_t ASTContext::getFieldOffset(const ValueDecl *VD) const {3519 uint64_t OffsetInBits;3520 if (const FieldDecl *FD = dyn_cast<FieldDecl>(VD)) {3521 OffsetInBits = ::getFieldOffset(*this, FD);3522 } else {3523 const IndirectFieldDecl *IFD = cast<IndirectFieldDecl>(VD);3524 3525 OffsetInBits = 0;3526 for (const NamedDecl *ND : IFD->chain())3527 OffsetInBits += ::getFieldOffset(*this, cast<FieldDecl>(ND));3528 }3529 3530 return OffsetInBits;3531}3532 3533uint64_t ASTContext::lookupFieldBitOffset(const ObjCInterfaceDecl *OID,3534 const ObjCIvarDecl *Ivar) const {3535 Ivar = Ivar->getCanonicalDecl();3536 const ObjCInterfaceDecl *Container = Ivar->getContainingInterface();3537 const ASTRecordLayout *RL = &getASTObjCInterfaceLayout(Container);3538 3539 // Compute field index.3540 //3541 // FIXME: The index here is closely tied to how ASTContext::getObjCLayout is3542 // implemented. This should be fixed to get the information from the layout3543 // directly.3544 unsigned Index = 0;3545 3546 for (const ObjCIvarDecl *IVD = Container->all_declared_ivar_begin();3547 IVD; IVD = IVD->getNextIvar()) {3548 if (Ivar == IVD)3549 break;3550 ++Index;3551 }3552 assert(Index < RL->getFieldCount() && "Ivar is not inside record layout!");3553 3554 return RL->getFieldOffset(Index);3555}3556 3557/// getObjCLayout - Get or compute information about the layout of the3558/// given interface.3559///3560/// \param Impl - If given, also include the layout of the interface's3561/// implementation. This may differ by including synthesized ivars.3562const ASTRecordLayout &3563ASTContext::getObjCLayout(const ObjCInterfaceDecl *D) const {3564 // Retrieve the definition3565 if (D->hasExternalLexicalStorage() && !D->getDefinition())3566 getExternalSource()->CompleteType(const_cast<ObjCInterfaceDecl*>(D));3567 D = D->getDefinition();3568 assert(D && !D->isInvalidDecl() && D->isThisDeclarationADefinition() &&3569 "Invalid interface decl!");3570 3571 // Look up this layout, if already laid out, return what we have.3572 if (const ASTRecordLayout *Entry = ObjCLayouts[D])3573 return *Entry;3574 3575 ItaniumRecordLayoutBuilder Builder(*this, /*EmptySubobjects=*/nullptr);3576 Builder.Layout(D);3577 3578 const ASTRecordLayout *NewEntry = new (*this) ASTRecordLayout(3579 *this, Builder.getSize(), Builder.Alignment, Builder.PreferredAlignment,3580 Builder.UnadjustedAlignment,3581 /*RequiredAlignment : used by MS-ABI)*/3582 Builder.Alignment, Builder.getDataSize(), Builder.FieldOffsets);3583 3584 ObjCLayouts[D] = NewEntry;3585 3586 return *NewEntry;3587}3588 3589static void PrintOffset(raw_ostream &OS,3590 CharUnits Offset, unsigned IndentLevel) {3591 OS << llvm::format("%10" PRId64 " | ", (int64_t)Offset.getQuantity());3592 OS.indent(IndentLevel * 2);3593}3594 3595static void PrintBitFieldOffset(raw_ostream &OS, CharUnits Offset,3596 unsigned Begin, unsigned Width,3597 unsigned IndentLevel) {3598 llvm::SmallString<10> Buffer;3599 {3600 llvm::raw_svector_ostream BufferOS(Buffer);3601 BufferOS << Offset.getQuantity() << ':';3602 if (Width == 0) {3603 BufferOS << '-';3604 } else {3605 BufferOS << Begin << '-' << (Begin + Width - 1);3606 }3607 }3608 3609 OS << llvm::right_justify(Buffer, 10) << " | ";3610 OS.indent(IndentLevel * 2);3611}3612 3613static void PrintIndentNoOffset(raw_ostream &OS, unsigned IndentLevel) {3614 OS << " | ";3615 OS.indent(IndentLevel * 2);3616}3617 3618static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,3619 const ASTContext &C,3620 CharUnits Offset,3621 unsigned IndentLevel,3622 const char* Description,3623 bool PrintSizeInfo,3624 bool IncludeVirtualBases) {3625 const ASTRecordLayout &Layout = C.getASTRecordLayout(RD);3626 auto CXXRD = dyn_cast<CXXRecordDecl>(RD);3627 3628 PrintOffset(OS, Offset, IndentLevel);3629 OS << C.getCanonicalTagType(const_cast<RecordDecl *>(RD));3630 if (Description)3631 OS << ' ' << Description;3632 if (CXXRD && CXXRD->isEmpty())3633 OS << " (empty)";3634 OS << '\n';3635 3636 IndentLevel++;3637 3638 // Dump bases.3639 if (CXXRD) {3640 const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();3641 bool HasOwnVFPtr = Layout.hasOwnVFPtr();3642 bool HasOwnVBPtr = Layout.hasOwnVBPtr();3643 3644 // Vtable pointer.3645 if (CXXRD->isDynamicClass() && !PrimaryBase &&3646 !C.getTargetInfo().hasMicrosoftRecordLayout()) {3647 PrintOffset(OS, Offset, IndentLevel);3648 OS << '(' << *RD << " vtable pointer)\n";3649 } else if (HasOwnVFPtr) {3650 PrintOffset(OS, Offset, IndentLevel);3651 // vfptr (for Microsoft C++ ABI)3652 OS << '(' << *RD << " vftable pointer)\n";3653 }3654 3655 // Collect nvbases.3656 SmallVector<const CXXRecordDecl *, 4> Bases;3657 for (const CXXBaseSpecifier &Base : CXXRD->bases()) {3658 assert(!Base.getType()->isDependentType() &&3659 "Cannot layout class with dependent bases.");3660 if (!Base.isVirtual())3661 Bases.push_back(Base.getType()->getAsCXXRecordDecl());3662 }3663 3664 // Sort nvbases by offset.3665 llvm::stable_sort(3666 Bases, [&](const CXXRecordDecl *L, const CXXRecordDecl *R) {3667 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);3668 });3669 3670 // Dump (non-virtual) bases3671 for (const CXXRecordDecl *Base : Bases) {3672 CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(Base);3673 DumpRecordLayout(OS, Base, C, BaseOffset, IndentLevel,3674 Base == PrimaryBase ? "(primary base)" : "(base)",3675 /*PrintSizeInfo=*/false,3676 /*IncludeVirtualBases=*/false);3677 }3678 3679 // vbptr (for Microsoft C++ ABI)3680 if (HasOwnVBPtr) {3681 PrintOffset(OS, Offset + Layout.getVBPtrOffset(), IndentLevel);3682 OS << '(' << *RD << " vbtable pointer)\n";3683 }3684 }3685 3686 // Dump fields.3687 for (const FieldDecl *Field : RD->fields()) {3688 uint64_t LocalFieldOffsetInBits =3689 Layout.getFieldOffset(Field->getFieldIndex());3690 CharUnits FieldOffset =3691 Offset + C.toCharUnitsFromBits(LocalFieldOffsetInBits);3692 3693 // Recursively dump fields of record type.3694 if (const auto *RD = Field->getType()->getAsRecordDecl()) {3695 DumpRecordLayout(OS, RD, C, FieldOffset, IndentLevel,3696 Field->getName().data(),3697 /*PrintSizeInfo=*/false,3698 /*IncludeVirtualBases=*/true);3699 continue;3700 }3701 3702 if (Field->isBitField()) {3703 uint64_t LocalFieldByteOffsetInBits = C.toBits(FieldOffset - Offset);3704 unsigned Begin = LocalFieldOffsetInBits - LocalFieldByteOffsetInBits;3705 unsigned Width = Field->getBitWidthValue();3706 PrintBitFieldOffset(OS, FieldOffset, Begin, Width, IndentLevel);3707 } else {3708 PrintOffset(OS, FieldOffset, IndentLevel);3709 }3710 const QualType &FieldType = C.getLangOpts().DumpRecordLayoutsCanonical3711 ? Field->getType().getCanonicalType()3712 : Field->getType();3713 OS << FieldType << ' ' << *Field << '\n';3714 }3715 3716 // Dump virtual bases.3717 if (CXXRD && IncludeVirtualBases) {3718 const ASTRecordLayout::VBaseOffsetsMapTy &VtorDisps =3719 Layout.getVBaseOffsetsMap();3720 3721 for (const CXXBaseSpecifier &Base : CXXRD->vbases()) {3722 assert(Base.isVirtual() && "Found non-virtual class!");3723 const CXXRecordDecl *VBase = Base.getType()->getAsCXXRecordDecl();3724 3725 CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBase);3726 3727 if (VtorDisps.find(VBase)->second.hasVtorDisp()) {3728 PrintOffset(OS, VBaseOffset - CharUnits::fromQuantity(4), IndentLevel);3729 OS << "(vtordisp for vbase " << *VBase << ")\n";3730 }3731 3732 DumpRecordLayout(OS, VBase, C, VBaseOffset, IndentLevel,3733 VBase == Layout.getPrimaryBase() ?3734 "(primary virtual base)" : "(virtual base)",3735 /*PrintSizeInfo=*/false,3736 /*IncludeVirtualBases=*/false);3737 }3738 }3739 3740 if (!PrintSizeInfo) return;3741 3742 PrintIndentNoOffset(OS, IndentLevel - 1);3743 OS << "[sizeof=" << Layout.getSize().getQuantity();3744 if (CXXRD && !C.getTargetInfo().hasMicrosoftRecordLayout())3745 OS << ", dsize=" << Layout.getDataSize().getQuantity();3746 OS << ", align=" << Layout.getAlignment().getQuantity();3747 if (C.getTargetInfo().defaultsToAIXPowerAlignment())3748 OS << ", preferredalign=" << Layout.getPreferredAlignment().getQuantity();3749 3750 if (CXXRD) {3751 OS << ",\n";3752 PrintIndentNoOffset(OS, IndentLevel - 1);3753 OS << " nvsize=" << Layout.getNonVirtualSize().getQuantity();3754 OS << ", nvalign=" << Layout.getNonVirtualAlignment().getQuantity();3755 if (C.getTargetInfo().defaultsToAIXPowerAlignment())3756 OS << ", preferrednvalign="3757 << Layout.getPreferredNVAlignment().getQuantity();3758 }3759 OS << "]\n";3760}3761 3762void ASTContext::DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,3763 bool Simple) const {3764 if (!Simple) {3765 ::DumpRecordLayout(OS, RD, *this, CharUnits(), 0, nullptr,3766 /*PrintSizeInfo*/ true,3767 /*IncludeVirtualBases=*/true);3768 return;3769 }3770 3771 // The "simple" format is designed to be parsed by the3772 // layout-override testing code. There shouldn't be any external3773 // uses of this format --- when LLDB overrides a layout, it sets up3774 // the data structures directly --- so feel free to adjust this as3775 // you like as long as you also update the rudimentary parser for it3776 // in libFrontend.3777 3778 const ASTRecordLayout &Info = getASTRecordLayout(RD);3779 OS << "Type: " << getCanonicalTagType(RD) << "\n";3780 OS << "\nLayout: ";3781 OS << "<ASTRecordLayout\n";3782 OS << " Size:" << toBits(Info.getSize()) << "\n";3783 if (!getTargetInfo().hasMicrosoftRecordLayout())3784 OS << " DataSize:" << toBits(Info.getDataSize()) << "\n";3785 OS << " Alignment:" << toBits(Info.getAlignment()) << "\n";3786 if (Target->defaultsToAIXPowerAlignment())3787 OS << " PreferredAlignment:" << toBits(Info.getPreferredAlignment())3788 << "\n";3789 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {3790 OS << " BaseOffsets: [";3791 const CXXRecordDecl *Base = nullptr;3792 for (auto I : CXXRD->bases()) {3793 if (I.isVirtual())3794 continue;3795 if (Base)3796 OS << ", ";3797 Base = I.getType()->getAsCXXRecordDecl();3798 OS << Info.CXXInfo->BaseOffsets[Base].getQuantity();3799 }3800 OS << "]>\n";3801 OS << " VBaseOffsets: [";3802 const CXXRecordDecl *VBase = nullptr;3803 for (auto I : CXXRD->vbases()) {3804 if (VBase)3805 OS << ", ";3806 VBase = I.getType()->getAsCXXRecordDecl();3807 OS << Info.CXXInfo->VBaseOffsets[VBase].VBaseOffset.getQuantity();3808 }3809 OS << "]>\n";3810 }3811 OS << " FieldOffsets: [";3812 for (unsigned i = 0, e = Info.getFieldCount(); i != e; ++i) {3813 if (i)3814 OS << ", ";3815 OS << Info.getFieldOffset(i);3816 }3817 OS << "]>\n";3818}3819