19392fa63e45716e32061d05673fa28909f325b02Anders Carlsson//=== RecordLayoutBuilder.cpp - Helper class for building record layouts ---==//
2bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson//
3bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson//                     The LLVM Compiler Infrastructure
4bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson//
5bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson// This file is distributed under the University of Illinois Open Source
6bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson// License. See LICENSE.TXT for details.
7bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson//
8bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson//===----------------------------------------------------------------------===//
9bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson
1055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/RecordLayout.h"
11d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer#include "clang/AST/ASTContext.h"
12bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson#include "clang/AST/Attr.h"
13245656ec65ec600ef1ab05f4c8d9f780542d689dAnders Carlsson#include "clang/AST/CXXInheritance.h"
14bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson#include "clang/AST/Decl.h"
1574cbe226207fd101623638dadfa7fbada04ff2a6Anders Carlsson#include "clang/AST/DeclCXX.h"
1693fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson#include "clang/AST/DeclObjC.h"
17bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson#include "clang/AST/Expr.h"
18bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson#include "clang/Basic/TargetInfo.h"
1978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis#include "clang/Sema/SemaDiagnostic.h"
20bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar#include "llvm/ADT/SmallSet.h"
214d96d9f0e758fb9244749f99d4b0a3ab1e3e0592Ted Kremenek#include "llvm/Support/CrashRecoveryContext.h"
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/Format.h"
2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/MathExtras.h"
24bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson
25bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlssonusing namespace clang;
26bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson
277e220286410422ed1dc0409a9cb9708fe50e3df0Benjamin Kramernamespace {
286a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlsson
29ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson/// BaseSubobjectInfo - Represents a single base subobject in a complete class.
30ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson/// For a class hierarchy like
31ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson///
32ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson/// class A { };
33ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson/// class B : A { };
34ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson/// class C : A, B { };
35ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson///
36ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson/// The BaseSubobjectInfo graph for C will have three BaseSubobjectInfo
37ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson/// instances, one for B and two for A.
38ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson///
39ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson/// If a base is virtual, it will only have one BaseSubobjectInfo allocated.
40ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlssonstruct BaseSubobjectInfo {
41ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson  /// Class - The class for this base info.
424a25799760982b3363f3c4eb6df953d70e35e37dAnders Carlsson  const CXXRecordDecl *Class;
43ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson
44ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson  /// IsVirtual - Whether the BaseInfo represents a virtual base or not.
454a25799760982b3363f3c4eb6df953d70e35e37dAnders Carlsson  bool IsVirtual;
464a25799760982b3363f3c4eb6df953d70e35e37dAnders Carlsson
47ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson  /// Bases - Information about the base subobjects.
485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<BaseSubobjectInfo*, 4> Bases;
49ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson
506e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// PrimaryVirtualBaseInfo - Holds the base info for the primary virtual base
516e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// of this base info (if one exists).
526e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  BaseSubobjectInfo *PrimaryVirtualBaseInfo;
53ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson
54ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson  // FIXME: Document.
55ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson  const BaseSubobjectInfo *Derived;
564a25799760982b3363f3c4eb6df953d70e35e37dAnders Carlsson};
574a25799760982b3363f3c4eb6df953d70e35e37dAnders Carlsson
586a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlsson/// EmptySubobjectMap - Keeps track of which empty subobjects exist at different
596a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlsson/// offsets while laying out a C++ class.
606a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlssonclass EmptySubobjectMap {
614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  const ASTContext &Context;
628c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson  uint64_t CharWidth;
638c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson
646a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlsson  /// Class - The class whose empty entries we're keeping track of.
656a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlsson  const CXXRecordDecl *Class;
660aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
6758b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  /// EmptyClassOffsets - A map from offsets to empty record decls.
685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  typedef SmallVector<const CXXRecordDecl *, 1> ClassVectorTy;
69d8da76365f40a0c12c7d802a0da2aaacf4b2cf99Anders Carlsson  typedef llvm::DenseMap<CharUnits, ClassVectorTy> EmptyClassOffsetsMapTy;
7058b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  EmptyClassOffsetsMapTy EmptyClassOffsets;
7158b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
72c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson  /// MaxEmptyClassOffset - The highest offset known to contain an empty
73c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson  /// base subobject.
74fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson  CharUnits MaxEmptyClassOffset;
75c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson
760aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar  /// ComputeEmptySubobjectSizes - Compute the size of the largest base or
770c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  /// member subobject that is empty.
780c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  void ComputeEmptySubobjectSizes();
7958b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
80fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson  void AddSubobjectAtOffset(const CXXRecordDecl *RD, CharUnits Offset);
81812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
82ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson  void UpdateEmptyBaseSubobjects(const BaseSubobjectInfo *Info,
83a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                 CharUnits Offset, bool PlacingEmptyBase);
8458b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
85812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  void UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,
86812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson                                  const CXXRecordDecl *Class,
87a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                  CharUnits Offset);
88a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  void UpdateEmptyFieldSubobjects(const FieldDecl *FD, CharUnits Offset);
89812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
90c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson  /// AnyEmptySubobjectsBeyondOffset - Returns whether there are any empty
91c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson  /// subobjects beyond the given offset.
92fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson  bool AnyEmptySubobjectsBeyondOffset(CharUnits Offset) const {
93c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson    return Offset <= MaxEmptyClassOffset;
94c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson  }
95c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson
968c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson  CharUnits
978c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson  getFieldOffset(const ASTRecordLayout &Layout, unsigned FieldNo) const {
988c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson    uint64_t FieldOffset = Layout.getFieldOffset(FieldNo);
998c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson    assert(FieldOffset % CharWidth == 0 &&
1008c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson           "Field offset not at char boundary!");
1018c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson
102ff3a5174d1f6e7dc98de348aecfdfe1d2fb7cd53Ken Dyck    return Context.toCharUnitsFromBits(FieldOffset);
103d8da76365f40a0c12c7d802a0da2aaacf4b2cf99Anders Carlsson  }
104d8da76365f40a0c12c7d802a0da2aaacf4b2cf99Anders Carlsson
105c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davisprotected:
106fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson  bool CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
107fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson                                 CharUnits Offset) const;
108c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davis
109c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davis  bool CanPlaceBaseSubobjectAtOffset(const BaseSubobjectInfo *Info,
110a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                     CharUnits Offset);
111c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davis
112c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davis  bool CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
113c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davis                                      const CXXRecordDecl *Class,
114a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                      CharUnits Offset) const;
115c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davis  bool CanPlaceFieldSubobjectAtOffset(const FieldDecl *FD,
1168c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson                                      CharUnits Offset) const;
117c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davis
1186a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlssonpublic:
1190c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  /// This holds the size of the largest empty subobject (either a base
1200aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar  /// or a member). Will be zero if the record being built doesn't contain
1210c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  /// any empty classes.
122a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  CharUnits SizeOfLargestEmptySubobject;
1230aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  EmptySubobjectMap(const ASTContext &Context, const CXXRecordDecl *Class)
125a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  : Context(Context), CharWidth(Context.getCharWidth()), Class(Class) {
126261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson      ComputeEmptySubobjectSizes();
127261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson  }
128261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson
129261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson  /// CanPlaceBaseAtOffset - Return whether the given base class can be placed
130261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson  /// at the given offset.
1310aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar  /// Returns false if placing the record will result in two components
132261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson  /// (direct or indirect) of the same type having the same offset.
133c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson  bool CanPlaceBaseAtOffset(const BaseSubobjectInfo *Info,
134a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                            CharUnits Offset);
135812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
136812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  /// CanPlaceFieldAtOffset - Return whether a field can be placed at the given
137812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  /// offset.
138a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  bool CanPlaceFieldAtOffset(const FieldDecl *FD, CharUnits Offset);
1396a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlsson};
1400c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson
1410c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlssonvoid EmptySubobjectMap::ComputeEmptySubobjectSizes() {
1420c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  // Check the bases.
1430c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(),
1440c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson       E = Class->bases_end(); I != E; ++I) {
1450c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    const CXXRecordDecl *BaseDecl =
1460c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
1470c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson
148a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    CharUnits EmptySize;
1490c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl);
1500c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    if (BaseDecl->isEmpty()) {
1510c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson      // If the class decl is empty, get its size.
1525f022d82696c84e4d127c558871d68ac6273274eKen Dyck      EmptySize = Layout.getSize();
1530c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    } else {
1540c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson      // Otherwise, we get the largest empty subobject for the decl.
1550c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson      EmptySize = Layout.getSizeOfLargestEmptySubobject();
1560c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    }
1570aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
158a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    if (EmptySize > SizeOfLargestEmptySubobject)
159a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson      SizeOfLargestEmptySubobject = EmptySize;
1600c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  }
1610aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1620c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  // Check the fields.
1630c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  for (CXXRecordDecl::field_iterator I = Class->field_begin(),
1640c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson       E = Class->field_end(); I != E; ++I) {
1650aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1660aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar    const RecordType *RT =
167581deb3da481053c4993c7600f97acf7768caac5David Blaikie      Context.getBaseElementType(I->getType())->getAs<RecordType>();
1680aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1690c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    // We only care about record types.
1700c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    if (!RT)
1710c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson      continue;
1720c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson
173a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    CharUnits EmptySize;
1740c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    const CXXRecordDecl *MemberDecl = cast<CXXRecordDecl>(RT->getDecl());
1750c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    const ASTRecordLayout &Layout = Context.getASTRecordLayout(MemberDecl);
1760c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    if (MemberDecl->isEmpty()) {
1770c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson      // If the class decl is empty, get its size.
1785f022d82696c84e4d127c558871d68ac6273274eKen Dyck      EmptySize = Layout.getSize();
1790c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    } else {
1800c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson      // Otherwise, we get the largest empty subobject for the decl.
1810c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson      EmptySize = Layout.getSizeOfLargestEmptySubobject();
1820c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson    }
1830aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
184a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    if (EmptySize > SizeOfLargestEmptySubobject)
185a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson      SizeOfLargestEmptySubobject = EmptySize;
1860c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson  }
1870c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson}
1880c54fc91322faaa78422c3aaec261a26e45d7f8cAnders Carlsson
1890aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbarbool
190812a3456b63708a5972f712e9e4b54d3cc436378Anders CarlssonEmptySubobjectMap::CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
191fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson                                             CharUnits Offset) const {
192812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // We only need to check empty bases.
193812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  if (!RD->isEmpty())
194812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    return true;
195812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
196fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson  EmptyClassOffsetsMapTy::const_iterator I = EmptyClassOffsets.find(Offset);
197812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  if (I == EmptyClassOffsets.end())
198812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    return true;
199812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
200812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  const ClassVectorTy& Classes = I->second;
201812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  if (std::find(Classes.begin(), Classes.end(), RD) == Classes.end())
202812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    return true;
203812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
204812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // There is already an empty class of the same type at this offset.
205812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  return false;
206812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson}
207812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
208812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlssonvoid EmptySubobjectMap::AddSubobjectAtOffset(const CXXRecordDecl *RD,
209fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson                                             CharUnits Offset) {
210812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // We only care about empty bases.
211812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  if (!RD->isEmpty())
212812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    return;
213812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
214272324bc881450a71873d2f4e72f17837d8998dfRafael Espindola  // If we have empty structures inside an union, we can assign both
215272324bc881450a71873d2f4e72f17837d8998dfRafael Espindola  // the same offset. Just avoid pushing them twice in the list.
216fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson  ClassVectorTy& Classes = EmptyClassOffsets[Offset];
217272324bc881450a71873d2f4e72f17837d8998dfRafael Espindola  if (std::find(Classes.begin(), Classes.end(), RD) != Classes.end())
218272324bc881450a71873d2f4e72f17837d8998dfRafael Espindola    return;
219272324bc881450a71873d2f4e72f17837d8998dfRafael Espindola
220812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  Classes.push_back(RD);
221c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson
222c8cb462e57ac13518a170fe52b77bb8656234b35Anders Carlsson  // Update the empty class offset.
223fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson  if (Offset > MaxEmptyClassOffset)
224fe5ef73149514e513a231a1df1a5938f3ad1545aAnders Carlsson    MaxEmptyClassOffset = Offset;
225812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson}
226812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
227812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlssonbool
228a3d4380d6662a373bc78f915947e5bc06e985e91Anders CarlssonEmptySubobjectMap::CanPlaceBaseSubobjectAtOffset(const BaseSubobjectInfo *Info,
229a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                                 CharUnits Offset) {
2302177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson  // We don't have to keep looking past the maximum offset that's known to
2312177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson  // contain an empty class.
232a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  if (!AnyEmptySubobjectsBeyondOffset(Offset))
2332177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson    return true;
2342177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson
235a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  if (!CanPlaceSubobjectAtOffset(Info->Class, Offset))
236812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    return false;
237812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
23858b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  // Traverse all non-virtual bases.
2394137d517700a1b0f834535545c3f1676f40abcfbAnders Carlsson  const ASTRecordLayout &Layout = Context.getASTRecordLayout(Info->Class);
24058b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  for (unsigned I = 0, E = Info->Bases.size(); I != E; ++I) {
241ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson    BaseSubobjectInfo* Base = Info->Bases[I];
24258b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson    if (Base->IsVirtual)
24358b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson      continue;
24458b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
2456a3567442307864eac52bb84ce41465753513635Anders Carlsson    CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(Base->Class);
24658b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
24758b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson    if (!CanPlaceBaseSubobjectAtOffset(Base, BaseOffset))
24858b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson      return false;
24958b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  }
25058b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
2516e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  if (Info->PrimaryVirtualBaseInfo) {
2526e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    BaseSubobjectInfo *PrimaryVirtualBaseInfo = Info->PrimaryVirtualBaseInfo;
25358b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
25458b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson    if (Info == PrimaryVirtualBaseInfo->Derived) {
25558b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson      if (!CanPlaceBaseSubobjectAtOffset(PrimaryVirtualBaseInfo, Offset))
25658b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson        return false;
25758b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson    }
25858b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  }
25958b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
260812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // Traverse all member variables.
261812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  unsigned FieldNo = 0;
262812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  for (CXXRecordDecl::field_iterator I = Info->Class->field_begin(),
263812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson       E = Info->Class->field_end(); I != E; ++I, ++FieldNo) {
264581deb3da481053c4993c7600f97acf7768caac5David Blaikie    if (I->isBitField())
2658c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson      continue;
2668c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson
267a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    CharUnits FieldOffset = Offset + getFieldOffset(Layout, FieldNo);
268581deb3da481053c4993c7600f97acf7768caac5David Blaikie    if (!CanPlaceFieldSubobjectAtOffset(*I, FieldOffset))
269812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      return false;
270812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
271812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
27258b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  return true;
27358b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson}
27458b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
275ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlssonvoid EmptySubobjectMap::UpdateEmptyBaseSubobjects(const BaseSubobjectInfo *Info,
276a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                                  CharUnits Offset,
277e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson                                                  bool PlacingEmptyBase) {
278e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson  if (!PlacingEmptyBase && Offset >= SizeOfLargestEmptySubobject) {
279e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson    // We know that the only empty subobjects that can conflict with empty
280e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson    // subobject of non-empty bases, are empty bases that can be placed at
281e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson    // offset zero. Because of this, we only need to keep track of empty base
282e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson    // subobjects with offsets less than the size of the largest empty
283e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson    // subobject for our class.
284e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson    return;
285e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson  }
286e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson
287a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  AddSubobjectAtOffset(Info->Class, Offset);
2884137d517700a1b0f834535545c3f1676f40abcfbAnders Carlsson
28958b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  // Traverse all non-virtual bases.
2904137d517700a1b0f834535545c3f1676f40abcfbAnders Carlsson  const ASTRecordLayout &Layout = Context.getASTRecordLayout(Info->Class);
29158b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  for (unsigned I = 0, E = Info->Bases.size(); I != E; ++I) {
292ea2f41c584b9741a591e11c83819b31856f5bc18Anders Carlsson    BaseSubobjectInfo* Base = Info->Bases[I];
29358b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson    if (Base->IsVirtual)
29458b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson      continue;
2954137d517700a1b0f834535545c3f1676f40abcfbAnders Carlsson
2966a3567442307864eac52bb84ce41465753513635Anders Carlsson    CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(Base->Class);
297e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson    UpdateEmptyBaseSubobjects(Base, BaseOffset, PlacingEmptyBase);
29858b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  }
29958b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
3006e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  if (Info->PrimaryVirtualBaseInfo) {
3016e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    BaseSubobjectInfo *PrimaryVirtualBaseInfo = Info->PrimaryVirtualBaseInfo;
30258b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
30358b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson    if (Info == PrimaryVirtualBaseInfo->Derived)
304e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson      UpdateEmptyBaseSubobjects(PrimaryVirtualBaseInfo, Offset,
305e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson                                PlacingEmptyBase);
30658b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  }
307812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
308812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // Traverse all member variables.
309812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  unsigned FieldNo = 0;
310812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  for (CXXRecordDecl::field_iterator I = Info->Class->field_begin(),
311812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson       E = Info->Class->field_end(); I != E; ++I, ++FieldNo) {
312581deb3da481053c4993c7600f97acf7768caac5David Blaikie    if (I->isBitField())
3138c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson      continue;
3144137d517700a1b0f834535545c3f1676f40abcfbAnders Carlsson
315a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    CharUnits FieldOffset = Offset + getFieldOffset(Layout, FieldNo);
316581deb3da481053c4993c7600f97acf7768caac5David Blaikie    UpdateEmptyFieldSubobjects(*I, FieldOffset);
317812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
31858b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson}
31958b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson
3205b1319c78061e76d70cca50fb3343b25928e001bAnders Carlssonbool EmptySubobjectMap::CanPlaceBaseAtOffset(const BaseSubobjectInfo *Info,
321a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                             CharUnits Offset) {
322261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson  // If we know this class doesn't have any empty subobjects we don't need to
323261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson  // bother checking.
324a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  if (SizeOfLargestEmptySubobject.isZero())
325261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson    return true;
326261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson
32758b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson  if (!CanPlaceBaseSubobjectAtOffset(Info, Offset))
32858b16b6e46716e24f1cdaa0a5e1253415c4e30b3Anders Carlsson    return false;
329812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
330812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // We are able to place the base at this offset. Make sure to update the
331812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // empty base subobject map.
332e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson  UpdateEmptyBaseSubobjects(Info, Offset, Info->Class->isEmpty());
333261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson  return true;
334261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson}
335261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson
336812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlssonbool
337812a3456b63708a5972f712e9e4b54d3cc436378Anders CarlssonEmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
338812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson                                                  const CXXRecordDecl *Class,
339a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                                  CharUnits Offset) const {
3402177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson  // We don't have to keep looking past the maximum offset that's known to
3412177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson  // contain an empty class.
342a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  if (!AnyEmptySubobjectsBeyondOffset(Offset))
3432177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson    return true;
3442177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson
345a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  if (!CanPlaceSubobjectAtOffset(RD, Offset))
346812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    return false;
347812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
348812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
349812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
350812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // Traverse all non-virtual bases.
351812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
352812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson       E = RD->bases_end(); I != E; ++I) {
353812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    if (I->isVirtual())
354812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      continue;
355812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
356812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const CXXRecordDecl *BaseDecl =
357812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
358812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
3596a3567442307864eac52bb84ce41465753513635Anders Carlsson    CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(BaseDecl);
360812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    if (!CanPlaceFieldSubobjectAtOffset(BaseDecl, Class, BaseOffset))
361812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      return false;
362812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
363812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
36445f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson  if (RD == Class) {
36545f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson    // This is the most derived class, traverse virtual bases as well.
36645f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson    for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
36745f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson         E = RD->vbases_end(); I != E; ++I) {
36845f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson      const CXXRecordDecl *VBaseDecl =
36945f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson        cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
37045f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
3713069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson      CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBaseDecl);
37245f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson      if (!CanPlaceFieldSubobjectAtOffset(VBaseDecl, Class, VBaseOffset))
37345f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson        return false;
37445f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson    }
37545f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson  }
37645f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
377812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // Traverse all member variables.
378812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  unsigned FieldNo = 0;
379812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
380812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson       I != E; ++I, ++FieldNo) {
381581deb3da481053c4993c7600f97acf7768caac5David Blaikie    if (I->isBitField())
3828c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson      continue;
3838c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson
384a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    CharUnits FieldOffset = Offset + getFieldOffset(Layout, FieldNo);
385812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
386581deb3da481053c4993c7600f97acf7768caac5David Blaikie    if (!CanPlaceFieldSubobjectAtOffset(*I, FieldOffset))
387812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      return false;
388812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
389812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
390812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  return true;
391812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson}
392812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
3938c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlssonbool
3948c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders CarlssonEmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const FieldDecl *FD,
3958c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson                                                  CharUnits Offset) const {
3962177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson  // We don't have to keep looking past the maximum offset that's known to
3972177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson  // contain an empty class.
3988c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson  if (!AnyEmptySubobjectsBeyondOffset(Offset))
3992177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson    return true;
4002177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson
401812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  QualType T = FD->getType();
402812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  if (const RecordType *RT = T->getAs<RecordType>()) {
403812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
404a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    return CanPlaceFieldSubobjectAtOffset(RD, RD, Offset);
405812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
406812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
407812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // If we have an array type we need to look at every element.
408812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  if (const ConstantArrayType *AT = Context.getAsConstantArrayType(T)) {
409812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    QualType ElemTy = Context.getBaseElementType(AT);
410812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const RecordType *RT = ElemTy->getAs<RecordType>();
411812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    if (!RT)
412812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      return true;
413812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
414812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
415812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
416812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
417812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    uint64_t NumElements = Context.getConstantArrayElementCount(AT);
4188c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson    CharUnits ElementOffset = Offset;
419812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    for (uint64_t I = 0; I != NumElements; ++I) {
4202177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson      // We don't have to keep looking past the maximum offset that's known to
4212177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson      // contain an empty class.
4228c6acc6be0fbd4127d16c1c0e12a9362462e6e0cAnders Carlsson      if (!AnyEmptySubobjectsBeyondOffset(ElementOffset))
4232177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson        return true;
4242177ab7be5256e691a115356fcb8f3eef9c9733fAnders Carlsson
425a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson      if (!CanPlaceFieldSubobjectAtOffset(RD, RD, ElementOffset))
426812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson        return false;
427812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
4285f022d82696c84e4d127c558871d68ac6273274eKen Dyck      ElementOffset += Layout.getSize();
429812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    }
430812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
431812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
432812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  return true;
433812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson}
434812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
435812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlssonbool
436a3d4380d6662a373bc78f915947e5bc06e985e91Anders CarlssonEmptySubobjectMap::CanPlaceFieldAtOffset(const FieldDecl *FD,
437a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                         CharUnits Offset) {
438a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  if (!CanPlaceFieldSubobjectAtOffset(FD, Offset))
439812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    return false;
440812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
441812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // We are able to place the member variable at this offset.
442812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // Make sure to update the empty base subobject map.
443812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  UpdateEmptyFieldSubobjects(FD, Offset);
444812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  return true;
445812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson}
446812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
447812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlssonvoid EmptySubobjectMap::UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,
448812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson                                                   const CXXRecordDecl *Class,
449a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                                   CharUnits Offset) {
4505ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson  // We know that the only empty subobjects that can conflict with empty
451e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson  // field subobjects are subobjects of empty bases that can be placed at offset
4525ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson  // zero. Because of this, we only need to keep track of empty field
4535ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson  // subobjects with offsets less than the size of the largest empty
4545ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson  // subobject for our class.
4555ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson  if (Offset >= SizeOfLargestEmptySubobject)
4565ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson    return;
4575ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson
458a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson  AddSubobjectAtOffset(RD, Offset);
459812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
460812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
461812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
462812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // Traverse all non-virtual bases.
463812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
464812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson       E = RD->bases_end(); I != E; ++I) {
465812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    if (I->isVirtual())
466812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      continue;
467812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
468812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const CXXRecordDecl *BaseDecl =
469812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
470812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
4716a3567442307864eac52bb84ce41465753513635Anders Carlsson    CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(BaseDecl);
472812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    UpdateEmptyFieldSubobjects(BaseDecl, Class, BaseOffset);
473812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
474812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
47545f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson  if (RD == Class) {
47645f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson    // This is the most derived class, traverse virtual bases as well.
47745f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson    for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
47845f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson         E = RD->vbases_end(); I != E; ++I) {
47945f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson      const CXXRecordDecl *VBaseDecl =
48045f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
48145f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
4823069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson      CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBaseDecl);
48345f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson      UpdateEmptyFieldSubobjects(VBaseDecl, Class, VBaseOffset);
48445f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson    }
48545f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson  }
48645f5b54d67215639ae6585d12df5133e99180c2bAnders Carlsson
487812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // Traverse all member variables.
488812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  unsigned FieldNo = 0;
489812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
490812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson       I != E; ++I, ++FieldNo) {
491581deb3da481053c4993c7600f97acf7768caac5David Blaikie    if (I->isBitField())
492fa84fbad4863e030b149febc88288514efca34b2Anders Carlsson      continue;
493fa84fbad4863e030b149febc88288514efca34b2Anders Carlsson
494a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    CharUnits FieldOffset = Offset + getFieldOffset(Layout, FieldNo);
495812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
496581deb3da481053c4993c7600f97acf7768caac5David Blaikie    UpdateEmptyFieldSubobjects(*I, FieldOffset);
497812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
498812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson}
499812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
500812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlssonvoid EmptySubobjectMap::UpdateEmptyFieldSubobjects(const FieldDecl *FD,
501a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson                                                   CharUnits Offset) {
502812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  QualType T = FD->getType();
503812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  if (const RecordType *RT = T->getAs<RecordType>()) {
504812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
505812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    UpdateEmptyFieldSubobjects(RD, RD, Offset);
506812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    return;
507812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
508812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
509812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  // If we have an array type we need to update every element.
510812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  if (const ConstantArrayType *AT = Context.getAsConstantArrayType(T)) {
511812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    QualType ElemTy = Context.getBaseElementType(AT);
512812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const RecordType *RT = ElemTy->getAs<RecordType>();
513812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    if (!RT)
514812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      return;
515812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
516812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
517812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
518812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
519812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    uint64_t NumElements = Context.getConstantArrayElementCount(AT);
520a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson    CharUnits ElementOffset = Offset;
521812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
522812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    for (uint64_t I = 0; I != NumElements; ++I) {
5235ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson      // We know that the only empty subobjects that can conflict with empty
524e3362bc104f401564a68ef2e0e5fd89f440cf4fcAnders Carlsson      // field subobjects are subobjects of empty bases that can be placed at
5255ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson      // offset zero. Because of this, we only need to keep track of empty field
5265ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson      // subobjects with offsets less than the size of the largest empty
5275ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson      // subobject for our class.
5285ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson      if (ElementOffset >= SizeOfLargestEmptySubobject)
5295ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson        return;
5305ccfdd8d215c7bf324a14523c71ed328325c2bc8Anders Carlsson
531812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson      UpdateEmptyFieldSubobjects(RD, RD, ElementOffset);
5325f022d82696c84e4d127c558871d68ac6273274eKen Dyck      ElementOffset += Layout.getSize();
533812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson    }
534812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson  }
535812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson}
536812a3456b63708a5972f712e9e4b54d3cc436378Anders Carlsson
537441c6239c6df8c759bacf6510efbfd434b647066John McCalltypedef llvm::SmallPtrSet<const CXXRecordDecl*, 4> ClassSetTy;
538441c6239c6df8c759bacf6510efbfd434b647066John McCall
5397d0918acd134ab93b7d3eb6add93dfde37b1f7b3Anders Carlssonclass RecordLayoutBuilder {
540c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davisprotected:
5419392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  // FIXME: Remove this and make the appropriate fields public.
5429392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  friend class clang::ASTContext;
5430aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
5444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  const ASTContext &Context;
5459392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
5466a91c0328c81fe1be4e5380fb0e586cafee53b26Anders Carlsson  EmptySubobjectMap *EmptySubobjects;
5470aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
5489392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// Size - The current size of the record layout.
5499392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  uint64_t Size;
5500aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
5519392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// Alignment - The current alignment of the record layout.
552ea7f6c2c53127b875ed432fd1793d48270d8ba6bKen Dyck  CharUnits Alignment;
5530aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
55478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  /// \brief The alignment if attribute packed is not used.
5556feb4bb3defce7e5efc05a69c6bd7dfc9c59fa45Ken Dyck  CharUnits UnpackedAlignment;
55678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
5575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<uint64_t, 16> FieldOffsets;
5589392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
559453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// \brief Whether the external AST source has provided a layout for this
560453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// record.
561453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  unsigned ExternalLayout : 1;
562394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor
563394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  /// \brief Whether we need to infer alignment, even when we have an
564394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  /// externally-provided layout.
565394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  unsigned InferAlignment : 1;
566453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
5679392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// Packed - Whether the record is packed or not.
568c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  unsigned Packed : 1;
569c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar
570c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  unsigned IsUnion : 1;
571c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar
572c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  unsigned IsMac68kAlign : 1;
57362055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian
57462055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian  unsigned IsMsStruct : 1;
5759392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
5769392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// UnfilledBitsInLastByte - If the last field laid out was a bitfield,
5779392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// this contains the number of bits in the last byte that can be used for
5789392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// an adjacent bitfield if necessary.
5799392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  unsigned char UnfilledBitsInLastByte;
5800aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
5819392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// MaxFieldAlignment - The maximum allowed field alignment. This is set by
5820aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar  /// #pragma pack.
583834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck  CharUnits MaxFieldAlignment;
5840aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
5859392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// DataSize - The data size of the record being laid out.
5869392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  uint64_t DataSize;
5870aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
588a1fdb0bc09aa0d17841cdbdd8c52cd1368251cbfKen Dyck  CharUnits NonVirtualSize;
589df205382dae666b011d857402114e4f4acd56c81Ken Dyck  CharUnits NonVirtualAlignment;
5900aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
591855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian  FieldDecl *ZeroLengthBitfield;
592340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian
5939392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// PrimaryBase - the primary base class (if one exists) of the class
5949392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// we're laying out.
5959392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  const CXXRecordDecl *PrimaryBase;
5960aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
5979392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// PrimaryBaseIsVirtual - Whether the primary base of the class we're laying
5989392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// out is virtual.
5999392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  bool PrimaryBaseIsVirtual;
6009392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
601441c6239c6df8c759bacf6510efbfd434b647066John McCall  /// HasOwnVFPtr - Whether the class provides its own vtable/vftbl
602441c6239c6df8c759bacf6510efbfd434b647066John McCall  /// pointer, as opposed to inheriting one from a primary base class.
603441c6239c6df8c759bacf6510efbfd434b647066John McCall  bool HasOwnVFPtr;
604227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman
6052fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  /// VBPtrOffset - Virtual base table offset. Only for MS layout.
6062fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  CharUnits VBPtrOffset;
6072fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
608376bda924ac92462a22d6a22ea65d8c1bb8f26f3Anders Carlsson  typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;
6090aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
6109392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// Bases - base classes and their offsets in the record.
6119392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  BaseOffsetsMapTy Bases;
6120aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
6139392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  // VBases - virtual base classes and their offsets in the record.
614441c6239c6df8c759bacf6510efbfd434b647066John McCall  ASTRecordLayout::VBaseOffsetsMapTy VBases;
6159392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
6169392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// IndirectPrimaryBases - Virtual base classes, direct or indirect, that are
6179392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// primary base classes for some other direct or indirect base class.
618245656ec65ec600ef1ab05f4c8d9f780542d689dAnders Carlsson  CXXIndirectPrimaryBaseSet IndirectPrimaryBases;
6190aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
6209392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// FirstNearlyEmptyVBase - The first nearly empty virtual base class in
6219392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// inheritance graph order. Used for determining the primary base class.
6229392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  const CXXRecordDecl *FirstNearlyEmptyVBase;
6239392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
6249392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// VisitedVirtualBases - A set of all the visited virtual bases, used to
6259392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// avoid visiting virtual bases more than once.
6269392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBases;
6270aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
628453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// \brief Externally-provided size.
629453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  uint64_t ExternalSize;
630453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
631453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// \brief Externally-provided alignment.
632453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  uint64_t ExternalAlign;
633453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
634453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// \brief Externally-provided field offsets.
635453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  llvm::DenseMap<const FieldDecl *, uint64_t> ExternalFieldOffsets;
636453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
637453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// \brief Externally-provided direct, non-virtual base offsets.
638453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  llvm::DenseMap<const CXXRecordDecl *, CharUnits> ExternalBaseOffsets;
639453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
640453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// \brief Externally-provided virtual base offsets.
641453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  llvm::DenseMap<const CXXRecordDecl *, CharUnits> ExternalVirtualBaseOffsets;
642453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
6439da235244c2de2bcca654b518c66133c30ebde53John McCall  RecordLayoutBuilder(const ASTContext &Context,
6449da235244c2de2bcca654b518c66133c30ebde53John McCall                      EmptySubobjectMap *EmptySubobjects)
645ea7f6c2c53127b875ed432fd1793d48270d8ba6bKen Dyck    : Context(Context), EmptySubobjects(EmptySubobjects), Size(0),
6469da235244c2de2bcca654b518c66133c30ebde53John McCall      Alignment(CharUnits::One()), UnpackedAlignment(CharUnits::One()),
647394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor      ExternalLayout(false), InferAlignment(false),
648394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor      Packed(false), IsUnion(false), IsMac68kAlign(false), IsMsStruct(false),
649834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck      UnfilledBitsInLastByte(0), MaxFieldAlignment(CharUnits::Zero()),
650834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck      DataSize(0), NonVirtualSize(CharUnits::Zero()),
651340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian      NonVirtualAlignment(CharUnits::One()),
652855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian      ZeroLengthBitfield(0), PrimaryBase(0),
653227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman      PrimaryBaseIsVirtual(false),
654441c6239c6df8c759bacf6510efbfd434b647066John McCall      HasOwnVFPtr(false),
655227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman      VBPtrOffset(CharUnits::fromQuantity(-1)),
6562fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman      FirstNearlyEmptyVBase(0) { }
6570aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
6589da235244c2de2bcca654b518c66133c30ebde53John McCall  /// Reset this RecordLayoutBuilder to a fresh state, using the given
6599da235244c2de2bcca654b518c66133c30ebde53John McCall  /// alignment as the initial alignment.  This is used for the
6609da235244c2de2bcca654b518c66133c30ebde53John McCall  /// correct layout of vb-table pointers in MSVC.
6619da235244c2de2bcca654b518c66133c30ebde53John McCall  void resetWithTargetAlignment(CharUnits TargetAlignment) {
6629da235244c2de2bcca654b518c66133c30ebde53John McCall    const ASTContext &Context = this->Context;
6639da235244c2de2bcca654b518c66133c30ebde53John McCall    EmptySubobjectMap *EmptySubobjects = this->EmptySubobjects;
6649da235244c2de2bcca654b518c66133c30ebde53John McCall    this->~RecordLayoutBuilder();
6659da235244c2de2bcca654b518c66133c30ebde53John McCall    new (this) RecordLayoutBuilder(Context, EmptySubobjects);
6669da235244c2de2bcca654b518c66133c30ebde53John McCall    Alignment = UnpackedAlignment = TargetAlignment;
6679da235244c2de2bcca654b518c66133c30ebde53John McCall  }
6689da235244c2de2bcca654b518c66133c30ebde53John McCall
6699392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void Layout(const RecordDecl *D);
670c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  void Layout(const CXXRecordDecl *D);
6719392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void Layout(const ObjCInterfaceDecl *D);
6729392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
6739392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void LayoutFields(const RecordDecl *D);
6749392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void LayoutField(const FieldDecl *D);
67578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  void LayoutWideBitField(uint64_t FieldSize, uint64_t TypeSize,
67678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                          bool FieldPacked, const FieldDecl *D);
6779392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void LayoutBitField(const FieldDecl *D);
6789da235244c2de2bcca654b518c66133c30ebde53John McCall
679b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  TargetCXXABI getCXXABI() const {
680b8b2c9da87e7d70a1679db026f40548b3192b705John McCall    return Context.getTargetInfo().getCXXABI();
681b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  }
682b8b2c9da87e7d70a1679db026f40548b3192b705John McCall
6839da235244c2de2bcca654b518c66133c30ebde53John McCall  bool isMicrosoftCXXABI() const {
684b8b2c9da87e7d70a1679db026f40548b3192b705John McCall    return getCXXABI().isMicrosoft();
6859da235244c2de2bcca654b518c66133c30ebde53John McCall  }
6869da235244c2de2bcca654b518c66133c30ebde53John McCall
6872fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  void MSLayoutVirtualBases(const CXXRecordDecl *RD);
6889392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
6896e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// BaseSubobjectInfoAllocator - Allocator for BaseSubobjectInfo objects.
6906e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  llvm::SpecificBumpPtrAllocator<BaseSubobjectInfo> BaseSubobjectInfoAllocator;
6916e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
6926e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  typedef llvm::DenseMap<const CXXRecordDecl *, BaseSubobjectInfo *>
6936e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    BaseSubobjectInfoMapTy;
6946e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
6956e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// VirtualBaseInfo - Map from all the (direct or indirect) virtual bases
6966e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// of the class we're laying out to their base subobject info.
6976e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  BaseSubobjectInfoMapTy VirtualBaseInfo;
6986e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
6996e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// NonVirtualBaseInfo - Map from all the direct non-virtual bases of the
7006e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// class we're laying out to their base subobject info.
7016e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  BaseSubobjectInfoMapTy NonVirtualBaseInfo;
7026e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
7036e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// ComputeBaseSubobjectInfo - Compute the base subobject information for the
7046e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// bases of the given class.
7056e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  void ComputeBaseSubobjectInfo(const CXXRecordDecl *RD);
7066e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
7076e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// ComputeBaseSubobjectInfo - Compute the base subobject information for a
7086e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  /// single class and all of its base classes.
7096e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  BaseSubobjectInfo *ComputeBaseSubobjectInfo(const CXXRecordDecl *RD,
7106e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson                                              bool IsVirtual,
7116e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson                                              BaseSubobjectInfo *Derived);
7129392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
7139392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// DeterminePrimaryBase - Determine the primary base of the given class.
7149392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void DeterminePrimaryBase(const CXXRecordDecl *RD);
7159392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
7169392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void SelectPrimaryVBase(const CXXRecordDecl *RD);
7170aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
718227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  void EnsureVTablePointerAlignment(CharUnits UnpackedBaseAlign);
719c9f8aece7e111f90265dfad9a81f3f517be948deCharles Davis
7200aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar  /// LayoutNonVirtualBases - Determines the primary base class (if any) and
7219392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// lays it out. Will then proceed to lay out all non-virtual base clasess.
7229392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void LayoutNonVirtualBases(const CXXRecordDecl *RD);
7239392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
7249392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// LayoutNonVirtualBase - Lays out a single non-virtual base.
72507cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson  void LayoutNonVirtualBase(const BaseSubobjectInfo *Base);
7269392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
727a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson  void AddPrimaryVirtualBaseOffsets(const BaseSubobjectInfo *Info,
728a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson                                    CharUnits Offset);
7299392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
7309da235244c2de2bcca654b518c66133c30ebde53John McCall  bool needsVFTable(const CXXRecordDecl *RD) const;
731441c6239c6df8c759bacf6510efbfd434b647066John McCall  bool hasNewVirtualFunction(const CXXRecordDecl *RD,
732441c6239c6df8c759bacf6510efbfd434b647066John McCall                             bool IgnoreDestructor = false) const;
7339da235244c2de2bcca654b518c66133c30ebde53John McCall  bool isPossiblePrimaryBase(const CXXRecordDecl *Base) const;
73497c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
735441c6239c6df8c759bacf6510efbfd434b647066John McCall  void computeVtordisps(const CXXRecordDecl *RD,
736441c6239c6df8c759bacf6510efbfd434b647066John McCall                        ClassSetTy &VtordispVBases);
737441c6239c6df8c759bacf6510efbfd434b647066John McCall
7389392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// LayoutVirtualBases - Lays out all the virtual bases.
7399392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  void LayoutVirtualBases(const CXXRecordDecl *RD,
7409392fa63e45716e32061d05673fa28909f325b02Anders Carlsson                          const CXXRecordDecl *MostDerivedClass);
7419392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
7429392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// LayoutVirtualBase - Lays out a single virtual base.
743441c6239c6df8c759bacf6510efbfd434b647066John McCall  void LayoutVirtualBase(const BaseSubobjectInfo *Base,
744441c6239c6df8c759bacf6510efbfd434b647066John McCall                         bool IsVtordispNeed = false);
7459392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
7460aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar  /// LayoutBase - Will lay out a base and return the offset where it was
747a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson  /// placed, in chars.
748a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson  CharUnits LayoutBase(const BaseSubobjectInfo *Base);
7499392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
750c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  /// InitializeLayout - Initialize record layout for the given record decl.
751c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  void InitializeLayout(const Decl *D);
752c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson
7539392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// FinishLayout - Finalize record layout. Adjust record size based on the
7549392fa63e45716e32061d05673fa28909f325b02Anders Carlsson  /// alignment.
75578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  void FinishLayout(const NamedDecl *D);
75678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
7573263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck  void UpdateAlignment(CharUnits NewAlignment, CharUnits UnpackedNewAlignment);
7583263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck  void UpdateAlignment(CharUnits NewAlignment) {
75978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    UpdateAlignment(NewAlignment, NewAlignment);
76078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  }
76178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
762394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  /// \brief Retrieve the externally-supplied field offset for the given
763394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  /// field.
764394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  ///
765394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  /// \param Field The field whose offset is being queried.
766394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  /// \param ComputedOffset The offset that we've computed for this field.
767394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  uint64_t updateExternalFieldOffset(const FieldDecl *Field,
768394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor                                     uint64_t ComputedOffset);
769394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor
77078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  void CheckFieldPadding(uint64_t Offset, uint64_t UnpaddedOffset,
77178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                          uint64_t UnpackedOffset, unsigned UnpackedAlign,
77278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                          bool isPacked, const FieldDecl *D);
7739392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
77478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID);
7759392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
776a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  CharUnits getSize() const {
7779911344114cc493e089964f7602b619e5a47c7bcKen Dyck    assert(Size % Context.getCharWidth() == 0);
778a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    return Context.toCharUnitsFromBits(Size);
779a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  }
780a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  uint64_t getSizeInBits() const { return Size; }
781a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck
782a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  void setSize(CharUnits NewSize) { Size = Context.toBits(NewSize); }
783a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  void setSize(uint64_t NewSize) { Size = NewSize; }
784a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck
7852fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  CharUnits getAligment() const { return Alignment; }
7862fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
787a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  CharUnits getDataSize() const {
7889911344114cc493e089964f7602b619e5a47c7bcKen Dyck    assert(DataSize % Context.getCharWidth() == 0);
789a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    return Context.toCharUnitsFromBits(DataSize);
790a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  }
791a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  uint64_t getDataSizeInBits() const { return DataSize; }
792a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck
793a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  void setDataSize(CharUnits NewSize) { DataSize = Context.toBits(NewSize); }
794a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  void setDataSize(uint64_t NewSize) { DataSize = NewSize; }
795a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck
796f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko  RecordLayoutBuilder(const RecordLayoutBuilder &) LLVM_DELETED_FUNCTION;
797f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko  void operator=(const RecordLayoutBuilder &) LLVM_DELETED_FUNCTION;
7989392fa63e45716e32061d05673fa28909f325b02Anders Carlsson};
7997e220286410422ed1dc0409a9cb9708fe50e3df0Benjamin Kramer} // end anonymous namespace
8009392fa63e45716e32061d05673fa28909f325b02Anders Carlsson
8013f066522342538509cf0aa4f381503b43fbdb68bAnders Carlssonvoid
8027d0918acd134ab93b7d3eb6add93dfde37b1f7b3Anders CarlssonRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD) {
803584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
804bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar         E = RD->bases_end(); I != E; ++I) {
805584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson    assert(!I->getType()->isDependentType() &&
8069994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl           "Cannot layout class with dependent bases.");
807bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
8081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const CXXRecordDecl *Base =
809584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
810200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson
811584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson    // Check if this is a nearly empty virtual base.
812dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson    if (I->isVirtual() && Context.isNearlyEmpty(Base)) {
813584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson      // If it's not an indirect primary base, then we've found our primary
814584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson      // base.
8153f066522342538509cf0aa4f381503b43fbdb68bAnders Carlsson      if (!IndirectPrimaryBases.count(Base)) {
81628fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson        PrimaryBase = Base;
81728fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson        PrimaryBaseIsVirtual = true;
818d76264e0b20470267249660ab947197cf6d6e31fMike Stump        return;
819d76264e0b20470267249660ab947197cf6d6e31fMike Stump      }
820bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
821584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson      // Is this the first nearly empty virtual base?
822584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson      if (!FirstNearlyEmptyVBase)
823584e1dfaf6ab682cebe4fe51f55f0ae3215d303fAnders Carlsson        FirstNearlyEmptyVBase = Base;
824d76264e0b20470267249660ab947197cf6d6e31fMike Stump    }
825bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
826200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson    SelectPrimaryVBase(Base);
82728fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson    if (PrimaryBase)
82894ba380b820cde3fb9d97d5f07ac709ebbb6ac1eZhongxing Xu      return;
829d76264e0b20470267249660ab947197cf6d6e31fMike Stump  }
830d76264e0b20470267249660ab947197cf6d6e31fMike Stump}
831d76264e0b20470267249660ab947197cf6d6e31fMike Stump
832200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson/// DeterminePrimaryBase - Determine the primary base of the given class.
8337d0918acd134ab93b7d3eb6add93dfde37b1f7b3Anders Carlssonvoid RecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) {
834200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  // If the class isn't dynamic, it won't have a primary base.
835200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  if (!RD->isDynamicClass())
836200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson    return;
837bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
8383f066522342538509cf0aa4f381503b43fbdb68bAnders Carlsson  // Compute all the primary virtual bases for all of our direct and
8390880e75541899bc1cdd73c50eb549110b5916c59Mike Stump  // indirect bases, and record all their primary virtual base classes.
840245656ec65ec600ef1ab05f4c8d9f780542d689dAnders Carlsson  RD->getIndirectPrimaryBases(IndirectPrimaryBases);
8410880e75541899bc1cdd73c50eb549110b5916c59Mike Stump
842bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  // If the record has a dynamic base class, attempt to choose a primary base
843bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  // class. It is the first (in direct base class order) non-virtual dynamic
8443f066522342538509cf0aa4f381503b43fbdb68bAnders Carlsson  // base class, if one exists.
8456f376336138ea719e3c4757ae046a5768043b276Mike Stump  for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
846bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar         e = RD->bases_end(); i != e; ++i) {
847ce2009ab2f59894dbcc847e25e05abe78c296e95Anders Carlsson    // Ignore virtual bases.
848ce2009ab2f59894dbcc847e25e05abe78c296e95Anders Carlsson    if (i->isVirtual())
849ce2009ab2f59894dbcc847e25e05abe78c296e95Anders Carlsson      continue;
850bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
851ce2009ab2f59894dbcc847e25e05abe78c296e95Anders Carlsson    const CXXRecordDecl *Base =
852ce2009ab2f59894dbcc847e25e05abe78c296e95Anders Carlsson      cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
853ce2009ab2f59894dbcc847e25e05abe78c296e95Anders Carlsson
8549da235244c2de2bcca654b518c66133c30ebde53John McCall    if (isPossiblePrimaryBase(Base)) {
855ce2009ab2f59894dbcc847e25e05abe78c296e95Anders Carlsson      // We found it.
85628fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson      PrimaryBase = Base;
85728fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson      PrimaryBaseIsVirtual = false;
858ce2009ab2f59894dbcc847e25e05abe78c296e95Anders Carlsson      return;
8596f376336138ea719e3c4757ae046a5768043b276Mike Stump    }
8606f376336138ea719e3c4757ae046a5768043b276Mike Stump  }
8616f376336138ea719e3c4757ae046a5768043b276Mike Stump
86297c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // The Microsoft ABI doesn't have primary virtual bases.
8639da235244c2de2bcca654b518c66133c30ebde53John McCall  if (isMicrosoftCXXABI()) {
86497c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    assert(!PrimaryBase && "Should not get here with a primary base!");
86597c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    return;
86697c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  }
86797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
86897c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // Under the Itanium ABI, if there is no non-virtual primary base class,
86997c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // try to compute the primary virtual base.  The primary virtual base is
87097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // the first nearly empty virtual base that is not an indirect primary
87197c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // virtual base class, if one exists.
872200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  if (RD->getNumVBases() != 0) {
873200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson    SelectPrimaryVBase(RD);
87428fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson    if (PrimaryBase)
875200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson      return;
876200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  }
8776f376336138ea719e3c4757ae046a5768043b276Mike Stump
87897c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // Otherwise, it is the first indirect primary base class, if one exists.
879200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  if (FirstNearlyEmptyVBase) {
88028fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson    PrimaryBase = FirstNearlyEmptyVBase;
88128fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson    PrimaryBaseIsVirtual = true;
8826f376336138ea719e3c4757ae046a5768043b276Mike Stump    return;
883200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  }
884bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
88528fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson  assert(!PrimaryBase && "Should not get here with a primary base!");
8866f376336138ea719e3c4757ae046a5768043b276Mike Stump}
8876f376336138ea719e3c4757ae046a5768043b276Mike Stump
8886e26454ecceb20938b866717dc8a72c6d37d224dAnders CarlssonBaseSubobjectInfo *
8896e26454ecceb20938b866717dc8a72c6d37d224dAnders CarlssonRecordLayoutBuilder::ComputeBaseSubobjectInfo(const CXXRecordDecl *RD,
8906e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson                                              bool IsVirtual,
8916e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson                                              BaseSubobjectInfo *Derived) {
8926e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  BaseSubobjectInfo *Info;
8936e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
8946e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  if (IsVirtual) {
8956e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    // Check if we already have info about this virtual base.
8966e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    BaseSubobjectInfo *&InfoSlot = VirtualBaseInfo[RD];
8976e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    if (InfoSlot) {
8986e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      assert(InfoSlot->Class == RD && "Wrong class for virtual base info!");
8996e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      return InfoSlot;
9006e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    }
9016e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9026e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    // We don't, create it.
9036e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    InfoSlot = new (BaseSubobjectInfoAllocator.Allocate()) BaseSubobjectInfo;
9046e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    Info = InfoSlot;
9056e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  } else {
9066e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    Info = new (BaseSubobjectInfoAllocator.Allocate()) BaseSubobjectInfo;
9076e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  }
9086e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9096e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  Info->Class = RD;
9106e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  Info->IsVirtual = IsVirtual;
9116e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  Info->Derived = 0;
9126e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  Info->PrimaryVirtualBaseInfo = 0;
9136e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9146e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  const CXXRecordDecl *PrimaryVirtualBase = 0;
9156e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  BaseSubobjectInfo *PrimaryVirtualBaseInfo = 0;
9166e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9176e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  // Check if this base has a primary virtual base.
9186e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  if (RD->getNumVBases()) {
9196e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
920c9e814ba193f38a7b08268612248f63beb279bb3Anders Carlsson    if (Layout.isPrimaryBaseVirtual()) {
9216e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      // This base does have a primary virtual base.
9226e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      PrimaryVirtualBase = Layout.getPrimaryBase();
9236e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      assert(PrimaryVirtualBase && "Didn't have a primary virtual base!");
9246e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9256e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      // Now check if we have base subobject info about this primary base.
9266e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      PrimaryVirtualBaseInfo = VirtualBaseInfo.lookup(PrimaryVirtualBase);
9276e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9286e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      if (PrimaryVirtualBaseInfo) {
9296e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson        if (PrimaryVirtualBaseInfo->Derived) {
9306e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson          // We did have info about this primary base, and it turns out that it
9316e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson          // has already been claimed as a primary virtual base for another
9326e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson          // base.
9336e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson          PrimaryVirtualBase = 0;
9346e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson        } else {
9356e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson          // We can claim this base as our primary base.
9366e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson          Info->PrimaryVirtualBaseInfo = PrimaryVirtualBaseInfo;
9376e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson          PrimaryVirtualBaseInfo->Derived = Info;
9386e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson        }
9396e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      }
9406e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    }
9416e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  }
9426e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9436e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  // Now go through all direct bases.
9446e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
9456e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson       E = RD->bases_end(); I != E; ++I) {
9466e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    bool IsVirtual = I->isVirtual();
9476e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9486e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    const CXXRecordDecl *BaseDecl =
9496e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
9506e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9516e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    Info->Bases.push_back(ComputeBaseSubobjectInfo(BaseDecl, IsVirtual, Info));
9526e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  }
9536e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9546e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  if (PrimaryVirtualBase && !PrimaryVirtualBaseInfo) {
9556e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    // Traversing the bases must have created the base info for our primary
9566e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    // virtual base.
9576e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    PrimaryVirtualBaseInfo = VirtualBaseInfo.lookup(PrimaryVirtualBase);
9586e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    assert(PrimaryVirtualBaseInfo &&
9596e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson           "Did not create a primary virtual base!");
9606e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9616e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    // Claim the primary virtual base as our primary virtual base.
9626e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    Info->PrimaryVirtualBaseInfo = PrimaryVirtualBaseInfo;
9636e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    PrimaryVirtualBaseInfo->Derived = Info;
9646e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  }
9656e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9666e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  return Info;
9676e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson}
9686e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9696e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlssonvoid RecordLayoutBuilder::ComputeBaseSubobjectInfo(const CXXRecordDecl *RD) {
9706e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
9716e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson       E = RD->bases_end(); I != E; ++I) {
9726e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    bool IsVirtual = I->isVirtual();
9736e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9746e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    const CXXRecordDecl *BaseDecl =
9756e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
9766e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9776e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    // Compute the base subobject info for this base.
9786e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    BaseSubobjectInfo *Info = ComputeBaseSubobjectInfo(BaseDecl, IsVirtual, 0);
9796e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
9806e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    if (IsVirtual) {
9816e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      // ComputeBaseInfo has already added this base for us.
9826e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      assert(VirtualBaseInfo.count(BaseDecl) &&
9836e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson             "Did not add virtual base!");
9846e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    } else {
9856e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      // Add the base info to the map of non-virtual bases.
9866e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      assert(!NonVirtualBaseInfo.count(BaseDecl) &&
9876e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson             "Non-virtual base already exists!");
9886e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      NonVirtualBaseInfo.insert(std::make_pair(BaseDecl, Info));
9896e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson    }
9906e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  }
9916e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson}
9926e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
993e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlssonvoid
994227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli FriedmanRecordLayoutBuilder::EnsureVTablePointerAlignment(CharUnits UnpackedBaseAlign) {
99597c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  CharUnits BaseAlign = (Packed) ? CharUnits::One() : UnpackedBaseAlign;
99697c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
99797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // The maximum field alignment overrides base align.
99897c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  if (!MaxFieldAlignment.isZero()) {
99997c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    BaseAlign = std::min(BaseAlign, MaxFieldAlignment);
100097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    UnpackedBaseAlign = std::min(UnpackedBaseAlign, MaxFieldAlignment);
100197c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  }
100297c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
100397c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // Round up the current record size to pointer alignment.
1004227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  setSize(getSize().RoundUpToAlignment(BaseAlign));
1005227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  setDataSize(getSize());
100697c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
100797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  // Update the alignment.
100897c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  UpdateAlignment(BaseAlign, UnpackedBaseAlign);
100997c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman}
101097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
101197c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedmanvoid
10127d0918acd134ab93b7d3eb6add93dfde37b1f7b3Anders CarlssonRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) {
10136e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  // Then, determine the primary base class.
1014200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  DeterminePrimaryBase(RD);
1015bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
10166e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  // Compute base subobject info.
10176e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson  ComputeBaseSubobjectInfo(RD);
10186e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
1019200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  // If we have a primary base class, lay it out.
102028fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson  if (PrimaryBase) {
102128fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson    if (PrimaryBaseIsVirtual) {
10226e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      // If the primary virtual base was a primary virtual base of some other
10236e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      // base class we'll have to steal it.
10246e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      BaseSubobjectInfo *PrimaryBaseInfo = VirtualBaseInfo.lookup(PrimaryBase);
10256e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson      PrimaryBaseInfo->Derived = 0;
10266e26454ecceb20938b866717dc8a72c6d37d224dAnders Carlsson
1027200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson      // We have a virtual primary base, insert it as an indirect primary base.
102828fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson      IndirectPrimaryBases.insert(PrimaryBase);
102937147ea14f39a8522e32e3ba4d043a2a33fff90cAnders Carlsson
10300aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar      assert(!VisitedVirtualBases.count(PrimaryBase) &&
103128fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson             "vbase already visited!");
103228fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson      VisitedVirtualBases.insert(PrimaryBase);
10330aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1034276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson      LayoutVirtualBase(PrimaryBaseInfo);
103507cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson    } else {
103607cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson      BaseSubobjectInfo *PrimaryBaseInfo =
103707cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson        NonVirtualBaseInfo.lookup(PrimaryBase);
103807cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson      assert(PrimaryBaseInfo &&
103907cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson             "Did not find base info for non-virtual primary base!");
104007cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson
104107cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson      LayoutNonVirtualBase(PrimaryBaseInfo);
104207cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson    }
1043bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
10449da235244c2de2bcca654b518c66133c30ebde53John McCall  // If this class needs a vtable/vf-table and didn't get one from a
10459da235244c2de2bcca654b518c66133c30ebde53John McCall  // primary base, add it in now.
10469da235244c2de2bcca654b518c66133c30ebde53John McCall  } else if (needsVFTable(RD)) {
104797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    assert(DataSize == 0 && "Vtable pointer must be at offset zero!");
104897c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    CharUnits PtrWidth =
104997c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
1050227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman    CharUnits PtrAlign =
1051227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerAlign(0));
1052227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman    EnsureVTablePointerAlignment(PtrAlign);
1053441c6239c6df8c759bacf6510efbfd434b647066John McCall    HasOwnVFPtr = true;
105497c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    setSize(getSize() + PtrWidth);
105597c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    setDataSize(getSize());
105697c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  }
105797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
10589da235244c2de2bcca654b518c66133c30ebde53John McCall  bool HasDirectVirtualBases = false;
10599da235244c2de2bcca654b518c66133c30ebde53John McCall  bool HasNonVirtualBaseWithVBTable = false;
10609da235244c2de2bcca654b518c66133c30ebde53John McCall
1061200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  // Now lay out the non-virtual bases.
1062200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1063bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar         E = RD->bases_end(); I != E; ++I) {
1064200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson
10659da235244c2de2bcca654b518c66133c30ebde53John McCall    // Ignore virtual bases, but remember that we saw one.
10669da235244c2de2bcca654b518c66133c30ebde53John McCall    if (I->isVirtual()) {
10679da235244c2de2bcca654b518c66133c30ebde53John McCall      HasDirectVirtualBases = true;
1068200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson      continue;
10699da235244c2de2bcca654b518c66133c30ebde53John McCall    }
1070200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson
107107cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson    const CXXRecordDecl *BaseDecl =
10729da235244c2de2bcca654b518c66133c30ebde53John McCall      cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl());
10739da235244c2de2bcca654b518c66133c30ebde53John McCall
10749da235244c2de2bcca654b518c66133c30ebde53John McCall    // Remember if this base has virtual bases itself.
10759da235244c2de2bcca654b518c66133c30ebde53John McCall    if (BaseDecl->getNumVBases())
10769da235244c2de2bcca654b518c66133c30ebde53John McCall      HasNonVirtualBaseWithVBTable = true;
1077200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson
10789da235244c2de2bcca654b518c66133c30ebde53John McCall    // Skip the primary base, because we've already laid it out.  The
10799da235244c2de2bcca654b518c66133c30ebde53John McCall    // !PrimaryBaseIsVirtual check is required because we might have a
10809da235244c2de2bcca654b518c66133c30ebde53John McCall    // non-virtual base of the same type as a primary virtual base.
108107cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson    if (BaseDecl == PrimaryBase && !PrimaryBaseIsVirtual)
1082200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson      continue;
1083200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson
1084200c5c2d9488165626925235ff918e3d744d785aAnders Carlsson    // Lay out the base.
108507cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson    BaseSubobjectInfo *BaseInfo = NonVirtualBaseInfo.lookup(BaseDecl);
108607cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson    assert(BaseInfo && "Did not find base info for non-virtual base!");
108707cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson
108807cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson    LayoutNonVirtualBase(BaseInfo);
1089e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson  }
109097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman
10919da235244c2de2bcca654b518c66133c30ebde53John McCall  // In the MS ABI, add the vb-table pointer if we need one, which is
10929da235244c2de2bcca654b518c66133c30ebde53John McCall  // whenever we have a virtual base and we can't re-use a vb-table
10939da235244c2de2bcca654b518c66133c30ebde53John McCall  // pointer from a non-virtual base.
10949da235244c2de2bcca654b518c66133c30ebde53John McCall  if (isMicrosoftCXXABI() &&
10959da235244c2de2bcca654b518c66133c30ebde53John McCall      HasDirectVirtualBases && !HasNonVirtualBaseWithVBTable) {
109697c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman    CharUnits PtrWidth =
109797c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
1098227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman    CharUnits PtrAlign =
1099227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerAlign(0));
11009da235244c2de2bcca654b518c66133c30ebde53John McCall
11019da235244c2de2bcca654b518c66133c30ebde53John McCall    // MSVC potentially over-aligns the vb-table pointer by giving it
11029da235244c2de2bcca654b518c66133c30ebde53John McCall    // the max alignment of all the non-virtual objects in the class.
11039da235244c2de2bcca654b518c66133c30ebde53John McCall    // This is completely unnecessary, but we're not here to pass
11049da235244c2de2bcca654b518c66133c30ebde53John McCall    // judgment.
11059da235244c2de2bcca654b518c66133c30ebde53John McCall    //
11069da235244c2de2bcca654b518c66133c30ebde53John McCall    // Note that we've only laid out the non-virtual bases, so on the
11079da235244c2de2bcca654b518c66133c30ebde53John McCall    // first pass Alignment won't be set correctly here, but if the
11089da235244c2de2bcca654b518c66133c30ebde53John McCall    // vb-table doesn't end up aligned correctly we'll come through
11099da235244c2de2bcca654b518c66133c30ebde53John McCall    // and redo the layout from scratch with the right alignment.
11109da235244c2de2bcca654b518c66133c30ebde53John McCall    //
11119da235244c2de2bcca654b518c66133c30ebde53John McCall    // TODO: Instead of doing this, just lay out the fields as if the
11129da235244c2de2bcca654b518c66133c30ebde53John McCall    // vb-table were at offset zero, then retroactively bump the field
11139da235244c2de2bcca654b518c66133c30ebde53John McCall    // offsets up.
1114227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman    PtrAlign = std::max(PtrAlign, Alignment);
11159da235244c2de2bcca654b518c66133c30ebde53John McCall
11169da235244c2de2bcca654b518c66133c30ebde53John McCall    EnsureVTablePointerAlignment(PtrAlign);
11179da235244c2de2bcca654b518c66133c30ebde53John McCall    VBPtrOffset = getSize();
11189da235244c2de2bcca654b518c66133c30ebde53John McCall    setSize(getSize() + PtrWidth);
11199da235244c2de2bcca654b518c66133c30ebde53John McCall    setDataSize(getSize());
112097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedman  }
1121e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson}
1122e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
112307cebc57123db6a50c7c293e44a9647ce069952bAnders Carlssonvoid RecordLayoutBuilder::LayoutNonVirtualBase(const BaseSubobjectInfo *Base) {
1124e3bdbee47059839d5e24acab5ee7b925285f573eAnders Carlsson  // Layout the base.
1125a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson  CharUnits Offset = LayoutBase(Base);
1126bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
1127e3bdbee47059839d5e24acab5ee7b925285f573eAnders Carlsson  // Add its base class offset.
112807cebc57123db6a50c7c293e44a9647ce069952bAnders Carlsson  assert(!Bases.count(Base->Class) && "base offset already exists!");
1129a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson  Bases.insert(std::make_pair(Base->Class, Offset));
11303cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson
11313cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  AddPrimaryVirtualBaseOffsets(Base, Offset);
1132e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson}
1133968db3364611a475909b5e76969d2f5472e65597Mike Stump
1134bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbarvoid
11353cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders CarlssonRecordLayoutBuilder::AddPrimaryVirtualBaseOffsets(const BaseSubobjectInfo *Info,
1136a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson                                                  CharUnits Offset) {
11373cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  // This base isn't interesting, it has no virtual bases.
11383cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  if (!Info->Class->getNumVBases())
11393cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson    return;
11403cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson
11413cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  // First, check if we have a virtual primary base to add offsets for.
11423cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  if (Info->PrimaryVirtualBaseInfo) {
11433cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson    assert(Info->PrimaryVirtualBaseInfo->IsVirtual &&
11443cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson           "Primary virtual base is not virtual!");
11453cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson    if (Info->PrimaryVirtualBaseInfo->Derived == Info) {
11463cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson      // Add the offset.
11473cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson      assert(!VBases.count(Info->PrimaryVirtualBaseInfo->Class) &&
11483cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson             "primary vbase offset already exists!");
11493cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson      VBases.insert(std::make_pair(Info->PrimaryVirtualBaseInfo->Class,
1150441c6239c6df8c759bacf6510efbfd434b647066John McCall                                   ASTRecordLayout::VBaseInfo(Offset, false)));
11513cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson
11523cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson      // Traverse the primary virtual base.
11533cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson      AddPrimaryVirtualBaseOffsets(Info->PrimaryVirtualBaseInfo, Offset);
11543cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson    }
115597913576dbe624971bf18726899983d211d742c0Anders Carlsson  }
115697913576dbe624971bf18726899983d211d742c0Anders Carlsson
11573cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  // Now go through all direct non-virtual bases.
11583cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  const ASTRecordLayout &Layout = Context.getASTRecordLayout(Info->Class);
11593cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  for (unsigned I = 0, E = Info->Bases.size(); I != E; ++I) {
11603cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson    const BaseSubobjectInfo *Base = Info->Bases[I];
11613cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson    if (Base->IsVirtual)
116297913576dbe624971bf18726899983d211d742c0Anders Carlsson      continue;
11630aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
11646a3567442307864eac52bb84ce41465753513635Anders Carlsson    CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(Base->Class);
11653cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson    AddPrimaryVirtualBaseOffsets(Base, BaseOffset);
116697913576dbe624971bf18726899983d211d742c0Anders Carlsson  }
116797913576dbe624971bf18726899983d211d742c0Anders Carlsson}
116897913576dbe624971bf18726899983d211d742c0Anders Carlsson
11699da235244c2de2bcca654b518c66133c30ebde53John McCall/// needsVFTable - Return true if this class needs a vtable or vf-table
11709da235244c2de2bcca654b518c66133c30ebde53John McCall/// when laid out as a base class.  These are treated the same because
11719da235244c2de2bcca654b518c66133c30ebde53John McCall/// they're both always laid out at offset zero.
11729da235244c2de2bcca654b518c66133c30ebde53John McCall///
11739da235244c2de2bcca654b518c66133c30ebde53John McCall/// This function assumes that the class has no primary base.
11749da235244c2de2bcca654b518c66133c30ebde53John McCallbool RecordLayoutBuilder::needsVFTable(const CXXRecordDecl *RD) const {
11759da235244c2de2bcca654b518c66133c30ebde53John McCall  assert(!PrimaryBase);
11769da235244c2de2bcca654b518c66133c30ebde53John McCall
11779da235244c2de2bcca654b518c66133c30ebde53John McCall  // In the Itanium ABI, every dynamic class needs a vtable: even if
11789da235244c2de2bcca654b518c66133c30ebde53John McCall  // this class has no virtual functions as a base class (i.e. it's
11799da235244c2de2bcca654b518c66133c30ebde53John McCall  // non-polymorphic or only has virtual functions from virtual
11809da235244c2de2bcca654b518c66133c30ebde53John McCall  // bases),x it still needs a vtable to locate its virtual bases.
11819da235244c2de2bcca654b518c66133c30ebde53John McCall  if (!isMicrosoftCXXABI())
11829da235244c2de2bcca654b518c66133c30ebde53John McCall    return RD->isDynamicClass();
11839da235244c2de2bcca654b518c66133c30ebde53John McCall
11849da235244c2de2bcca654b518c66133c30ebde53John McCall  // In the MS ABI, we need a vfptr if the class has virtual functions
11859da235244c2de2bcca654b518c66133c30ebde53John McCall  // other than those declared by its virtual bases.  The AST doesn't
11869da235244c2de2bcca654b518c66133c30ebde53John McCall  // tell us that directly, and checking manually for virtual
11879da235244c2de2bcca654b518c66133c30ebde53John McCall  // functions that aren't overrides is expensive, but there are
11889da235244c2de2bcca654b518c66133c30ebde53John McCall  // some important shortcuts:
11899da235244c2de2bcca654b518c66133c30ebde53John McCall
11909da235244c2de2bcca654b518c66133c30ebde53John McCall  //  - Non-polymorphic classes have no virtual functions at all.
11919da235244c2de2bcca654b518c66133c30ebde53John McCall  if (!RD->isPolymorphic()) return false;
11929da235244c2de2bcca654b518c66133c30ebde53John McCall
11939da235244c2de2bcca654b518c66133c30ebde53John McCall  //  - Polymorphic classes with no virtual bases must either declare
11949da235244c2de2bcca654b518c66133c30ebde53John McCall  //    virtual functions directly or inherit them, but in the latter
11959da235244c2de2bcca654b518c66133c30ebde53John McCall  //    case we would have a primary base.
11969da235244c2de2bcca654b518c66133c30ebde53John McCall  if (RD->getNumVBases() == 0) return true;
11979da235244c2de2bcca654b518c66133c30ebde53John McCall
11989da235244c2de2bcca654b518c66133c30ebde53John McCall  return hasNewVirtualFunction(RD);
11999da235244c2de2bcca654b518c66133c30ebde53John McCall}
12009da235244c2de2bcca654b518c66133c30ebde53John McCall
1201441c6239c6df8c759bacf6510efbfd434b647066John McCall/// Does the given class inherit non-virtually from any of the classes
1202441c6239c6df8c759bacf6510efbfd434b647066John McCall/// in the given set?
1203441c6239c6df8c759bacf6510efbfd434b647066John McCallstatic bool hasNonVirtualBaseInSet(const CXXRecordDecl *RD,
1204441c6239c6df8c759bacf6510efbfd434b647066John McCall                                   const ClassSetTy &set) {
1205441c6239c6df8c759bacf6510efbfd434b647066John McCall  for (CXXRecordDecl::base_class_const_iterator
1206441c6239c6df8c759bacf6510efbfd434b647066John McCall         I = RD->bases_begin(), E = RD->bases_end(); I != E; ++I) {
1207441c6239c6df8c759bacf6510efbfd434b647066John McCall    // Ignore virtual links.
1208441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (I->isVirtual()) continue;
1209441c6239c6df8c759bacf6510efbfd434b647066John McCall
1210441c6239c6df8c759bacf6510efbfd434b647066John McCall    // Check whether the set contains the base.
1211441c6239c6df8c759bacf6510efbfd434b647066John McCall    const CXXRecordDecl *base = I->getType()->getAsCXXRecordDecl();
1212441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (set.count(base))
1213441c6239c6df8c759bacf6510efbfd434b647066John McCall      return true;
1214441c6239c6df8c759bacf6510efbfd434b647066John McCall
1215441c6239c6df8c759bacf6510efbfd434b647066John McCall    // Otherwise, recurse and propagate.
1216441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (hasNonVirtualBaseInSet(base, set))
1217441c6239c6df8c759bacf6510efbfd434b647066John McCall      return true;
1218441c6239c6df8c759bacf6510efbfd434b647066John McCall  }
1219441c6239c6df8c759bacf6510efbfd434b647066John McCall
1220441c6239c6df8c759bacf6510efbfd434b647066John McCall  return false;
1221441c6239c6df8c759bacf6510efbfd434b647066John McCall}
1222441c6239c6df8c759bacf6510efbfd434b647066John McCall
1223441c6239c6df8c759bacf6510efbfd434b647066John McCall/// Does the given method (B::foo()) already override a method (A::foo())
1224441c6239c6df8c759bacf6510efbfd434b647066John McCall/// such that A requires a vtordisp in B?  If so, we don't need to add a
1225441c6239c6df8c759bacf6510efbfd434b647066John McCall/// new vtordisp for B in a yet-more-derived class C providing C::foo().
1226441c6239c6df8c759bacf6510efbfd434b647066John McCallstatic bool overridesMethodRequiringVtorDisp(const ASTContext &Context,
1227441c6239c6df8c759bacf6510efbfd434b647066John McCall                                             const CXXMethodDecl *M) {
1228441c6239c6df8c759bacf6510efbfd434b647066John McCall  CXXMethodDecl::method_iterator
1229441c6239c6df8c759bacf6510efbfd434b647066John McCall    I = M->begin_overridden_methods(), E = M->end_overridden_methods();
1230441c6239c6df8c759bacf6510efbfd434b647066John McCall  if (I == E) return false;
1231441c6239c6df8c759bacf6510efbfd434b647066John McCall
1232441c6239c6df8c759bacf6510efbfd434b647066John McCall  const ASTRecordLayout::VBaseOffsetsMapTy &offsets =
1233441c6239c6df8c759bacf6510efbfd434b647066John McCall    Context.getASTRecordLayout(M->getParent()).getVBaseOffsetsMap();
1234441c6239c6df8c759bacf6510efbfd434b647066John McCall  do {
1235441c6239c6df8c759bacf6510efbfd434b647066John McCall    const CXXMethodDecl *overridden = *I;
1236441c6239c6df8c759bacf6510efbfd434b647066John McCall
1237441c6239c6df8c759bacf6510efbfd434b647066John McCall    // If the overridden method's class isn't recognized as a virtual
1238441c6239c6df8c759bacf6510efbfd434b647066John McCall    // base in the derived class, ignore it.
1239441c6239c6df8c759bacf6510efbfd434b647066John McCall    ASTRecordLayout::VBaseOffsetsMapTy::const_iterator
1240441c6239c6df8c759bacf6510efbfd434b647066John McCall      it = offsets.find(overridden->getParent());
1241441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (it == offsets.end()) continue;
1242441c6239c6df8c759bacf6510efbfd434b647066John McCall
1243441c6239c6df8c759bacf6510efbfd434b647066John McCall    // Otherwise, check if the overridden method's class needs a vtordisp.
1244441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (it->second.hasVtorDisp()) return true;
1245441c6239c6df8c759bacf6510efbfd434b647066John McCall
1246441c6239c6df8c759bacf6510efbfd434b647066John McCall  } while (++I != E);
1247441c6239c6df8c759bacf6510efbfd434b647066John McCall  return false;
1248441c6239c6df8c759bacf6510efbfd434b647066John McCall}
1249441c6239c6df8c759bacf6510efbfd434b647066John McCall
1250441c6239c6df8c759bacf6510efbfd434b647066John McCall/// In the Microsoft ABI, decide which of the virtual bases require a
1251441c6239c6df8c759bacf6510efbfd434b647066John McCall/// vtordisp field.
1252441c6239c6df8c759bacf6510efbfd434b647066John McCallvoid RecordLayoutBuilder::computeVtordisps(const CXXRecordDecl *RD,
1253441c6239c6df8c759bacf6510efbfd434b647066John McCall                                           ClassSetTy &vtordispVBases) {
1254441c6239c6df8c759bacf6510efbfd434b647066John McCall  // Bail out if we have no virtual bases.
1255441c6239c6df8c759bacf6510efbfd434b647066John McCall  assert(RD->getNumVBases());
1256441c6239c6df8c759bacf6510efbfd434b647066John McCall
1257441c6239c6df8c759bacf6510efbfd434b647066John McCall  // Build up the set of virtual bases that we haven't decided yet.
1258441c6239c6df8c759bacf6510efbfd434b647066John McCall  ClassSetTy undecidedVBases;
1259441c6239c6df8c759bacf6510efbfd434b647066John McCall  for (CXXRecordDecl::base_class_const_iterator
1260441c6239c6df8c759bacf6510efbfd434b647066John McCall         I = RD->vbases_begin(), E = RD->vbases_end(); I != E; ++I) {
1261441c6239c6df8c759bacf6510efbfd434b647066John McCall    const CXXRecordDecl *vbase = I->getType()->getAsCXXRecordDecl();
1262441c6239c6df8c759bacf6510efbfd434b647066John McCall    undecidedVBases.insert(vbase);
1263441c6239c6df8c759bacf6510efbfd434b647066John McCall  }
1264441c6239c6df8c759bacf6510efbfd434b647066John McCall  assert(!undecidedVBases.empty());
1265441c6239c6df8c759bacf6510efbfd434b647066John McCall
1266441c6239c6df8c759bacf6510efbfd434b647066John McCall  // A virtual base requires a vtordisp field in a derived class if it
1267441c6239c6df8c759bacf6510efbfd434b647066John McCall  // requires a vtordisp field in a base class.  Walk all the direct
1268441c6239c6df8c759bacf6510efbfd434b647066John McCall  // bases and collect this information.
1269441c6239c6df8c759bacf6510efbfd434b647066John McCall  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1270441c6239c6df8c759bacf6510efbfd434b647066John McCall       E = RD->bases_end(); I != E; ++I) {
1271441c6239c6df8c759bacf6510efbfd434b647066John McCall    const CXXRecordDecl *base = I->getType()->getAsCXXRecordDecl();
1272441c6239c6df8c759bacf6510efbfd434b647066John McCall    const ASTRecordLayout &baseLayout = Context.getASTRecordLayout(base);
1273441c6239c6df8c759bacf6510efbfd434b647066John McCall
1274441c6239c6df8c759bacf6510efbfd434b647066John McCall    // Iterate over the set of virtual bases provided by this class.
1275441c6239c6df8c759bacf6510efbfd434b647066John McCall    for (ASTRecordLayout::VBaseOffsetsMapTy::const_iterator
1276441c6239c6df8c759bacf6510efbfd434b647066John McCall           VI = baseLayout.getVBaseOffsetsMap().begin(),
1277441c6239c6df8c759bacf6510efbfd434b647066John McCall           VE = baseLayout.getVBaseOffsetsMap().end(); VI != VE; ++VI) {
1278441c6239c6df8c759bacf6510efbfd434b647066John McCall      // If it doesn't need a vtordisp in this base, ignore it.
1279441c6239c6df8c759bacf6510efbfd434b647066John McCall      if (!VI->second.hasVtorDisp()) continue;
1280441c6239c6df8c759bacf6510efbfd434b647066John McCall
1281441c6239c6df8c759bacf6510efbfd434b647066John McCall      // If we've already seen it and decided it needs a vtordisp, ignore it.
1282441c6239c6df8c759bacf6510efbfd434b647066John McCall      if (!undecidedVBases.erase(VI->first))
1283441c6239c6df8c759bacf6510efbfd434b647066John McCall        continue;
1284441c6239c6df8c759bacf6510efbfd434b647066John McCall
1285441c6239c6df8c759bacf6510efbfd434b647066John McCall      // Add it.
1286441c6239c6df8c759bacf6510efbfd434b647066John McCall      vtordispVBases.insert(VI->first);
1287441c6239c6df8c759bacf6510efbfd434b647066John McCall
1288441c6239c6df8c759bacf6510efbfd434b647066John McCall      // Quit as soon as we've decided everything.
1289441c6239c6df8c759bacf6510efbfd434b647066John McCall      if (undecidedVBases.empty())
1290441c6239c6df8c759bacf6510efbfd434b647066John McCall        return;
1291441c6239c6df8c759bacf6510efbfd434b647066John McCall    }
1292441c6239c6df8c759bacf6510efbfd434b647066John McCall  }
1293441c6239c6df8c759bacf6510efbfd434b647066John McCall
1294441c6239c6df8c759bacf6510efbfd434b647066John McCall  // Okay, we have virtual bases that we haven't yet decided about.  A
1295441c6239c6df8c759bacf6510efbfd434b647066John McCall  // virtual base requires a vtordisp if any the non-destructor
1296441c6239c6df8c759bacf6510efbfd434b647066John McCall  // virtual methods declared in this class directly override a method
1297441c6239c6df8c759bacf6510efbfd434b647066John McCall  // provided by that virtual base.  (If so, we need to emit a thunk
1298441c6239c6df8c759bacf6510efbfd434b647066John McCall  // for that method, to be used in the construction vftable, which
1299441c6239c6df8c759bacf6510efbfd434b647066John McCall  // applies an additional 'vtordisp' this-adjustment.)
1300441c6239c6df8c759bacf6510efbfd434b647066John McCall
1301441c6239c6df8c759bacf6510efbfd434b647066John McCall  // Collect the set of bases directly overridden by any method in this class.
1302441c6239c6df8c759bacf6510efbfd434b647066John McCall  // It's possible that some of these classes won't be virtual bases, or won't be
1303441c6239c6df8c759bacf6510efbfd434b647066John McCall  // provided by virtual bases, or won't be virtual bases in the overridden
1304441c6239c6df8c759bacf6510efbfd434b647066John McCall  // instance but are virtual bases elsewhere.  Only the last matters for what
1305441c6239c6df8c759bacf6510efbfd434b647066John McCall  // we're doing, and we can ignore those:  if we don't directly override
1306441c6239c6df8c759bacf6510efbfd434b647066John McCall  // a method provided by a virtual copy of a base class, but we do directly
1307441c6239c6df8c759bacf6510efbfd434b647066John McCall  // override a method provided by a non-virtual copy of that base class,
1308441c6239c6df8c759bacf6510efbfd434b647066John McCall  // then we must indirectly override the method provided by the virtual base,
1309441c6239c6df8c759bacf6510efbfd434b647066John McCall  // and so we should already have collected it in the loop above.
1310441c6239c6df8c759bacf6510efbfd434b647066John McCall  ClassSetTy overriddenBases;
1311441c6239c6df8c759bacf6510efbfd434b647066John McCall  for (CXXRecordDecl::method_iterator
1312441c6239c6df8c759bacf6510efbfd434b647066John McCall         M = RD->method_begin(), E = RD->method_end(); M != E; ++M) {
1313441c6239c6df8c759bacf6510efbfd434b647066John McCall    // Ignore non-virtual methods and destructors.
1314441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (isa<CXXDestructorDecl>(*M) || !M->isVirtual())
1315441c6239c6df8c759bacf6510efbfd434b647066John McCall      continue;
1316441c6239c6df8c759bacf6510efbfd434b647066John McCall
1317441c6239c6df8c759bacf6510efbfd434b647066John McCall    for (CXXMethodDecl::method_iterator I = M->begin_overridden_methods(),
1318441c6239c6df8c759bacf6510efbfd434b647066John McCall          E = M->end_overridden_methods(); I != E; ++I) {
1319441c6239c6df8c759bacf6510efbfd434b647066John McCall      const CXXMethodDecl *overriddenMethod = (*I);
1320441c6239c6df8c759bacf6510efbfd434b647066John McCall
1321441c6239c6df8c759bacf6510efbfd434b647066John McCall      // Ignore methods that override methods from vbases that require
1322441c6239c6df8c759bacf6510efbfd434b647066John McCall      // require vtordisps.
1323441c6239c6df8c759bacf6510efbfd434b647066John McCall      if (overridesMethodRequiringVtorDisp(Context, overriddenMethod))
1324441c6239c6df8c759bacf6510efbfd434b647066John McCall        continue;
1325441c6239c6df8c759bacf6510efbfd434b647066John McCall
1326441c6239c6df8c759bacf6510efbfd434b647066John McCall      // As an optimization, check immediately whether we're overriding
1327441c6239c6df8c759bacf6510efbfd434b647066John McCall      // something from the undecided set.
1328441c6239c6df8c759bacf6510efbfd434b647066John McCall      const CXXRecordDecl *overriddenBase = overriddenMethod->getParent();
1329441c6239c6df8c759bacf6510efbfd434b647066John McCall      if (undecidedVBases.erase(overriddenBase)) {
1330441c6239c6df8c759bacf6510efbfd434b647066John McCall        vtordispVBases.insert(overriddenBase);
1331441c6239c6df8c759bacf6510efbfd434b647066John McCall        if (undecidedVBases.empty()) return;
1332441c6239c6df8c759bacf6510efbfd434b647066John McCall
1333441c6239c6df8c759bacf6510efbfd434b647066John McCall        // We can't 'continue;' here because one of our undecided
1334441c6239c6df8c759bacf6510efbfd434b647066John McCall        // vbases might non-virtually inherit from this base.
1335441c6239c6df8c759bacf6510efbfd434b647066John McCall        // Consider:
1336441c6239c6df8c759bacf6510efbfd434b647066John McCall        //   struct A { virtual void foo(); };
1337441c6239c6df8c759bacf6510efbfd434b647066John McCall        //   struct B : A {};
1338441c6239c6df8c759bacf6510efbfd434b647066John McCall        //   struct C : virtual A, virtual B { virtual void foo(); };
1339441c6239c6df8c759bacf6510efbfd434b647066John McCall        // We need a vtordisp for B here.
1340441c6239c6df8c759bacf6510efbfd434b647066John McCall      }
1341441c6239c6df8c759bacf6510efbfd434b647066John McCall
1342441c6239c6df8c759bacf6510efbfd434b647066John McCall      // Otherwise, just collect it.
1343441c6239c6df8c759bacf6510efbfd434b647066John McCall      overriddenBases.insert(overriddenBase);
1344441c6239c6df8c759bacf6510efbfd434b647066John McCall    }
1345441c6239c6df8c759bacf6510efbfd434b647066John McCall  }
1346441c6239c6df8c759bacf6510efbfd434b647066John McCall
1347441c6239c6df8c759bacf6510efbfd434b647066John McCall  // Walk the undecided v-bases and check whether they (non-virtually)
1348441c6239c6df8c759bacf6510efbfd434b647066John McCall  // provide any of the overridden bases.  We don't need to consider
1349441c6239c6df8c759bacf6510efbfd434b647066John McCall  // virtual links because the vtordisp inheres to the layout
1350441c6239c6df8c759bacf6510efbfd434b647066John McCall  // subobject containing the base.
1351441c6239c6df8c759bacf6510efbfd434b647066John McCall  for (ClassSetTy::const_iterator
1352441c6239c6df8c759bacf6510efbfd434b647066John McCall         I = undecidedVBases.begin(), E = undecidedVBases.end(); I != E; ++I) {
1353441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (hasNonVirtualBaseInSet(*I, overriddenBases))
1354441c6239c6df8c759bacf6510efbfd434b647066John McCall      vtordispVBases.insert(*I);
1355441c6239c6df8c759bacf6510efbfd434b647066John McCall  }
1356441c6239c6df8c759bacf6510efbfd434b647066John McCall}
1357441c6239c6df8c759bacf6510efbfd434b647066John McCall
13589da235244c2de2bcca654b518c66133c30ebde53John McCall/// hasNewVirtualFunction - Does the given polymorphic class declare a
13599da235244c2de2bcca654b518c66133c30ebde53John McCall/// virtual function that does not override a method from any of its
13609da235244c2de2bcca654b518c66133c30ebde53John McCall/// base classes?
13612fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedmanbool
1362441c6239c6df8c759bacf6510efbfd434b647066John McCallRecordLayoutBuilder::hasNewVirtualFunction(const CXXRecordDecl *RD,
1363441c6239c6df8c759bacf6510efbfd434b647066John McCall                                           bool IgnoreDestructor) const {
13649da235244c2de2bcca654b518c66133c30ebde53John McCall  if (!RD->getNumBases())
13659da235244c2de2bcca654b518c66133c30ebde53John McCall    return true;
13669da235244c2de2bcca654b518c66133c30ebde53John McCall
13672fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  for (CXXRecordDecl::method_iterator method = RD->method_begin();
13682fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman       method != RD->method_end();
13692fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman       ++method) {
1370441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (method->isVirtual() && !method->size_overridden_methods() &&
1371441c6239c6df8c759bacf6510efbfd434b647066John McCall        !(IgnoreDestructor && method->getKind() == Decl::CXXDestructor)) {
13722fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman      return true;
13732fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman    }
13742fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  }
13752fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  return false;
13762fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman}
13772fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
13789da235244c2de2bcca654b518c66133c30ebde53John McCall/// isPossiblePrimaryBase - Is the given base class an acceptable
13799da235244c2de2bcca654b518c66133c30ebde53John McCall/// primary base class?
138097c0aefe8c0523417ffe8a500a220286e11e7a46Eli Friedmanbool
1381441c6239c6df8c759bacf6510efbfd434b647066John McCallRecordLayoutBuilder::isPossiblePrimaryBase(const CXXRecordDecl *base) const {
13829da235244c2de2bcca654b518c66133c30ebde53John McCall  // In the Itanium ABI, a class can be a primary base class if it has
13839da235244c2de2bcca654b518c66133c30ebde53John McCall  // a vtable for any reason.
13849da235244c2de2bcca654b518c66133c30ebde53John McCall  if (!isMicrosoftCXXABI())
1385441c6239c6df8c759bacf6510efbfd434b647066John McCall    return base->isDynamicClass();
13869da235244c2de2bcca654b518c66133c30ebde53John McCall
13879da235244c2de2bcca654b518c66133c30ebde53John McCall  // In the MS ABI, a class can only be a primary base class if it
13889da235244c2de2bcca654b518c66133c30ebde53John McCall  // provides a vf-table at a static offset.  That means it has to be
13899da235244c2de2bcca654b518c66133c30ebde53John McCall  // non-virtual base.  The existence of a separate vb-table means
13909da235244c2de2bcca654b518c66133c30ebde53John McCall  // that it's possible to get virtual functions only from a virtual
13919da235244c2de2bcca654b518c66133c30ebde53John McCall  // base, which we have to guard against.
13929da235244c2de2bcca654b518c66133c30ebde53John McCall
13939da235244c2de2bcca654b518c66133c30ebde53John McCall  // First off, it has to have virtual functions.
1394441c6239c6df8c759bacf6510efbfd434b647066John McCall  if (!base->isPolymorphic()) return false;
1395441c6239c6df8c759bacf6510efbfd434b647066John McCall
1396441c6239c6df8c759bacf6510efbfd434b647066John McCall  // If it has no virtual bases, then the vfptr must be at a static offset.
1397441c6239c6df8c759bacf6510efbfd434b647066John McCall  if (!base->getNumVBases()) return true;
1398441c6239c6df8c759bacf6510efbfd434b647066John McCall
1399441c6239c6df8c759bacf6510efbfd434b647066John McCall  // Otherwise, the necessary information is cached in the layout.
1400441c6239c6df8c759bacf6510efbfd434b647066John McCall  const ASTRecordLayout &layout = Context.getASTRecordLayout(base);
14019da235244c2de2bcca654b518c66133c30ebde53John McCall
1402441c6239c6df8c759bacf6510efbfd434b647066John McCall  // If the base has its own vfptr, it can be a primary base.
1403441c6239c6df8c759bacf6510efbfd434b647066John McCall  if (layout.hasOwnVFPtr()) return true;
14049da235244c2de2bcca654b518c66133c30ebde53John McCall
1405441c6239c6df8c759bacf6510efbfd434b647066John McCall  // If the base has a primary base class, then it can be a primary base.
1406441c6239c6df8c759bacf6510efbfd434b647066John McCall  if (layout.getPrimaryBase()) return true;
1407441c6239c6df8c759bacf6510efbfd434b647066John McCall
1408441c6239c6df8c759bacf6510efbfd434b647066John McCall  // Otherwise it can't.
1409441c6239c6df8c759bacf6510efbfd434b647066John McCall  return false;
14102fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman}
14112fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
141297913576dbe624971bf18726899983d211d742c0Anders Carlssonvoid
14137d0918acd134ab93b7d3eb6add93dfde37b1f7b3Anders CarlssonRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD,
141497913576dbe624971bf18726899983d211d742c0Anders Carlsson                                        const CXXRecordDecl *MostDerivedClass) {
141588f4296e85d49e4ea63cda729cd5f696824c67ceAnders Carlsson  const CXXRecordDecl *PrimaryBase;
1416bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson  bool PrimaryBaseIsVirtual;
141737147ea14f39a8522e32e3ba4d043a2a33fff90cAnders Carlsson
1418bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson  if (MostDerivedClass == RD) {
141928fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson    PrimaryBase = this->PrimaryBase;
142028fdd0a8b450c1329b3303e5cf8e8a788a0ef85aAnders Carlsson    PrimaryBaseIsVirtual = this->PrimaryBaseIsVirtual;
1421bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson  } else {
14220f0e9b0ace2a970d31ac31811f07e0b1d93501d6Anders Carlsson    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
142388f4296e85d49e4ea63cda729cd5f696824c67ceAnders Carlsson    PrimaryBase = Layout.getPrimaryBase();
1424c9e814ba193f38a7b08268612248f63beb279bb3Anders Carlsson    PrimaryBaseIsVirtual = Layout.isPrimaryBaseVirtual();
1425bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson  }
1426bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson
1427622e2477d0698d734671523389277e10d8566e26Anders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1428622e2477d0698d734671523389277e10d8566e26Anders Carlsson         E = RD->bases_end(); I != E; ++I) {
1429622e2477d0698d734671523389277e10d8566e26Anders Carlsson    assert(!I->getType()->isDependentType() &&
14309994a34f6cf842721ba7723edc0b9036229fe387Sebastian Redl           "Cannot layout class with dependent bases.");
1431bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
1432276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson    const CXXRecordDecl *BaseDecl =
14339da235244c2de2bcca654b518c66133c30ebde53John McCall      cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl());
1434622e2477d0698d734671523389277e10d8566e26Anders Carlsson
1435622e2477d0698d734671523389277e10d8566e26Anders Carlsson    if (I->isVirtual()) {
1436276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson      if (PrimaryBase != BaseDecl || !PrimaryBaseIsVirtual) {
1437276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson        bool IndirectPrimaryBase = IndirectPrimaryBases.count(BaseDecl);
1438bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson
1439bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson        // Only lay out the virtual base if it's not an indirect primary base.
1440bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson        if (!IndirectPrimaryBase) {
1441bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson          // Only visit virtual bases once.
1442276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson          if (!VisitedVirtualBases.insert(BaseDecl))
1443bdda6c1788dfdb890e1eccd13b949b1cc875eeaaAnders Carlsson            continue;
14440aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1445276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson          const BaseSubobjectInfo *BaseInfo = VirtualBaseInfo.lookup(BaseDecl);
1446276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson          assert(BaseInfo && "Did not find virtual base info!");
1447276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson          LayoutVirtualBase(BaseInfo);
1448147b5ddc6c8618a9d70a83f90de409e444ae705bAnders Carlsson        }
1449968db3364611a475909b5e76969d2f5472e65597Mike Stump      }
1450fe3010d09cec5cd06e31a3d57fe188a04d9bfa17Mike Stump    }
1451bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
1452276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson    if (!BaseDecl->getNumVBases()) {
1453622e2477d0698d734671523389277e10d8566e26Anders Carlsson      // This base isn't interesting since it doesn't have any virtual bases.
1454622e2477d0698d734671523389277e10d8566e26Anders Carlsson      continue;
1455622e2477d0698d734671523389277e10d8566e26Anders Carlsson    }
1456622e2477d0698d734671523389277e10d8566e26Anders Carlsson
1457276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson    LayoutVirtualBases(BaseDecl, MostDerivedClass);
1458eb19fa948173502f47c26357c2ec41aa4be197b4Mike Stump  }
1459eb19fa948173502f47c26357c2ec41aa4be197b4Mike Stump}
1460eb19fa948173502f47c26357c2ec41aa4be197b4Mike Stump
14619da235244c2de2bcca654b518c66133c30ebde53John McCallvoid RecordLayoutBuilder::MSLayoutVirtualBases(const CXXRecordDecl *RD) {
14629da235244c2de2bcca654b518c66133c30ebde53John McCall  if (!RD->getNumVBases())
14639da235244c2de2bcca654b518c66133c30ebde53John McCall    return;
14649da235244c2de2bcca654b518c66133c30ebde53John McCall
1465441c6239c6df8c759bacf6510efbfd434b647066John McCall  ClassSetTy VtordispVBases;
1466441c6239c6df8c759bacf6510efbfd434b647066John McCall  computeVtordisps(RD, VtordispVBases);
1467441c6239c6df8c759bacf6510efbfd434b647066John McCall
14689da235244c2de2bcca654b518c66133c30ebde53John McCall  // This is substantially simplified because there are no virtual
14699da235244c2de2bcca654b518c66133c30ebde53John McCall  // primary bases.
14709da235244c2de2bcca654b518c66133c30ebde53John McCall  for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
14719da235244c2de2bcca654b518c66133c30ebde53John McCall       E = RD->vbases_end(); I != E; ++I) {
14729da235244c2de2bcca654b518c66133c30ebde53John McCall    const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl();
14739da235244c2de2bcca654b518c66133c30ebde53John McCall    const BaseSubobjectInfo *BaseInfo = VirtualBaseInfo.lookup(BaseDecl);
14749da235244c2de2bcca654b518c66133c30ebde53John McCall    assert(BaseInfo && "Did not find virtual base info!");
1475441c6239c6df8c759bacf6510efbfd434b647066John McCall
1476441c6239c6df8c759bacf6510efbfd434b647066John McCall    // If this base requires a vtordisp, add enough space for an int field.
1477441c6239c6df8c759bacf6510efbfd434b647066John McCall    // This is apparently always 32-bits, even on x64.
1478441c6239c6df8c759bacf6510efbfd434b647066John McCall    bool vtordispNeeded = false;
1479441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (VtordispVBases.count(BaseDecl)) {
1480441c6239c6df8c759bacf6510efbfd434b647066John McCall      CharUnits IntSize =
1481441c6239c6df8c759bacf6510efbfd434b647066John McCall        CharUnits::fromQuantity(Context.getTargetInfo().getIntWidth() / 8);
1482441c6239c6df8c759bacf6510efbfd434b647066John McCall
1483441c6239c6df8c759bacf6510efbfd434b647066John McCall      setSize(getSize() + IntSize);
1484441c6239c6df8c759bacf6510efbfd434b647066John McCall      setDataSize(getSize());
1485441c6239c6df8c759bacf6510efbfd434b647066John McCall      vtordispNeeded = true;
1486441c6239c6df8c759bacf6510efbfd434b647066John McCall    }
1487441c6239c6df8c759bacf6510efbfd434b647066John McCall
1488441c6239c6df8c759bacf6510efbfd434b647066John McCall    LayoutVirtualBase(BaseInfo, vtordispNeeded);
14899da235244c2de2bcca654b518c66133c30ebde53John McCall  }
14909da235244c2de2bcca654b518c66133c30ebde53John McCall}
14919da235244c2de2bcca654b518c66133c30ebde53John McCall
1492441c6239c6df8c759bacf6510efbfd434b647066John McCallvoid RecordLayoutBuilder::LayoutVirtualBase(const BaseSubobjectInfo *Base,
1493441c6239c6df8c759bacf6510efbfd434b647066John McCall                                            bool IsVtordispNeed) {
14943cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson  assert(!Base->Derived && "Trying to lay out a primary virtual base!");
14953cd09ccbb1a750a7b40593a7b0a2d95ee2a0ba0eAnders Carlsson
1496e3bdbee47059839d5e24acab5ee7b925285f573eAnders Carlsson  // Layout the base.
1497a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson  CharUnits Offset = LayoutBase(Base);
1498e3bdbee47059839d5e24acab5ee7b925285f573eAnders Carlsson
1499e3bdbee47059839d5e24acab5ee7b925285f573eAnders Carlsson  // Add its base class offset.
1500276b491b44b473d91610432aa335927b2c7ad152Anders Carlsson  assert(!VBases.count(Base->Class) && "vbase offset already exists!");
1501441c6239c6df8c759bacf6510efbfd434b647066John McCall  VBases.insert(std::make_pair(Base->Class,
1502441c6239c6df8c759bacf6510efbfd434b647066John McCall                       ASTRecordLayout::VBaseInfo(Offset, IsVtordispNeed)));
1503441c6239c6df8c759bacf6510efbfd434b647066John McCall
1504441c6239c6df8c759bacf6510efbfd434b647066John McCall  if (!isMicrosoftCXXABI())
1505441c6239c6df8c759bacf6510efbfd434b647066John McCall    AddPrimaryVirtualBaseOffsets(Base, Offset);
1506e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson}
1507e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
1508a2311513524ecef954d2b438bfbe09aa9511b660Anders CarlssonCharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
1509b1d880b15f6b254349bd7a700e6b4f2ec1c24f5bAnders Carlsson  const ASTRecordLayout &Layout = Context.getASTRecordLayout(Base->Class);
1510e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
1511453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
1512453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  CharUnits Offset;
1513453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
1514453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  // Query the external layout to see if it provides an offset.
1515453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  bool HasExternalLayout = false;
1516453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  if (ExternalLayout) {
1517453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    llvm::DenseMap<const CXXRecordDecl *, CharUnits>::iterator Known;
1518453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    if (Base->IsVirtual) {
1519453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      Known = ExternalVirtualBaseOffsets.find(Base->Class);
1520453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      if (Known != ExternalVirtualBaseOffsets.end()) {
1521453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor        Offset = Known->second;
1522453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor        HasExternalLayout = true;
1523453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      }
1524453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    } else {
1525453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      Known = ExternalBaseOffsets.find(Base->Class);
1526453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      if (Known != ExternalBaseOffsets.end()) {
1527453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor        Offset = Known->second;
1528453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor        HasExternalLayout = true;
1529453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      }
1530453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    }
1531453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  }
1532453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
1533e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson  // If we have an empty base class, try to place it at offset 0.
1534b1d880b15f6b254349bd7a700e6b4f2ec1c24f5bAnders Carlsson  if (Base->Class->isEmpty() &&
1535453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      (!HasExternalLayout || Offset == CharUnits::Zero()) &&
1536a3d4380d6662a373bc78f915947e5bc06e985e91Anders Carlsson      EmptySubobjects->CanPlaceBaseAtOffset(Base, CharUnits::Zero())) {
1537f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck    setSize(std::max(getSize(), Layout.getSize()));
1538e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
1539a2311513524ecef954d2b438bfbe09aa9511b660Anders Carlsson    return CharUnits::Zero();
1540e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson  }
1541bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
15423263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck  CharUnits UnpackedBaseAlign = Layout.getNonVirtualAlign();
15433263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck  CharUnits BaseAlign = (Packed) ? CharUnits::One() : UnpackedBaseAlign;
154443ddd9f2027bdd9c36336a342e9c0dd2aa13f836Argyrios Kyrtzidis
154543ddd9f2027bdd9c36336a342e9c0dd2aa13f836Argyrios Kyrtzidis  // The maximum field alignment overrides base align.
1546834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck  if (!MaxFieldAlignment.isZero()) {
15473263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck    BaseAlign = std::min(BaseAlign, MaxFieldAlignment);
15483263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck    UnpackedBaseAlign = std::min(UnpackedBaseAlign, MaxFieldAlignment);
154943ddd9f2027bdd9c36336a342e9c0dd2aa13f836Argyrios Kyrtzidis  }
1550bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
1551453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  if (!HasExternalLayout) {
1552453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    // Round up the current record size to the base's alignment boundary.
1553453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    Offset = getDataSize().RoundUpToAlignment(BaseAlign);
1554e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
1555453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    // Try to place the base.
1556453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    while (!EmptySubobjects->CanPlaceBaseAtOffset(Base, Offset))
1557453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      Offset += BaseAlign;
1558453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  } else {
1559453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    bool Allowed = EmptySubobjects->CanPlaceBaseAtOffset(Base, Offset);
1560453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    (void)Allowed;
1561453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    assert(Allowed && "Base subobject externally placed at overlapping offset");
1562f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor
1563f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    if (InferAlignment && Offset < getDataSize().RoundUpToAlignment(BaseAlign)){
1564f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor      // The externally-supplied base offset is before the base offset we
1565f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor      // computed. Assume that the structure is packed.
1566f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor      Alignment = CharUnits::One();
1567f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor      InferAlignment = false;
1568f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    }
1569453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  }
1570453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
1571b1d880b15f6b254349bd7a700e6b4f2ec1c24f5bAnders Carlsson  if (!Base->Class->isEmpty()) {
1572e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson    // Update the data size.
1573f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck    setDataSize(Offset + Layout.getNonVirtualSize());
1574e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
1575f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck    setSize(std::max(getSize(), getDataSize()));
1576e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson  } else
1577f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck    setSize(std::max(getSize(), Offset + Layout.getSize()));
1578e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
1579e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson  // Remember max struct/class alignment.
158043ddd9f2027bdd9c36336a342e9c0dd2aa13f836Argyrios Kyrtzidis  UpdateAlignment(BaseAlign, UnpackedBaseAlign);
1581e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
1582f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck  return Offset;
1583e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson}
1584e239b9d5da3bdc722d29c276b261c136ca9f4eaaAnders Carlsson
1585c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbarvoid RecordLayoutBuilder::InitializeLayout(const Decl *D) {
15865f608aedb6c5d32d2f7c51f9354a75b21f1eeaeeEli Friedman  if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
1587c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar    IsUnion = RD->isUnion();
15885f608aedb6c5d32d2f7c51f9354a75b21f1eeaeeEli Friedman    IsMsStruct = RD->isMsStruct(Context);
15895f608aedb6c5d32d2f7c51f9354a75b21f1eeaeeEli Friedman  }
15900aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
15915f608aedb6c5d32d2f7c51f9354a75b21f1eeaeeEli Friedman  Packed = D->hasAttr<PackedAttr>();
15920aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
159388934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  // Honor the default struct packing maximum alignment flag.
15944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (unsigned DefaultMaxFieldAlignment = Context.getLangOpts().PackStruct) {
159588934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar    MaxFieldAlignment = CharUnits::fromQuantity(DefaultMaxFieldAlignment);
159688934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  }
159788934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar
1598c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  // mac68k alignment supersedes maximum field alignment and attribute aligned,
1599c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  // and forces all structures to have 2-byte alignment. The IBM docs on it
1600c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  // allude to additional (more complicated) semantics, especially with regard
1601c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  // to bit-fields, but gcc appears not to follow that.
1602c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  if (D->hasAttr<AlignMac68kAttr>()) {
1603c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar    IsMac68kAlign = true;
1604834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck    MaxFieldAlignment = CharUnits::fromQuantity(2);
1605ea7f6c2c53127b875ed432fd1793d48270d8ba6bKen Dyck    Alignment = CharUnits::fromQuantity(2);
1606c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  } else {
1607c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar    if (const MaxFieldAlignmentAttr *MFAA = D->getAttr<MaxFieldAlignmentAttr>())
1608834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck      MaxFieldAlignment = Context.toCharUnitsFromBits(MFAA->getAlignment());
16090aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1610cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    if (unsigned MaxAlign = D->getMaxAlignment())
16113263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck      UpdateAlignment(Context.toCharUnitsFromBits(MaxAlign));
1612c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  }
1613453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
1614453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  // If there is an external AST source, ask it for the various offsets.
1615453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))
1616453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    if (ExternalASTSource *External = Context.getExternalSource()) {
1617453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      ExternalLayout = External->layoutRecordType(RD,
1618453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                                                  ExternalSize,
1619453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                                                  ExternalAlign,
1620453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                                                  ExternalFieldOffsets,
1621453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                                                  ExternalBaseOffsets,
1622453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                                                  ExternalVirtualBaseOffsets);
1623453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
1624453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      // Update based on external alignment.
1625453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      if (ExternalLayout) {
1626394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor        if (ExternalAlign > 0) {
1627394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor          Alignment = Context.toCharUnitsFromBits(ExternalAlign);
1628394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor        } else {
1629394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor          // The external source didn't have alignment information; infer it.
1630394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor          InferAlignment = true;
1631394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor        }
1632453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      }
1633453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    }
1634c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson}
163574cbe226207fd101623638dadfa7fbada04ff2a6Anders Carlsson
1636c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlssonvoid RecordLayoutBuilder::Layout(const RecordDecl *D) {
1637c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  InitializeLayout(D);
1638a2df41c107d3c5f5bff2d090fab77734e0da735dAnders Carlsson  LayoutFields(D);
16391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1640c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  // Finally, round the size of the total struct up to the alignment of the
1641c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  // struct itself.
164278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  FinishLayout(D);
1643c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson}
1644c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson
1645c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlssonvoid RecordLayoutBuilder::Layout(const CXXRecordDecl *RD) {
1646c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  InitializeLayout(RD);
1647c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson
1648c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  // Lay out the vtable and the non-virtual bases.
1649c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  LayoutNonVirtualBases(RD);
1650c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson
1651c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  LayoutFields(RD);
1652c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson
165390ce2dba294b8443169fe1a583914908fae0e767Ken Dyck  NonVirtualSize = Context.toCharUnitsFromBits(
165490ce2dba294b8443169fe1a583914908fae0e767Ken Dyck        llvm::RoundUpToAlignment(getSizeInBits(),
1655bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                                 Context.getTargetInfo().getCharAlign()));
1656ea7f6c2c53127b875ed432fd1793d48270d8ba6bKen Dyck  NonVirtualAlignment = Alignment;
16573dee6efcad9ad56d14f7edd1c29924f0b876a7f9Mike Stump
1658441c6239c6df8c759bacf6510efbfd434b647066John McCall  if (isMicrosoftCXXABI()) {
1659441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (NonVirtualSize != NonVirtualSize.RoundUpToAlignment(Alignment)) {
16609da235244c2de2bcca654b518c66133c30ebde53John McCall    CharUnits AlignMember =
16619da235244c2de2bcca654b518c66133c30ebde53John McCall      NonVirtualSize.RoundUpToAlignment(Alignment) - NonVirtualSize;
166297913576dbe624971bf18726899983d211d742c0Anders Carlsson
16639da235244c2de2bcca654b518c66133c30ebde53John McCall    setSize(getSize() + AlignMember);
16649da235244c2de2bcca654b518c66133c30ebde53John McCall    setDataSize(getSize());
1665eb19fa948173502f47c26357c2ec41aa4be197b4Mike Stump
16669da235244c2de2bcca654b518c66133c30ebde53John McCall    NonVirtualSize = Context.toCharUnitsFromBits(
16679da235244c2de2bcca654b518c66133c30ebde53John McCall                             llvm::RoundUpToAlignment(getSizeInBits(),
16689da235244c2de2bcca654b518c66133c30ebde53John McCall                             Context.getTargetInfo().getCharAlign()));
1669441c6239c6df8c759bacf6510efbfd434b647066John McCall    }
16709da235244c2de2bcca654b518c66133c30ebde53John McCall
16719da235244c2de2bcca654b518c66133c30ebde53John McCall    MSLayoutVirtualBases(RD);
16729da235244c2de2bcca654b518c66133c30ebde53John McCall  } else {
16739da235244c2de2bcca654b518c66133c30ebde53John McCall    // Lay out the virtual bases and add the primary virtual base offsets.
16749da235244c2de2bcca654b518c66133c30ebde53John McCall    LayoutVirtualBases(RD, RD);
16759da235244c2de2bcca654b518c66133c30ebde53John McCall  }
16769da235244c2de2bcca654b518c66133c30ebde53John McCall
16779da235244c2de2bcca654b518c66133c30ebde53John McCall  // Finally, round the size of the total struct up to the alignment
1678901dd668931a70932ad09092959c42693409a3cdEli Friedman  // of the struct itself.
1679901dd668931a70932ad09092959c42693409a3cdEli Friedman  FinishLayout(RD);
1680c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson
1681a1e87162d36f94d3dc58ff3f0743d6026635a0c6Anders Carlsson#ifndef NDEBUG
1682c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  // Check that we have base offsets for all bases.
1683c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1684c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson       E = RD->bases_end(); I != E; ++I) {
1685c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson    if (I->isVirtual())
1686c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson      continue;
16870aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1688c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson    const CXXRecordDecl *BaseDecl =
1689c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
1690c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson
1691c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson    assert(Bases.count(BaseDecl) && "Did not find base offset!");
1692c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  }
16930aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1694c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  // And all virtual bases.
1695c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson  for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
1696c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson       E = RD->vbases_end(); I != E; ++I) {
1697c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson    const CXXRecordDecl *BaseDecl =
1698c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
16990aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1700c6cab68ae1f8ebdcabaf51391dba09bfbad02e4fAnders Carlsson    assert(VBases.count(BaseDecl) && "Did not find base offset!");
1701a1e87162d36f94d3dc58ff3f0743d6026635a0c6Anders Carlsson  }
1702a1e87162d36f94d3dc58ff3f0743d6026635a0c6Anders Carlsson#endif
1703bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson}
1704bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson
17057d0918acd134ab93b7d3eb6add93dfde37b1f7b3Anders Carlssonvoid RecordLayoutBuilder::Layout(const ObjCInterfaceDecl *D) {
170693fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson  if (ObjCInterfaceDecl *SD = D->getSuperClass()) {
17070f0e9b0ace2a970d31ac31811f07e0b1d93501d6Anders Carlsson    const ASTRecordLayout &SL = Context.getASTObjCInterfaceLayout(SD);
170893fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson
17093263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck    UpdateAlignment(SL.getAlignment());
17101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
171193fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson    // We start laying out ivars not at the end of the superclass
171293fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson    // structure, but at the next byte following the last field.
1713a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    setSize(SL.getDataSize());
1714f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck    setDataSize(getSize());
171593fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson  }
17161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1717c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar  InitializeLayout(D);
171893fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson  // Layout each ivar sequentially.
1719db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose  for (const ObjCIvarDecl *IVD = D->all_declared_ivar_begin(); IVD;
1720db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose       IVD = IVD->getNextIvar())
1721bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian    LayoutField(IVD);
17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
172393fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson  // Finally, round the size of the total struct up to the alignment of the
172493fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson  // struct itself.
172578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  FinishLayout(D);
172693fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson}
172793fab9d67ca62e3e291803e5a1309473d6e00344Anders Carlsson
17287d0918acd134ab93b7d3eb6add93dfde37b1f7b3Anders Carlssonvoid RecordLayoutBuilder::LayoutFields(const RecordDecl *D) {
1729a2df41c107d3c5f5bff2d090fab77734e0da735dAnders Carlsson  // Layout each field, for now, just sequentially, respecting alignment.  In
1730a2df41c107d3c5f5bff2d090fab77734e0da735dAnders Carlsson  // the future, this will need to be tweakable by targets.
173162055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian  const FieldDecl *LastFD = 0;
1732855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian  ZeroLengthBitfield = 0;
17336ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian  unsigned RemainingInAlignment = 0;
17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (RecordDecl::field_iterator Field = D->field_begin(),
173562055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian       FieldEnd = D->field_end(); Field != FieldEnd; ++Field) {
173662055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian    if (IsMsStruct) {
1737581deb3da481053c4993c7600f97acf7768caac5David Blaikie      FieldDecl *FD = *Field;
1738855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian      if (Context.ZeroBitfieldFollowsBitfield(FD, LastFD))
1739855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian        ZeroLengthBitfield = FD;
174062055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian      // Zero-length bitfields following non-bitfield members are
174162055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian      // ignored:
1742855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian      else if (Context.ZeroBitfieldFollowsNonBitfield(FD, LastFD))
174362055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian        continue;
174431e7f225fa3c603b84d66bc8ebdf7ed084e36e62Fariborz Jahanian      // FIXME. streamline these conditions into a simple one.
174552bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian      else if (Context.BitfieldFollowsBitfield(FD, LastFD) ||
1746dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosier               Context.BitfieldFollowsNonBitfield(FD, LastFD) ||
1747dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosier               Context.NonBitfieldFollowsBitfield(FD, LastFD)) {
174831e7f225fa3c603b84d66bc8ebdf7ed084e36e62Fariborz Jahanian        // 1) Adjacent bit fields are packed into the same 1-, 2-, or
17499b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        // 4-byte allocation unit if the integral types are the same
17509b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        // size and if the next bit field fits into the current
17519b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        // allocation unit without crossing the boundary imposed by the
17529b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        // common alignment requirements of the bit fields.
175331e7f225fa3c603b84d66bc8ebdf7ed084e36e62Fariborz Jahanian        // 2) Establish a new alignment for a bitfield following
175452bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian        // a non-bitfield if size of their types differ.
175531e7f225fa3c603b84d66bc8ebdf7ed084e36e62Fariborz Jahanian        // 3) Establish a new alignment for a non-bitfield following
175631e7f225fa3c603b84d66bc8ebdf7ed084e36e62Fariborz Jahanian        // a bitfield if size of their types differ.
17579b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        std::pair<uint64_t, unsigned> FieldInfo =
17589b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian          Context.getTypeInfo(FD->getType());
17599b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        uint64_t TypeSize = FieldInfo.first;
17609b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        unsigned FieldAlign = FieldInfo.second;
176130364d0a6450315989f6613910b09f865044a2a0Fariborz Jahanian        // This check is needed for 'long long' in -m32 mode.
1762364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian        if (TypeSize > FieldAlign &&
1763364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian            (Context.hasSameType(FD->getType(),
1764364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian                                Context.UnsignedLongLongTy)
1765364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian             ||Context.hasSameType(FD->getType(),
1766364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian                                   Context.LongLongTy)))
176730364d0a6450315989f6613910b09f865044a2a0Fariborz Jahanian          FieldAlign = TypeSize;
17689b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        FieldInfo = Context.getTypeInfo(LastFD->getType());
17699b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        uint64_t TypeSizeLastFD = FieldInfo.first;
17709b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        unsigned FieldAlignLastFD = FieldInfo.second;
177130364d0a6450315989f6613910b09f865044a2a0Fariborz Jahanian        // This check is needed for 'long long' in -m32 mode.
1772364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian        if (TypeSizeLastFD > FieldAlignLastFD &&
1773364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian            (Context.hasSameType(LastFD->getType(),
1774364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian                                Context.UnsignedLongLongTy)
1775364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian             || Context.hasSameType(LastFD->getType(),
1776364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian                                    Context.LongLongTy)))
177730364d0a6450315989f6613910b09f865044a2a0Fariborz Jahanian          FieldAlignLastFD = TypeSizeLastFD;
17786ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
17799b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        if (TypeSizeLastFD != TypeSize) {
17806ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian          if (RemainingInAlignment &&
17816ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian              LastFD && LastFD->isBitField() &&
1782a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith              LastFD->getBitWidthValue(Context)) {
17836ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            // If previous field was a bitfield with some remaining unfilled
17846ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            // bits, pad the field so current field starts on its type boundary.
17856ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            uint64_t FieldOffset =
17866ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            getDataSizeInBits() - UnfilledBitsInLastByte;
17876ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            uint64_t NewSizeInBits = RemainingInAlignment + FieldOffset;
17886ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            setDataSize(llvm::RoundUpToAlignment(NewSizeInBits,
1789bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                                                 Context.getTargetInfo().getCharAlign()));
17906ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            setSize(std::max(getSizeInBits(), getDataSizeInBits()));
17916ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            RemainingInAlignment = 0;
17926ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian          }
17936ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
17949b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian          uint64_t UnpaddedFieldOffset =
17959b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian            getDataSizeInBits() - UnfilledBitsInLastByte;
17969b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian          FieldAlign = std::max(FieldAlign, FieldAlignLastFD);
17976ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
1798ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian          // The maximum field alignment overrides the aligned attribute.
1799ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian          if (!MaxFieldAlignment.isZero()) {
1800ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian            unsigned MaxFieldAlignmentInBits =
1801ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian              Context.toBits(MaxFieldAlignment);
1802ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian            FieldAlign = std::min(FieldAlign, MaxFieldAlignmentInBits);
1803ed63e03e35f2c8ad1a06d7bbc2249d132a730175Fariborz Jahanian          }
18046ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian
18059b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian          uint64_t NewSizeInBits =
18069b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian            llvm::RoundUpToAlignment(UnpaddedFieldOffset, FieldAlign);
18079b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian          setDataSize(llvm::RoundUpToAlignment(NewSizeInBits,
1808bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                                               Context.getTargetInfo().getCharAlign()));
18099b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian          UnfilledBitsInLastByte = getDataSizeInBits() - NewSizeInBits;
18109b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian          setSize(std::max(getSizeInBits(), getDataSizeInBits()));
18119b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian        }
18126ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        if (FD->isBitField()) {
1813a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          uint64_t FieldSize = FD->getBitWidthValue(Context);
18146ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian          assert (FieldSize > 0 && "LayoutFields - ms_struct layout");
18156ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian          if (RemainingInAlignment < FieldSize)
18166ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            RemainingInAlignment = TypeSize - FieldSize;
18176ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian          else
18186ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian            RemainingInAlignment -= FieldSize;
18196ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        }
18206ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian      }
18216ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian      else if (FD->isBitField()) {
1822a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith        uint64_t FieldSize = FD->getBitWidthValue(Context);
18236ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        std::pair<uint64_t, unsigned> FieldInfo =
18246ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian          Context.getTypeInfo(FD->getType());
18256ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        uint64_t TypeSize = FieldInfo.first;
18266ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian        RemainingInAlignment = TypeSize - FieldSize;
18279b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian      }
182862055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian      LastFD = FD;
182962055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian    }
1830bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    else if (!Context.getTargetInfo().useBitFieldTypeAlignment() &&
1831bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor             Context.getTargetInfo().useZeroLengthBitfieldAlignment()) {
1832581deb3da481053c4993c7600f97acf7768caac5David Blaikie      if (Field->isBitField() && Field->getBitWidthValue(Context) == 0)
1833581deb3da481053c4993c7600f97acf7768caac5David Blaikie        ZeroLengthBitfield = *Field;
183461a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier    }
1835581deb3da481053c4993c7600f97acf7768caac5David Blaikie    LayoutField(*Field);
183662055b0618fafb4747e783ba3fedd7bc7d57d27dFariborz Jahanian  }
18376ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian  if (IsMsStruct && RemainingInAlignment &&
1838a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith      LastFD && LastFD->isBitField() && LastFD->getBitWidthValue(Context)) {
18396ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian    // If we ended a bitfield before the full length of the type then
18406ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian    // pad the struct out to the full length of the last type.
18416ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian    uint64_t FieldOffset =
18426ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian      getDataSizeInBits() - UnfilledBitsInLastByte;
18436ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian    uint64_t NewSizeInBits = RemainingInAlignment + FieldOffset;
18446ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian    setDataSize(llvm::RoundUpToAlignment(NewSizeInBits,
1845bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                                         Context.getTargetInfo().getCharAlign()));
18466ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian    setSize(std::max(getSizeInBits(), getDataSizeInBits()));
18476ec50ad4b12cbb6ca12036080808f912d5ee2515Fariborz Jahanian  }
1848a2df41c107d3c5f5bff2d090fab77734e0da735dAnders Carlsson}
1849a2df41c107d3c5f5bff2d090fab77734e0da735dAnders Carlsson
18500aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbarvoid RecordLayoutBuilder::LayoutWideBitField(uint64_t FieldSize,
185178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                                             uint64_t TypeSize,
185278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                                             bool FieldPacked,
185378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                                             const FieldDecl *D) {
18544e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  assert(Context.getLangOpts().CPlusPlus &&
18554cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson         "Can only have wide bit-fields in C++!");
18560aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
18574cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  // Itanium C++ ABI 2.4:
18580aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar  //   If sizeof(T)*8 < n, let T' be the largest integral POD type with
18594cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  //   sizeof(T')*8 <= n.
18600aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
18614cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  QualType IntegralPODTypes[] = {
18620aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar    Context.UnsignedCharTy, Context.UnsignedShortTy, Context.UnsignedIntTy,
18634cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson    Context.UnsignedLongTy, Context.UnsignedLongLongTy
18644cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  };
18654cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
18664cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  QualType Type;
18674cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  for (unsigned I = 0, E = llvm::array_lengthof(IntegralPODTypes);
18684cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson       I != E; ++I) {
18694cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson    uint64_t Size = Context.getTypeSize(IntegralPODTypes[I]);
18704cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
18714cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson    if (Size > FieldSize)
18724cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson      break;
18734cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
18744cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson    Type = IntegralPODTypes[I];
18754cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  }
18764cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  assert(!Type.isNull() && "Did not find a type!");
18770aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
18783b3e1a1e8b44842ac3f07999c0f1eb82f13ffae4Ken Dyck  CharUnits TypeAlign = Context.getTypeAlignInChars(Type);
18794cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
18804cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  // We're not going to use any of the unfilled bits in the last byte.
18814cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  UnfilledBitsInLastByte = 0;
18824cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
1883de9f153b2348f590151504888c22cb937134cd27Anders Carlsson  uint64_t FieldOffset;
1884a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastByte;
18850aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
18864cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  if (IsUnion) {
1887a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    setDataSize(std::max(getDataSizeInBits(), FieldSize));
1888de9f153b2348f590151504888c22cb937134cd27Anders Carlsson    FieldOffset = 0;
18894cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  } else {
1890b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier    // The bitfield is allocated starting at the next offset aligned
1891b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier    // appropriately for T', with length n bits.
18923b3e1a1e8b44842ac3f07999c0f1eb82f13ffae4Ken Dyck    FieldOffset = llvm::RoundUpToAlignment(getDataSizeInBits(),
18933b3e1a1e8b44842ac3f07999c0f1eb82f13ffae4Ken Dyck                                           Context.toBits(TypeAlign));
18940aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
18954cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson    uint64_t NewSizeInBits = FieldOffset + FieldSize;
18960aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
1897d5e3ed085032def4ac875d64cb029fc3926652edKen Dyck    setDataSize(llvm::RoundUpToAlignment(NewSizeInBits,
1898bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                                         Context.getTargetInfo().getCharAlign()));
1899a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    UnfilledBitsInLastByte = getDataSizeInBits() - NewSizeInBits;
19004cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  }
19014cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
19024cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  // Place this field at the current location.
19034cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  FieldOffsets.push_back(FieldOffset);
19044cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
190578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  CheckFieldPadding(FieldOffset, UnpaddedFieldOffset, FieldOffset,
19063b3e1a1e8b44842ac3f07999c0f1eb82f13ffae4Ken Dyck                    Context.toBits(TypeAlign), FieldPacked, D);
190778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
19084cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  // Update the size.
1909a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  setSize(std::max(getSizeInBits(), getDataSizeInBits()));
19100aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
19114cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  // Remember max struct/class alignment.
19123b3e1a1e8b44842ac3f07999c0f1eb82f13ffae4Ken Dyck  UpdateAlignment(TypeAlign);
19134cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson}
19144cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
19157d0918acd134ab93b7d3eb6add93dfde37b1f7b3Anders Carlssonvoid RecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
191642dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  bool FieldPacked = Packed || D->hasAttr<PackedAttr>();
1917a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastByte;
191878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  uint64_t FieldOffset = IsUnion ? 0 : UnpaddedFieldOffset;
1919a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  uint64_t FieldSize = D->getBitWidthValue(Context);
1920bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
19210f0e9b0ace2a970d31ac31811f07e0b1d93501d6Anders Carlsson  std::pair<uint64_t, unsigned> FieldInfo = Context.getTypeInfo(D->getType());
192242dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  uint64_t TypeSize = FieldInfo.first;
192342dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  unsigned FieldAlign = FieldInfo.second;
1924855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian
192530364d0a6450315989f6613910b09f865044a2a0Fariborz Jahanian  // This check is needed for 'long long' in -m32 mode.
1926364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian  if (IsMsStruct && (TypeSize > FieldAlign) &&
1927364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian      (Context.hasSameType(D->getType(),
1928364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian                           Context.UnsignedLongLongTy)
1929364a59ed8f0b3adb6a9eb9f2d687650ec1d0d8e5Fariborz Jahanian       || Context.hasSameType(D->getType(), Context.LongLongTy)))
193030364d0a6450315989f6613910b09f865044a2a0Fariborz Jahanian    FieldAlign = TypeSize;
193161a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier
1932855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian  if (ZeroLengthBitfield) {
1933b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier    std::pair<uint64_t, unsigned> FieldInfo;
1934b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier    unsigned ZeroLengthBitfieldAlignment;
1935b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier    if (IsMsStruct) {
1936b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      // If a zero-length bitfield is inserted after a bitfield,
1937b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      // and the alignment of the zero-length bitfield is
1938b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      // greater than the member that follows it, `bar', `bar'
1939b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      // will be aligned as the type of the zero-length bitfield.
1940b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      if (ZeroLengthBitfield != D) {
1941b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier        FieldInfo = Context.getTypeInfo(ZeroLengthBitfield->getType());
1942b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier        ZeroLengthBitfieldAlignment = FieldInfo.second;
1943b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier        // Ignore alignment of subsequent zero-length bitfields.
1944b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier        if ((ZeroLengthBitfieldAlignment > FieldAlign) || (FieldSize == 0))
1945b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier          FieldAlign = ZeroLengthBitfieldAlignment;
1946b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier        if (FieldSize)
1947b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier          ZeroLengthBitfield = 0;
1948b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      }
1949b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier    } else {
1950b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      // The alignment of a zero-length bitfield affects the alignment
1951b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      // of the next member.  The alignment is the max of the zero
1952b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      // length bitfield's alignment and a target specific fixed value.
1953b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      unsigned ZeroLengthBitfieldBoundary =
1954bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor        Context.getTargetInfo().getZeroLengthBitfieldBoundary();
1955b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier      if (ZeroLengthBitfieldBoundary > FieldAlign)
1956b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier        FieldAlign = ZeroLengthBitfieldBoundary;
1957855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian    }
1958855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian  }
1959bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
19604cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  if (FieldSize > TypeSize) {
196178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    LayoutWideBitField(FieldSize, TypeSize, FieldPacked, D);
19624cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson    return;
19634cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson  }
19644cf6f5fdc529f0b4412505e2e6af099370a479b3Anders Carlsson
196578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // The align if the field is not packed. This is to check if the attribute
196678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // was unnecessary (-Wpacked).
196778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  unsigned UnpackedFieldAlign = FieldAlign;
196878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  uint64_t UnpackedFieldOffset = FieldOffset;
1969bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  if (!Context.getTargetInfo().useBitFieldTypeAlignment() && !ZeroLengthBitfield)
197078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    UnpackedFieldAlign = 1;
197178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
1972b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier  if (FieldPacked ||
1973bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      (!Context.getTargetInfo().useBitFieldTypeAlignment() && !ZeroLengthBitfield))
197442dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    FieldAlign = 1;
1975cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt  FieldAlign = std::max(FieldAlign, D->getMaxAlignment());
197678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  UnpackedFieldAlign = std::max(UnpackedFieldAlign, D->getMaxAlignment());
19771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
197842dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  // The maximum field alignment overrides the aligned attribute.
1979bff22ac1f8b78e4c19d5c3e00226ecea3b24e60fEli Friedman  if (!MaxFieldAlignment.isZero() && FieldSize != 0) {
1980834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck    unsigned MaxFieldAlignmentInBits = Context.toBits(MaxFieldAlignment);
1981834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck    FieldAlign = std::min(FieldAlign, MaxFieldAlignmentInBits);
1982834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck    UnpackedFieldAlign = std::min(UnpackedFieldAlign, MaxFieldAlignmentInBits);
198378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  }
1984bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
1985394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  // Check if we need to add padding to give the field the correct alignment.
1986394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  if (FieldSize == 0 ||
1987394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor      (MaxFieldAlignment.isZero() &&
1988394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor       (FieldOffset & (FieldAlign-1)) + FieldSize > TypeSize))
1989394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    FieldOffset = llvm::RoundUpToAlignment(FieldOffset, FieldAlign);
1990bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
1991394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  if (FieldSize == 0 ||
1992394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor      (MaxFieldAlignment.isZero() &&
1993394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor       (UnpackedFieldOffset & (UnpackedFieldAlign-1)) + FieldSize > TypeSize))
1994394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    UnpackedFieldOffset = llvm::RoundUpToAlignment(UnpackedFieldOffset,
1995394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor                                                   UnpackedFieldAlign);
199678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
1997b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier  // Padding members don't affect overall alignment, unless zero length bitfield
1998b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier  // alignment is enabled.
1999bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  if (!D->getIdentifier() && !Context.getTargetInfo().useZeroLengthBitfieldAlignment())
200078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    FieldAlign = UnpackedFieldAlign = 1;
2001bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2002b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier  if (!IsMsStruct)
2003b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier    ZeroLengthBitfield = 0;
2004b8fca90263760e579d2e463f02c846faa54d03a0Chad Rosier
2005394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  if (ExternalLayout)
2006394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    FieldOffset = updateExternalFieldOffset(D, FieldOffset);
2007394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor
200842dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  // Place this field at the current location.
200942dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  FieldOffsets.push_back(FieldOffset);
2010bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2011453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  if (!ExternalLayout)
2012453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    CheckFieldPadding(FieldOffset, UnpaddedFieldOffset, UnpackedFieldOffset,
2013453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                      UnpackedFieldAlign, FieldPacked, D);
201478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
2015e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson  // Update DataSize to include the last byte containing (part of) the bitfield.
2016e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson  if (IsUnion) {
2017e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson    // FIXME: I think FieldSize should be TypeSize here.
2018a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    setDataSize(std::max(getDataSizeInBits(), FieldSize));
2019e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson  } else {
2020e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson    uint64_t NewSizeInBits = FieldOffset + FieldSize;
2021bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2022d5e3ed085032def4ac875d64cb029fc3926652edKen Dyck    setDataSize(llvm::RoundUpToAlignment(NewSizeInBits,
2023bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                                         Context.getTargetInfo().getCharAlign()));
2024a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    UnfilledBitsInLastByte = getDataSizeInBits() - NewSizeInBits;
2025e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson  }
2026bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2027e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson  // Update the size.
2028a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  setSize(std::max(getSizeInBits(), getDataSizeInBits()));
2029bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
203042dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  // Remember max struct/class alignment.
20313263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck  UpdateAlignment(Context.toCharUnitsFromBits(FieldAlign),
20323263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck                  Context.toCharUnitsFromBits(UnpackedFieldAlign));
203342dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson}
20341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2035453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorvoid RecordLayoutBuilder::LayoutField(const FieldDecl *D) {
203642dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  if (D->isBitField()) {
203742dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    LayoutBitField(D);
203842dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    return;
203942dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  }
20401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2041a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck  uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastByte;
204278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
2043e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson  // Reset the unfilled bits.
2044e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson  UnfilledBitsInLastByte = 0;
2045e4fc0d97420e13d13c9664a3c27c17aa7c1e47b9Anders Carlsson
204642dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  bool FieldPacked = Packed || D->hasAttr<PackedAttr>();
20479ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  CharUnits FieldOffset =
2048a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    IsUnion ? CharUnits::Zero() : getDataSize();
20499ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  CharUnits FieldSize;
20509ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  CharUnits FieldAlign;
2051bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
205242dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  if (D->getType()->isIncompleteArrayType()) {
205342dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    // This is a flexible array member; we can't directly
205442dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    // query getTypeInfo about these, so we figure it out here.
205542dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    // Flexible array members don't have any size, but they
205642dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    // have to be aligned appropriately for their element type.
20579ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    FieldSize = CharUnits::Zero();
20580f0e9b0ace2a970d31ac31811f07e0b1d93501d6Anders Carlsson    const ArrayType* ATy = Context.getAsArrayType(D->getType());
20599ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    FieldAlign = Context.getTypeAlignInChars(ATy->getElementType());
206042dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  } else if (const ReferenceType *RT = D->getType()->getAs<ReferenceType>()) {
206142dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    unsigned AS = RT->getPointeeType().getAddressSpace();
20629ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    FieldSize =
2063bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(AS));
20649ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    FieldAlign =
2065bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerAlign(AS));
206642dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  } else {
20679ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    std::pair<CharUnits, CharUnits> FieldInfo =
20689ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck      Context.getTypeInfoInChars(D->getType());
206942dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson    FieldSize = FieldInfo.first;
2070bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson    FieldAlign = FieldInfo.second;
207161a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier
2072855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian    if (ZeroLengthBitfield) {
207361a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier      CharUnits ZeroLengthBitfieldBoundary =
207461a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        Context.toCharUnitsFromBits(
2075bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor          Context.getTargetInfo().getZeroLengthBitfieldBoundary());
207661a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier      if (ZeroLengthBitfieldBoundary == CharUnits::Zero()) {
207761a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        // If a zero-length bitfield is inserted after a bitfield,
207861a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        // and the alignment of the zero-length bitfield is
207961a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        // greater than the member that follows it, `bar', `bar'
208061a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        // will be aligned as the type of the zero-length bitfield.
208161a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        std::pair<CharUnits, CharUnits> FieldInfo =
208261a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier          Context.getTypeInfoInChars(ZeroLengthBitfield->getType());
208361a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        CharUnits ZeroLengthBitfieldAlignment = FieldInfo.second;
208461a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        if (ZeroLengthBitfieldAlignment > FieldAlign)
208561a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier          FieldAlign = ZeroLengthBitfieldAlignment;
20860e7bf40027f75c0c62fb002af7eab0882de6d332Chad Rosier      } else if (ZeroLengthBitfieldBoundary > FieldAlign) {
208761a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        // Align 'bar' based on a fixed alignment specified by the target.
2088bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor        assert(Context.getTargetInfo().useZeroLengthBitfieldAlignment() &&
20896e43f3f0e2fa7a4b50d2497de94a40437cd26003Chad Rosier               "ZeroLengthBitfieldBoundary should only be used in conjunction"
20906e43f3f0e2fa7a4b50d2497de94a40437cd26003Chad Rosier               " with useZeroLengthBitfieldAlignment.");
209161a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier        FieldAlign = ZeroLengthBitfieldBoundary;
209261a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier      }
2093855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian      ZeroLengthBitfield = 0;
2094855a8e79f42e670b405b31efd3963f4d89732affFariborz Jahanian    }
20956f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor
20965f608aedb6c5d32d2f7c51f9354a75b21f1eeaeeEli Friedman    if (IsMsStruct) {
20976f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor      // If MS bitfield layout is required, figure out what type is being
20986f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor      // laid out and align the field to the width of that type.
20996f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor
21006f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor      // Resolve all typedefs down to their base type and round up the field
21016f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor      // alignment if necessary.
21026f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor      QualType T = Context.getBaseElementType(D->getType());
21036f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor      if (const BuiltinType *BTy = T->getAs<BuiltinType>()) {
21049ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck        CharUnits TypeSize = Context.getTypeSizeInChars(BTy);
21056f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor        if (TypeSize > FieldAlign)
21066f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor          FieldAlign = TypeSize;
21076f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor      }
21086f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor    }
210942dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  }
21101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
211178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // The align if the field is not packed. This is to check if the attribute
211278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // was unnecessary (-Wpacked).
21139ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  CharUnits UnpackedFieldAlign = FieldAlign;
21149ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  CharUnits UnpackedFieldOffset = FieldOffset;
211578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
211642dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  if (FieldPacked)
21179ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    FieldAlign = CharUnits::One();
21189ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  CharUnits MaxAlignmentInChars =
21199ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    Context.toCharUnitsFromBits(D->getMaxAlignment());
21209ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  FieldAlign = std::max(FieldAlign, MaxAlignmentInChars);
21219ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  UnpackedFieldAlign = std::max(UnpackedFieldAlign, MaxAlignmentInChars);
21221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
212342dbcc4d8f0c483693befc76f37ca6dc4e0844e1Anders Carlsson  // The maximum field alignment overrides the aligned attribute.
2124834945c19cfb87fc21dfb6980a0980618655d79dKen Dyck  if (!MaxFieldAlignment.isZero()) {
21259ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    FieldAlign = std::min(FieldAlign, MaxFieldAlignment);
21269ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck    UnpackedFieldAlign = std::min(UnpackedFieldAlign, MaxFieldAlignment);
212778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  }
21281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2129394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  // Round up the current record size to the field's alignment boundary.
2130394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  FieldOffset = FieldOffset.RoundUpToAlignment(FieldAlign);
2131394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  UnpackedFieldOffset =
2132394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    UnpackedFieldOffset.RoundUpToAlignment(UnpackedFieldAlign);
2133394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor
2134394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  if (ExternalLayout) {
2135394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    FieldOffset = Context.toCharUnitsFromBits(
2136394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor                    updateExternalFieldOffset(D, Context.toBits(FieldOffset)));
2137394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor
2138394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    if (!IsUnion && EmptySubobjects) {
2139394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor      // Record the fact that we're placing a field at this offset.
2140394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor      bool Allowed = EmptySubobjects->CanPlaceFieldAtOffset(D, FieldOffset);
2141394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor      (void)Allowed;
2142394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor      assert(Allowed && "Externally-placed field cannot be placed here");
2143394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    }
2144394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  } else {
2145453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    if (!IsUnion && EmptySubobjects) {
2146453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      // Check if we can place the field at this offset.
2147453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      while (!EmptySubobjects->CanPlaceFieldAtOffset(D, FieldOffset)) {
2148453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor        // We couldn't place the field at the offset. Try again at a new offset.
2149453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor        FieldOffset += FieldAlign;
2150453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      }
21516026504302763f74102592602b392cecd5ced3aeAnders Carlsson    }
2152bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson  }
2153453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor
2154bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson  // Place this field at the current location.
21559ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  FieldOffsets.push_back(Context.toBits(FieldOffset));
21561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2157453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  if (!ExternalLayout)
2158453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    CheckFieldPadding(Context.toBits(FieldOffset), UnpaddedFieldOffset,
2159453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                      Context.toBits(UnpackedFieldOffset),
2160453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                      Context.toBits(UnpackedFieldAlign), FieldPacked, D);
216178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
2162bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson  // Reserve space for this field.
2163cd7a21b85ec94f9bddded4ed990dd2e2019011abEli Friedman  uint64_t FieldSizeInBits = Context.toBits(FieldSize);
2164bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson  if (IsUnion)
216583be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman    setDataSize(std::max(getDataSizeInBits(), FieldSizeInBits));
2166bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson  else
216783be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman    setDataSize(FieldOffset + FieldSize);
21681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
216983be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  // Update the size.
217083be12c8638a5136b937e602b3a9e25f4bc8e50dEli Friedman  setSize(std::max(getSizeInBits(), getDataSizeInBits()));
21711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2172bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson  // Remember max struct/class alignment.
21739ed9a250180f19b2c44df83a196fc3a2ac82f817Ken Dyck  UpdateAlignment(FieldAlign, UnpackedFieldAlign);
2174bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson}
2175bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson
217678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidisvoid RecordLayoutBuilder::FinishLayout(const NamedDecl *D) {
2177bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson  // In C++, records cannot be of size 0.
21784e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (Context.getLangOpts().CPlusPlus && getSizeInBits() == 0) {
2179adf082e829eb71871b6043009888df3b79055dbaFariborz Jahanian    if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
2180adf082e829eb71871b6043009888df3b79055dbaFariborz Jahanian      // Compatibility with gcc requires a class (pod or non-pod)
2181adf082e829eb71871b6043009888df3b79055dbaFariborz Jahanian      // which is not empty but of size 0; such as having fields of
2182adf082e829eb71871b6043009888df3b79055dbaFariborz Jahanian      // array of zero-length, remains of Size 0
2183adf082e829eb71871b6043009888df3b79055dbaFariborz Jahanian      if (RD->isEmpty())
2184f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck        setSize(CharUnits::One());
2185adf082e829eb71871b6043009888df3b79055dbaFariborz Jahanian    }
2186adf082e829eb71871b6043009888df3b79055dbaFariborz Jahanian    else
2187f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck      setSize(CharUnits::One());
2188adf082e829eb71871b6043009888df3b79055dbaFariborz Jahanian  }
2189901dd668931a70932ad09092959c42693409a3cdEli Friedman
2190f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  // Finally, round the size of the record up to the alignment of the
2191f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  // record itself.
2192f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  uint64_t UnpaddedSize = getSizeInBits() - UnfilledBitsInLastByte;
2193f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  uint64_t UnpackedSizeInBits =
2194f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  llvm::RoundUpToAlignment(getSizeInBits(),
2195f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor                           Context.toBits(UnpackedAlignment));
2196f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  CharUnits UnpackedSize = Context.toCharUnitsFromBits(UnpackedSizeInBits);
2197f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  uint64_t RoundedSize
2198f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    = llvm::RoundUpToAlignment(getSizeInBits(), Context.toBits(Alignment));
2199f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor
2200f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  if (ExternalLayout) {
2201f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    // If we're inferring alignment, and the external size is smaller than
2202f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    // our size after we've rounded up to alignment, conservatively set the
2203f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    // alignment to 1.
2204f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    if (InferAlignment && ExternalSize < RoundedSize) {
2205f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor      Alignment = CharUnits::One();
2206f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor      InferAlignment = false;
2207f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    }
2208f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    setSize(ExternalSize);
2209f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    return;
2210f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  }
2211f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor
2212f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor
2213901dd668931a70932ad09092959c42693409a3cdEli Friedman  // MSVC doesn't round up to the alignment of the record with virtual bases.
2214901dd668931a70932ad09092959c42693409a3cdEli Friedman  if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
2215901dd668931a70932ad09092959c42693409a3cdEli Friedman    if (isMicrosoftCXXABI() && RD->getNumVBases())
2216901dd668931a70932ad09092959c42693409a3cdEli Friedman      return;
2217901dd668931a70932ad09092959c42693409a3cdEli Friedman  }
2218901dd668931a70932ad09092959c42693409a3cdEli Friedman
2219f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  // Set the size to the final size.
2220f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor  setSize(RoundedSize);
222178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
2222bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  unsigned CharBitNum = Context.getTargetInfo().getCharWidth();
222378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
222478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    // Warn if padding was introduced to the struct/class/union.
2225a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    if (getSizeInBits() > UnpaddedSize) {
2226a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck      unsigned PadSize = getSizeInBits() - UnpaddedSize;
222778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis      bool InBits = true;
222878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis      if (PadSize % CharBitNum == 0) {
222978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis        PadSize = PadSize / CharBitNum;
223078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis        InBits = false;
223178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis      }
223278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis      Diag(RD->getLocation(), diag::warn_padded_struct_size)
223378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis          << Context.getTypeDeclType(RD)
223478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis          << PadSize
223578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis          << (InBits ? 1 : 0) /*(byte|bit)*/ << (PadSize > 1); // plural or not
223678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    }
223778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
223878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    // Warn if we packed it unnecessarily. If the alignment is 1 byte don't
223978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    // bother since there won't be alignment issues.
2240a0c21c4ec00ea083bf036edb08bb016085b53409Ken Dyck    if (Packed && UnpackedAlignment > CharUnits::One() &&
2241f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck        getSize() == UnpackedSize)
224278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis      Diag(D->getLocation(), diag::warn_unnecessary_packed)
224378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis          << Context.getTypeDeclType(RD);
224478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  }
2245bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson}
2246bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson
22473263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyckvoid RecordLayoutBuilder::UpdateAlignment(CharUnits NewAlignment,
22483263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck                                          CharUnits UnpackedNewAlignment) {
2249453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  // The alignment is not modified when using 'mac68k' alignment or when
2250394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  // we have an externally-supplied layout that also provides overall alignment.
2251394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  if (IsMac68kAlign || (ExternalLayout && !InferAlignment))
2252c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar    return;
2253c6082fe347a414a2e19f2ad8fe41720f10733296Daniel Dunbar
22543263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck  if (NewAlignment > Alignment) {
22553263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck    assert(llvm::isPowerOf2_32(NewAlignment.getQuantity() &&
22563263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck           "Alignment not a power of 2"));
22573263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck    Alignment = NewAlignment;
225878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  }
225978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
22603263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck  if (UnpackedNewAlignment > UnpackedAlignment) {
22613263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck    assert(llvm::isPowerOf2_32(UnpackedNewAlignment.getQuantity() &&
226278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis           "Alignment not a power of 2"));
22633263e09c8e0925edaa541d0d4bb995b4bfb454e7Ken Dyck    UnpackedAlignment = UnpackedNewAlignment;
226478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  }
226578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis}
226678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
2267394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregoruint64_t
2268394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas GregorRecordLayoutBuilder::updateExternalFieldOffset(const FieldDecl *Field,
2269394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor                                               uint64_t ComputedOffset) {
2270394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  assert(ExternalFieldOffsets.find(Field) != ExternalFieldOffsets.end() &&
2271394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor         "Field does not have an external offset");
2272394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor
2273394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  uint64_t ExternalFieldOffset = ExternalFieldOffsets[Field];
2274394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor
2275394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  if (InferAlignment && ExternalFieldOffset < ComputedOffset) {
2276394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    // The externally-supplied field offset is before the field offset we
2277394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    // computed. Assume that the structure is packed.
2278f596760aab256d81a6823e731c988b35ef8197adDouglas Gregor    Alignment = CharUnits::One();
2279394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor    InferAlignment = false;
2280394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  }
2281394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor
2282394f7b650a03d5d4d8f740d6765f257b1c4e2ec0Douglas Gregor  // Use the externally-supplied field offset.
22837aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer  return ExternalFieldOffset;
22847aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer}
22857aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer
22867aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer/// \brief Get diagnostic %select index for tag kind for
22877aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer/// field padding diagnostic message.
22887aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer/// WARNING: Indexes apply to particular diagnostics only!
22897aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer///
22907aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer/// \returns diagnostic %select index.
22917aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramerstatic unsigned getPaddingDiagFromTagKind(TagTypeKind Tag) {
22927aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer  switch (Tag) {
22937aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer  case TTK_Struct: return 0;
22947aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer  case TTK_Interface: return 1;
22957aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer  case TTK_Class: return 2;
22967aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer  default: llvm_unreachable("Invalid tag kind for field padding diagnostic!");
22977aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer  }
22987aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer}
22997aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer
23007aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramervoid RecordLayoutBuilder::CheckFieldPadding(uint64_t Offset,
23017aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer                                            uint64_t UnpaddedOffset,
23027aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer                                            uint64_t UnpackedOffset,
230378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                                            unsigned UnpackedAlign,
230478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                                            bool isPacked,
230578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis                                            const FieldDecl *D) {
230678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // We let objc ivars without warning, objc interfaces generally are not used
230778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // for padding tricks.
230878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  if (isa<ObjCIvarDecl>(D))
2309bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson    return;
23101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2311ae5860e1787230dd8b8948a08632c9be777d8522Ted Kremenek  // Don't warn about structs created without a SourceLocation.  This can
2312ae5860e1787230dd8b8948a08632c9be777d8522Ted Kremenek  // be done by clients of the AST, such as codegen.
2313ae5860e1787230dd8b8948a08632c9be777d8522Ted Kremenek  if (D->getLocation().isInvalid())
2314ae5860e1787230dd8b8948a08632c9be777d8522Ted Kremenek    return;
2315ae5860e1787230dd8b8948a08632c9be777d8522Ted Kremenek
2316bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  unsigned CharBitNum = Context.getTargetInfo().getCharWidth();
23171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
231878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // Warn if padding was introduced to the struct/class.
231978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  if (!IsUnion && Offset > UnpaddedOffset) {
232078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    unsigned PadSize = Offset - UnpaddedOffset;
232178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    bool InBits = true;
232278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    if (PadSize % CharBitNum == 0) {
232378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis      PadSize = PadSize / CharBitNum;
232478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis      InBits = false;
23257aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer    }
23267aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer    if (D->getIdentifier())
23277aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer      Diag(D->getLocation(), diag::warn_padded_struct_field)
23287aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << getPaddingDiagFromTagKind(D->getParent()->getTagKind())
23297aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << Context.getTypeDeclType(D->getParent())
23307aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << PadSize
23317aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << (InBits ? 1 : 0) /*(byte|bit)*/ << (PadSize > 1) // plural or not
23327aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << D->getIdentifier();
23337aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer    else
23347aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer      Diag(D->getLocation(), diag::warn_padded_struct_anon_field)
23357aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << getPaddingDiagFromTagKind(D->getParent()->getTagKind())
23367aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << Context.getTypeDeclType(D->getParent())
23377aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << PadSize
23387aaa167abba495ecb0e99eb4f2fa155cf28c798dBenjamin Kramer          << (InBits ? 1 : 0) /*(byte|bit)*/ << (PadSize > 1); // plural or not
233978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  }
234078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
234178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // Warn if we packed it unnecessarily. If the alignment is 1 byte don't
234278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  // bother since there won't be alignment issues.
234378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  if (isPacked && UnpackedAlign > CharBitNum && Offset == UnpackedOffset)
234478a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis    Diag(D->getLocation(), diag::warn_unnecessary_packed)
234578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis        << D->getIdentifier();
2346bda4c1015e27ac82d31afb4519dd53586e61a51aAnders Carlsson}
23471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2348d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCallstatic const CXXMethodDecl *computeKeyFunction(ASTContext &Context,
2349d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall                                               const CXXRecordDecl *RD) {
23508d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  // If a class isn't polymorphic it doesn't have a key function.
2351f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson  if (!RD->isPolymorphic())
2352f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    return 0;
235361eab8872168af6eb1e0047a82901096cf145e27Eli Friedman
2354cb5d2d0647fdab2e36c85b417e03bf18916ce10cEli Friedman  // A class that is not externally visible doesn't have a key function. (Or
235561eab8872168af6eb1e0047a82901096cf145e27Eli Friedman  // at least, there's no point to assigning a key function to such a class;
235661eab8872168af6eb1e0047a82901096cf145e27Eli Friedman  // this doesn't affect the ABI.)
2357cb5d2d0647fdab2e36c85b417e03bf18916ce10cEli Friedman  if (RD->getLinkage() != ExternalLinkage)
235861eab8872168af6eb1e0047a82901096cf145e27Eli Friedman    return 0;
235961eab8872168af6eb1e0047a82901096cf145e27Eli Friedman
23603bd5b6c3c2ad1d5a6f88cf21f627e8d4f03c4df4Argyrios Kyrtzidis  // Template instantiations don't have key functions,see Itanium C++ ABI 5.2.6.
23613bd5b6c3c2ad1d5a6f88cf21f627e8d4f03c4df4Argyrios Kyrtzidis  // Same behavior as GCC.
23623bd5b6c3c2ad1d5a6f88cf21f627e8d4f03c4df4Argyrios Kyrtzidis  TemplateSpecializationKind TSK = RD->getTemplateSpecializationKind();
23633bd5b6c3c2ad1d5a6f88cf21f627e8d4f03c4df4Argyrios Kyrtzidis  if (TSK == TSK_ImplicitInstantiation ||
23643bd5b6c3c2ad1d5a6f88cf21f627e8d4f03c4df4Argyrios Kyrtzidis      TSK == TSK_ExplicitInstantiationDefinition)
23653bd5b6c3c2ad1d5a6f88cf21f627e8d4f03c4df4Argyrios Kyrtzidis    return 0;
23663bd5b6c3c2ad1d5a6f88cf21f627e8d4f03c4df4Argyrios Kyrtzidis
2367d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  bool allowInlineFunctions =
2368d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline();
2369d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall
2370bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  for (CXXRecordDecl::method_iterator I = RD->method_begin(),
2371bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar         E = RD->method_end(); I != E; ++I) {
2372581deb3da481053c4993c7600f97acf7768caac5David Blaikie    const CXXMethodDecl *MD = *I;
2373bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2374f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    if (!MD->isVirtual())
2375f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson      continue;
2376bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2377f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    if (MD->isPure())
2378f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson      continue;
237961eab8872168af6eb1e0047a82901096cf145e27Eli Friedman
2380f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    // Ignore implicit member functions, they are always marked as inline, but
2381f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    // they don't have a body until they're defined.
2382f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    if (MD->isImplicit())
2383f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson      continue;
2384bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2385bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor    if (MD->isInlineSpecified())
2386bd6d6197fcfc98356ea60e816365eb0648b69556Douglas Gregor      continue;
2387f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson
2388f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    if (MD->hasInlineBody())
2389f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson      continue;
2390bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2391c23aca44753ff65303fb19d4d6d2114018629f07Benjamin Kramer    // Ignore inline deleted or defaulted functions.
2392f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer    if (!MD->isUserProvided())
2393f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer      continue;
2394f3fce80bb2eafaa556779c84f38104003bddb0eaBenjamin Kramer
2395d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    // In certain ABIs, ignore functions with out-of-line inline definitions.
2396d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    if (!allowInlineFunctions) {
2397d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall      const FunctionDecl *Def;
2398d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall      if (MD->hasBody(Def) && Def->isInlineSpecified())
2399d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall        continue;
2400d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    }
2401d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall
2402f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    // We found it.
2403f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    return MD;
2404f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson  }
2405bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2406f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson  return 0;
2407f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson}
2408f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson
240978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios KyrtzidisDiagnosticBuilder
241078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios KyrtzidisRecordLayoutBuilder::Diag(SourceLocation Loc, unsigned DiagID) {
241133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  return Context.getDiagnostics().Report(Loc, DiagID);
241278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis}
241378a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
2414a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall/// Does the target C++ ABI require us to skip over the tail-padding
2415a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall/// of the given class (considering it as a base class) when allocating
2416a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall/// objects?
2417a438b2d277fae00a4fa467ffcf382246e0a201e9John McCallstatic bool mustSkipTailPadding(TargetCXXABI ABI, const CXXRecordDecl *RD) {
2418a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall  switch (ABI.getTailPaddingUseRules()) {
2419a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall  case TargetCXXABI::AlwaysUseTailPadding:
2420a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    return false;
2421a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall
2422a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall  case TargetCXXABI::UseTailPaddingUnlessPOD03:
2423a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // FIXME: To the extent that this is meant to cover the Itanium ABI
2424a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // rules, we should implement the restrictions about over-sized
2425a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // bitfields:
2426a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //
2427a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // http://mentorembedded.github.com/cxx-abi/abi.html#POD :
2428a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   In general, a type is considered a POD for the purposes of
2429a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   layout if it is a POD type (in the sense of ISO C++
2430a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   [basic.types]). However, a POD-struct or POD-union (in the
2431a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   sense of ISO C++ [class]) with a bitfield member whose
2432a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   declared width is wider than the declared type of the
2433a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   bitfield is not a POD for the purpose of layout.  Similarly,
2434a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   an array type is not a POD for the purpose of layout if the
2435a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   element type of the array is not a POD for the purpose of
2436a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   layout.
2437a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //
2438a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   Where references to the ISO C++ are made in this paragraph,
2439a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   the Technical Corrigendum 1 version of the standard is
2440a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    //   intended.
2441a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    return RD->isPOD();
2442a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall
2443a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall  case TargetCXXABI::UseTailPaddingUnlessPOD11:
2444a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // This is equivalent to RD->getTypeForDecl().isCXX11PODType(),
2445a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // but with a lot of abstraction penalty stripped off.  This does
2446a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // assume that these properties are set correctly even in C++98
2447a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // mode; fortunately, that is true because we want to assign
2448a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // consistently semantics to the type-traits intrinsics (or at
2449a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // least as many of them as possible).
2450a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    return RD->isTrivial() && RD->isStandardLayout();
2451a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall  }
2452a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall
2453a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall  llvm_unreachable("bad tail-padding use kind");
2454a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall}
2455a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall
24561e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson/// getASTRecordLayout - Get or compute information about the layout of the
24571e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson/// specified record (struct/union/class), which indicates its size and field
24581e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson/// position information.
24594ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadconst ASTRecordLayout &
24604ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTRecordLayout(const RecordDecl *D) const {
24616595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  // These asserts test different things.  A record has a definition
24626595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  // as soon as we begin to parse the definition.  That definition is
24636595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  // not a complete definition (which is what isDefinition() tests)
24646595935602f57b4f2115785bb39dabc83e4232dcJohn McCall  // until we *finish* parsing the definition.
2465fd5a5f547c5012197475ba628947d9755c96cfdcSean Callanan
2466fd5a5f547c5012197475ba628947d9755c96cfdcSean Callanan  if (D->hasExternalLexicalStorage() && !D->getDefinition())
2467fd5a5f547c5012197475ba628947d9755c96cfdcSean Callanan    getExternalSource()->CompleteType(const_cast<RecordDecl*>(D));
2468fd5a5f547c5012197475ba628947d9755c96cfdcSean Callanan
24691e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  D = D->getDefinition();
24701e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  assert(D && "Cannot get layout of forward declarations!");
24715e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall  assert(D->isCompleteDefinition() && "Cannot layout type before complete!");
24721e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
24731e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  // Look up this layout, if already laid out, return what we have.
24741e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  // Note that we can't save a reference to the entry because this function
24751e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  // is recursive.
24761e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  const ASTRecordLayout *Entry = ASTRecordLayouts[D];
24771e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  if (Entry) return *Entry;
24781e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
24792f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson  const ASTRecordLayout *NewEntry;
24802f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson
24812f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson  if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
2482261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson    EmptySubobjectMap EmptySubobjects(*this, RD);
24839da235244c2de2bcca654b518c66133c30ebde53John McCall    RecordLayoutBuilder Builder(*this, &EmptySubobjects);
24849da235244c2de2bcca654b518c66133c30ebde53John McCall    Builder.Layout(RD);
24859da235244c2de2bcca654b518c66133c30ebde53John McCall
24869da235244c2de2bcca654b518c66133c30ebde53John McCall    // MSVC gives the vb-table pointer an alignment equal to that of
24879da235244c2de2bcca654b518c66133c30ebde53John McCall    // the non-virtual part of the structure.  That's an inherently
24889da235244c2de2bcca654b518c66133c30ebde53John McCall    // multi-pass operation.  If our first pass doesn't give us
24899da235244c2de2bcca654b518c66133c30ebde53John McCall    // adequate alignment, try again with the specified minimum
24909da235244c2de2bcca654b518c66133c30ebde53John McCall    // alignment.  This is *much* more maintainable than computing the
24919da235244c2de2bcca654b518c66133c30ebde53John McCall    // alignment in advance in a separately-coded pass; it's also
24929da235244c2de2bcca654b518c66133c30ebde53John McCall    // significantly more efficient in the common case where the
24939da235244c2de2bcca654b518c66133c30ebde53John McCall    // vb-table doesn't need extra padding.
24949da235244c2de2bcca654b518c66133c30ebde53John McCall    if (Builder.VBPtrOffset != CharUnits::fromQuantity(-1) &&
24959da235244c2de2bcca654b518c66133c30ebde53John McCall        (Builder.VBPtrOffset % Builder.NonVirtualAlignment) != 0) {
24969da235244c2de2bcca654b518c66133c30ebde53John McCall      Builder.resetWithTargetAlignment(Builder.NonVirtualAlignment);
24979da235244c2de2bcca654b518c66133c30ebde53John McCall      Builder.Layout(RD);
24982fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman    }
24992fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
2500a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // In certain situations, we are allowed to lay out objects in the
2501a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // tail-padding of base classes.  This is ABI-dependent.
2502a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    // FIXME: this should be stored in the record layout.
2503a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall    bool skipTailPadding =
2504a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall      mustSkipTailPadding(getTargetInfo().getCXXABI(), cast<CXXRecordDecl>(D));
25052f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson
25062f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson    // FIXME: This should be done in FinalizeLayout.
2507f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck    CharUnits DataSize =
2508a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall      skipTailPadding ? Builder.getSize() : Builder.getDataSize();
2509f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck    CharUnits NonVirtualSize =
2510a438b2d277fae00a4fa467ffcf382246e0a201e9John McCall      skipTailPadding ? DataSize : Builder.NonVirtualSize;
25112f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson
25120aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar    NewEntry =
25139da235244c2de2bcca654b518c66133c30ebde53John McCall      new (*this) ASTRecordLayout(*this, Builder.getSize(),
25149da235244c2de2bcca654b518c66133c30ebde53John McCall                                  Builder.Alignment,
2515441c6239c6df8c759bacf6510efbfd434b647066John McCall                                  Builder.HasOwnVFPtr,
25169da235244c2de2bcca654b518c66133c30ebde53John McCall                                  Builder.VBPtrOffset,
2517f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck                                  DataSize,
25189da235244c2de2bcca654b518c66133c30ebde53John McCall                                  Builder.FieldOffsets.data(),
25199da235244c2de2bcca654b518c66133c30ebde53John McCall                                  Builder.FieldOffsets.size(),
2520a1fdb0bc09aa0d17841cdbdd8c52cd1368251cbfKen Dyck                                  NonVirtualSize,
25219da235244c2de2bcca654b518c66133c30ebde53John McCall                                  Builder.NonVirtualAlignment,
2522261febd091cd05325ae202b7d388a2d266bbf126Anders Carlsson                                  EmptySubobjects.SizeOfLargestEmptySubobject,
25239da235244c2de2bcca654b518c66133c30ebde53John McCall                                  Builder.PrimaryBase,
25249da235244c2de2bcca654b518c66133c30ebde53John McCall                                  Builder.PrimaryBaseIsVirtual,
25259da235244c2de2bcca654b518c66133c30ebde53John McCall                                  Builder.Bases, Builder.VBases);
25262f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson  } else {
25279da235244c2de2bcca654b518c66133c30ebde53John McCall    RecordLayoutBuilder Builder(*this, /*EmptySubobjects=*/0);
25282f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson    Builder.Layout(D);
25290aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
25302f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson    NewEntry =
2531f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck      new (*this) ASTRecordLayout(*this, Builder.getSize(),
2532ea7f6c2c53127b875ed432fd1793d48270d8ba6bKen Dyck                                  Builder.Alignment,
2533f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck                                  Builder.getSize(),
25342f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson                                  Builder.FieldOffsets.data(),
25352f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson                                  Builder.FieldOffsets.size());
25362f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson  }
25372f64e377d1aa733b81a4c5e78e32a62c41426626Anders Carlsson
25381e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  ASTRecordLayouts[D] = NewEntry;
25391e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
25404e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().DumpRecordLayouts) {
25411e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson    llvm::errs() << "\n*** Dumping AST Record Layout\n";
25424e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    DumpRecordLayout(D, llvm::errs(), getLangOpts().DumpRecordLayoutsSimple);
25431e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  }
25441e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
25451e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  return *NewEntry;
25461e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson}
25471e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
2548d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCallconst CXXMethodDecl *ASTContext::getCurrentKeyFunction(const CXXRecordDecl *RD) {
2549d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  assert(RD->getDefinition() && "Cannot get key function for forward decl!");
25501e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  RD = cast<CXXRecordDecl>(RD->getDefinition());
25510aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
2552d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  const CXXMethodDecl *&entry = KeyFunctions[RD];
2553d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  if (!entry) {
2554d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    entry = computeKeyFunction(*this, RD);
2555d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  }
2556d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall
2557d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  return entry;
2558d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall}
2559d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall
2560d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCallvoid ASTContext::setNonKeyFunction(const CXXMethodDecl *method) {
2561d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  assert(method == method->getFirstDeclaration() &&
2562d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall         "not working with method declaration from class definition");
25630aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
2564d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  // Look up the cache entry.  Since we're working with the first
2565d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  // declaration, its parent must be the class definition, which is
2566d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  // the correct key for the KeyFunctions hash.
2567d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  llvm::DenseMap<const CXXRecordDecl*, const CXXMethodDecl*>::iterator
2568d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    i = KeyFunctions.find(method->getParent());
2569d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall
2570d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  // If it's not cached, there's nothing to do.
2571d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  if (i == KeyFunctions.end()) return;
2572d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall
2573d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  // If it is cached, check whether it's the target method, and if so,
2574d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  // remove it from the cache.
2575d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  if (i->second == method) {
2576d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    // FIXME: remember that we did this for module / chained PCH state?
2577d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    KeyFunctions.erase(i);
2578d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall  }
25791e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson}
25801e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
25812d6a5670465cb3f1d811695a9f23e372508240d2Richard Smithstatic uint64_t getFieldOffset(const ASTContext &C, const FieldDecl *FD) {
25822d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  const ASTRecordLayout &Layout = C.getASTRecordLayout(FD->getParent());
25832d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  return Layout.getFieldOffset(FD->getFieldIndex());
25842d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith}
25852d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith
25862d6a5670465cb3f1d811695a9f23e372508240d2Richard Smithuint64_t ASTContext::getFieldOffset(const ValueDecl *VD) const {
25872d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  uint64_t OffsetInBits;
25882d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  if (const FieldDecl *FD = dyn_cast<FieldDecl>(VD)) {
25892d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith    OffsetInBits = ::getFieldOffset(*this, FD);
25902d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  } else {
25912d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith    const IndirectFieldDecl *IFD = cast<IndirectFieldDecl>(VD);
25922d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith
25932d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith    OffsetInBits = 0;
25942d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith    for (IndirectFieldDecl::chain_iterator CI = IFD->chain_begin(),
25952d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith                                           CE = IFD->chain_end();
25962d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith         CI != CE; ++CI)
25972d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith      OffsetInBits += ::getFieldOffset(*this, cast<FieldDecl>(*CI));
25982d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  }
25992d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith
26002d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  return OffsetInBits;
26012d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith}
26022d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith
260368395a7a9c5ec4400c4d76f16ee20d9b4c9326d8Eric Christopher/// getObjCLayout - Get or compute information about the layout of the
260468395a7a9c5ec4400c4d76f16ee20d9b4c9326d8Eric Christopher/// given interface.
26051e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson///
26061e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson/// \param Impl - If given, also include the layout of the interface's
26071e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson/// implementation. This may differ by including synthesized ivars.
26081e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlssonconst ASTRecordLayout &
26091e641ce1c169b4b0cac3d7ad6da44b323453049cAnders CarlssonASTContext::getObjCLayout(const ObjCInterfaceDecl *D,
26104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                          const ObjCImplementationDecl *Impl) const {
2611e7aa27a826f0b353713df6bfa0715818db8cde74Douglas Gregor  // Retrieve the definition
2612cad313bd7b28674e0e409e610c450a2411107443Sean Callanan  if (D->hasExternalLexicalStorage() && !D->getDefinition())
2613cad313bd7b28674e0e409e610c450a2411107443Sean Callanan    getExternalSource()->CompleteType(const_cast<ObjCInterfaceDecl*>(D));
2614e7aa27a826f0b353713df6bfa0715818db8cde74Douglas Gregor  D = D->getDefinition();
2615e7aa27a826f0b353713df6bfa0715818db8cde74Douglas Gregor  assert(D && D->isThisDeclarationADefinition() && "Invalid interface decl!");
26161e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
26171e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  // Look up this layout, if already laid out, return what we have.
261831ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky  const ObjCContainerDecl *Key =
261931ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky    Impl ? (const ObjCContainerDecl*) Impl : (const ObjCContainerDecl*) D;
26201e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  if (const ASTRecordLayout *Entry = ObjCLayouts[Key])
26211e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson    return *Entry;
26221e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
26231e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  // Add in synthesized ivar count if laying out an implementation.
26241e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  if (Impl) {
26251e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson    unsigned SynthCount = CountNonClassIvars(D);
26261e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson    // If there aren't any sythesized ivars then reuse the interface
26271e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson    // entry. Note we can't cache this because we simply free all
26281e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson    // entries later; however we shouldn't look up implementations
26291e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson    // frequently.
26301e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson    if (SynthCount == 0)
26311e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson      return getObjCLayout(D, 0);
26321e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  }
26331e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
26349da235244c2de2bcca654b518c66133c30ebde53John McCall  RecordLayoutBuilder Builder(*this, /*EmptySubobjects=*/0);
263536cdc61b98460c06ee07710f77b911675fdce6a7Anders Carlsson  Builder.Layout(D);
263636cdc61b98460c06ee07710f77b911675fdce6a7Anders Carlsson
26371e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  const ASTRecordLayout *NewEntry =
2638f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck    new (*this) ASTRecordLayout(*this, Builder.getSize(),
2639ea7f6c2c53127b875ed432fd1793d48270d8ba6bKen Dyck                                Builder.Alignment,
2640f079b735d876f75e67b8dcc6980d0b742903ce0dKen Dyck                                Builder.getDataSize(),
264136cdc61b98460c06ee07710f77b911675fdce6a7Anders Carlsson                                Builder.FieldOffsets.data(),
264236cdc61b98460c06ee07710f77b911675fdce6a7Anders Carlsson                                Builder.FieldOffsets.size());
26430aa7edbc1f579787c4f69144fd1b04e777d89391Daniel Dunbar
26441e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  ObjCLayouts[Key] = NewEntry;
26451e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
26461e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson  return *NewEntry;
26471e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson}
26481e641ce1c169b4b0cac3d7ad6da44b323453049cAnders Carlsson
26495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void PrintOffset(raw_ostream &OS,
26503069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson                        CharUnits Offset, unsigned IndentLevel) {
2651e4ebbf79c7045343b9dbe49c721c6023be06f9eeBenjamin Kramer  OS << llvm::format("%4" PRId64 " | ", (int64_t)Offset.getQuantity());
2652bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  OS.indent(IndentLevel * 2);
2653bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar}
2654bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
26550ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Benderskystatic void PrintIndentNoOffset(raw_ostream &OS, unsigned IndentLevel) {
26560ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky  OS << "     | ";
26570ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky  OS.indent(IndentLevel * 2);
26580ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky}
26590ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky
26605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DumpCXXRecordLayout(raw_ostream &OS,
26614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                const CXXRecordDecl *RD, const ASTContext &C,
26623069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson                                CharUnits Offset,
2663bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                                unsigned IndentLevel,
2664bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                                const char* Description,
2665bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                                bool IncludeVirtualBases) {
26663069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson  const ASTRecordLayout &Layout = C.getASTRecordLayout(RD);
2667bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2668bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  PrintOffset(OS, Offset, IndentLevel);
2669cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman  OS << C.getTypeDeclType(const_cast<CXXRecordDecl *>(RD)).getAsString();
2670bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  if (Description)
2671bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    OS << ' ' << Description;
2672bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  if (RD->isEmpty())
2673bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    OS << " (empty)";
2674bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  OS << '\n';
2675bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2676bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  IndentLevel++;
2677bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
26783069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson  const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();
2679441c6239c6df8c759bacf6510efbfd434b647066John McCall  bool HasVfptr = Layout.hasOwnVFPtr();
26802fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  bool HasVbptr = Layout.getVBPtrOffset() != CharUnits::fromQuantity(-1);
2681bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2682bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  // Vtable pointer.
2683227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  if (RD->isDynamicClass() && !PrimaryBase &&
2684b8b2c9da87e7d70a1679db026f40548b3192b705John McCall      !C.getTargetInfo().getCXXABI().isMicrosoft()) {
2685bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    PrintOffset(OS, Offset, IndentLevel);
2686b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer    OS << '(' << *RD << " vtable pointer)\n";
2687bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  }
26882fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman
2689bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  // Dump (non-virtual) bases
2690bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
2691bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar         E = RD->bases_end(); I != E; ++I) {
2692bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    assert(!I->getType()->isDependentType() &&
2693bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar           "Cannot layout class with dependent bases.");
2694bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    if (I->isVirtual())
2695bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar      continue;
2696bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2697bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    const CXXRecordDecl *Base =
2698bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
2699bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
27003069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson    CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(Base);
2701bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2702bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    DumpCXXRecordLayout(OS, Base, C, BaseOffset, IndentLevel,
2703bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                        Base == PrimaryBase ? "(primary base)" : "(base)",
2704bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                        /*IncludeVirtualBases=*/false);
2705bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  }
2706227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman
2707227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  // vfptr and vbptr (for Microsoft C++ ABI)
2708227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  if (HasVfptr) {
2709441c6239c6df8c759bacf6510efbfd434b647066John McCall    PrintOffset(OS, Offset, IndentLevel);
2710227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman    OS << '(' << *RD << " vftable pointer)\n";
2711227e483cb1f77ea6dcd38c2ca9fb490894a5f887Eli Friedman  }
27122fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  if (HasVbptr) {
27132fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman    PrintOffset(OS, Offset + Layout.getVBPtrOffset(), IndentLevel);
2714b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer    OS << '(' << *RD << " vbtable pointer)\n";
27152fe363622c32c471e8a68c68ba5cc372644f24fbEli Friedman  }
2716bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2717bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  // Dump fields.
2718bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  uint64_t FieldNo = 0;
2719bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  for (CXXRecordDecl::field_iterator I = RD->field_begin(),
2720bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar         E = RD->field_end(); I != E; ++I, ++FieldNo) {
2721581deb3da481053c4993c7600f97acf7768caac5David Blaikie    const FieldDecl &Field = **I;
27223069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson    CharUnits FieldOffset = Offset +
2723fb1e3bc29b667f4275e1d5a43d64ec173f4f9a7dKen Dyck      C.toCharUnitsFromBits(Layout.getFieldOffset(FieldNo));
2724bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2725262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie    if (const RecordType *RT = Field.getType()->getAs<RecordType>()) {
2726bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar      if (const CXXRecordDecl *D = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
2727bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar        DumpCXXRecordLayout(OS, D, C, FieldOffset, IndentLevel,
2728262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie                            Field.getName().data(),
2729bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                            /*IncludeVirtualBases=*/true);
2730bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar        continue;
2731bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar      }
2732bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    }
2733bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2734bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    PrintOffset(OS, FieldOffset, IndentLevel);
2735262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie    OS << Field.getType().getAsString() << ' ' << Field << '\n';
2736bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  }
2737bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2738bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  if (!IncludeVirtualBases)
2739bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    return;
2740bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
2741bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  // Dump virtual bases.
2742441c6239c6df8c759bacf6510efbfd434b647066John McCall  const ASTRecordLayout::VBaseOffsetsMapTy &vtordisps =
2743441c6239c6df8c759bacf6510efbfd434b647066John McCall    Layout.getVBaseOffsetsMap();
2744bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
2745bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar         E = RD->vbases_end(); I != E; ++I) {
2746bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    assert(I->isVirtual() && "Found non-virtual class!");
2747bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    const CXXRecordDecl *VBase =
2748bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
2749bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
27503069a0d28637ad0ad583d9fdd7bc6bc6aa677fb5Anders Carlsson    CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBase);
2751441c6239c6df8c759bacf6510efbfd434b647066John McCall
2752441c6239c6df8c759bacf6510efbfd434b647066John McCall    if (vtordisps.find(VBase)->second.hasVtorDisp()) {
2753441c6239c6df8c759bacf6510efbfd434b647066John McCall      PrintOffset(OS, VBaseOffset - CharUnits::fromQuantity(4), IndentLevel);
2754441c6239c6df8c759bacf6510efbfd434b647066John McCall      OS << "(vtordisp for vbase " << *VBase << ")\n";
2755441c6239c6df8c759bacf6510efbfd434b647066John McCall    }
2756441c6239c6df8c759bacf6510efbfd434b647066John McCall
2757bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar    DumpCXXRecordLayout(OS, VBase, C, VBaseOffset, IndentLevel,
2758bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                        VBase == PrimaryBase ?
2759bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                        "(primary virtual base)" : "(virtual base)",
2760bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar                        /*IncludeVirtualBases=*/false);
2761bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  }
2762bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar
27630ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky  PrintIndentNoOffset(OS, IndentLevel - 1);
27640ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky  OS << "[sizeof=" << Layout.getSize().getQuantity();
2765ec2990351335f163601b98e39b52425e2e9f931eKen Dyck  OS << ", dsize=" << Layout.getDataSize().getQuantity();
2766dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck  OS << ", align=" << Layout.getAlignment().getQuantity() << '\n';
27670ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky
27680ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky  PrintIndentNoOffset(OS, IndentLevel - 1);
27690ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky  OS << " nvsize=" << Layout.getNonVirtualSize().getQuantity();
27700ee69cc6d4fc547671303afbd715cb990e5c3af6Eli Bendersky  OS << ", nvalign=" << Layout.getNonVirtualAlign().getQuantity() << "]\n";
2771bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar  OS << '\n';
2772bf9e48cbaaa23d990dbedf9489513500bd0b9751Daniel Dunbar}
27738d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar
27748d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbarvoid ASTContext::DumpRecordLayout(const RecordDecl *RD,
2775453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                                  raw_ostream &OS,
2776453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                                  bool Simple) const {
27778d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  const ASTRecordLayout &Info = getASTRecordLayout(RD);
27788d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar
27798d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
2780453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    if (!Simple)
2781453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor      return DumpCXXRecordLayout(OS, CXXRD, *this, CharUnits(), 0, 0,
2782453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor                                 /*IncludeVirtualBases=*/true);
27838d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar
27848d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  OS << "Type: " << getTypeDeclType(RD).getAsString() << "\n";
2785453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  if (!Simple) {
2786453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    OS << "Record: ";
2787453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor    RD->dump();
2788453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  }
27898d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  OS << "\nLayout: ";
27908d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  OS << "<ASTRecordLayout\n";
2791dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck  OS << "  Size:" << toBits(Info.getSize()) << "\n";
2792ec2990351335f163601b98e39b52425e2e9f931eKen Dyck  OS << "  DataSize:" << toBits(Info.getDataSize()) << "\n";
2793dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck  OS << "  Alignment:" << toBits(Info.getAlignment()) << "\n";
27948d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  OS << "  FieldOffsets: [";
27958d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  for (unsigned i = 0, e = Info.getFieldCount(); i != e; ++i) {
27968d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar    if (i) OS << ", ";
27978d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar    OS << Info.getFieldOffset(i);
27988d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  }
27998d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar  OS << "]>\n";
28008d8ab749f6f8bb63ea2cd2b589c0f050b67fc5ccDaniel Dunbar}
2801