1 //===- UDTLayout.h - UDT layout info ----------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_DEBUGINFO_PDB_UDTLAYOUT_H
11 #define LLVM_DEBUGINFO_PDB_UDTLAYOUT_H
13 #include "PDBSymbol.h"
16 #include "llvm/ADT/ArrayRef.h"
17 #include "llvm/ADT/BitVector.h"
28 class PDBSymTypeBaseClass;
30 class PDBSymbolTypeUDT;
31 class PDBSymbolTypeVTable;
34 class BaseClassLayout;
35 class StorageItemBase;
38 class StorageItemBase {
40 StorageItemBase(const UDTLayoutBase &Parent, const PDBSymbol &Symbol,
41 const std::string &Name, uint32_t OffsetInParent,
43 virtual ~StorageItemBase() {}
45 virtual uint32_t deepPaddingSize() const;
47 const UDTLayoutBase &getParent() const { return Parent; }
48 StringRef getName() const { return Name; }
49 uint32_t getOffsetInParent() const { return OffsetInParent; }
50 uint32_t getSize() const { return SizeOf; }
51 const PDBSymbol &getSymbol() const { return Symbol; }
54 const UDTLayoutBase &Parent;
55 const PDBSymbol &Symbol;
58 uint32_t OffsetInParent = 0;
62 class DataMemberLayoutItem : public StorageItemBase {
64 DataMemberLayoutItem(const UDTLayoutBase &Parent,
65 std::unique_ptr<PDBSymbolData> DataMember);
67 virtual uint32_t deepPaddingSize() const;
69 const PDBSymbolData &getDataMember();
70 bool hasUDTLayout() const;
71 const ClassLayout &getUDTLayout() const;
74 std::unique_ptr<PDBSymbolData> DataMember;
75 std::unique_ptr<ClassLayout> UdtLayout;
78 class VTableLayoutItem : public StorageItemBase {
80 VTableLayoutItem(const UDTLayoutBase &Parent,
81 std::unique_ptr<PDBSymbolTypeVTable> VTable);
82 ArrayRef<PDBSymbolFunc *> funcs() const { return VTableFuncs; }
84 uint32_t getElementSize() const { return ElementSize; }
86 void setFunction(uint32_t Index, PDBSymbolFunc &Func) {
87 VTableFuncs[Index] = &Func;
91 uint32_t ElementSize = 0;
92 std::unique_ptr<PDBSymbolTypeVTableShape> Shape;
93 std::unique_ptr<PDBSymbolTypeVTable> VTable;
94 std::vector<PDBSymbolFunc *> VTableFuncs;
98 template <typename T> using UniquePtrVector = std::vector<std::unique_ptr<T>>;
101 UDTLayoutBase(const PDBSymbol &Symbol, const std::string &Name,
104 uint32_t shallowPaddingSize() const;
105 uint32_t deepPaddingSize() const;
107 const BitVector &usedBytes() const { return UsedBytes; }
109 uint32_t getClassSize() const { return SizeOf; }
111 ArrayRef<std::unique_ptr<StorageItemBase>> layout_items() const {
115 VTableLayoutItem *findVTableAtOffset(uint32_t RelativeOffset);
117 StringRef getUDTName() const { return Name; }
119 ArrayRef<BaseClassLayout *> bases() const { return BaseClasses; }
120 ArrayRef<std::unique_ptr<PDBSymbolTypeBaseClass>> vbases() const {
124 ArrayRef<std::unique_ptr<PDBSymbolFunc>> funcs() const { return Funcs; }
126 ArrayRef<std::unique_ptr<PDBSymbol>> other_items() const { return Other; }
128 const PDBSymbol &getSymbolBase() const { return SymbolBase; }
131 void initializeChildren(const PDBSymbol &Sym);
133 void addChildToLayout(std::unique_ptr<StorageItemBase> Child);
134 void addVirtualOverride(PDBSymbolFunc &Func);
135 void addVirtualIntro(PDBSymbolFunc &Func);
137 const PDBSymbol &SymbolBase;
142 UniquePtrVector<PDBSymbol> Other;
143 UniquePtrVector<PDBSymbolFunc> Funcs;
144 UniquePtrVector<PDBSymbolTypeBaseClass> VirtualBases;
145 UniquePtrVector<StorageItemBase> ChildStorage;
146 std::vector<std::list<StorageItemBase *>> ChildrenPerByte;
147 std::vector<BaseClassLayout *> BaseClasses;
148 VTableLayoutItem *VTable = nullptr;
151 class ClassLayout : public UDTLayoutBase {
153 explicit ClassLayout(const PDBSymbolTypeUDT &UDT);
154 explicit ClassLayout(std::unique_ptr<PDBSymbolTypeUDT> UDT);
156 ClassLayout(ClassLayout &&Other) = default;
158 const PDBSymbolTypeUDT &getClass() const { return UDT; }
161 std::unique_ptr<PDBSymbolTypeUDT> OwnedStorage;
162 const PDBSymbolTypeUDT &UDT;
165 class BaseClassLayout : public UDTLayoutBase, public StorageItemBase {
167 BaseClassLayout(const UDTLayoutBase &Parent,
168 std::unique_ptr<PDBSymbolTypeBaseClass> Base);
170 const PDBSymbolTypeBaseClass &getBase() const { return *Base; }
171 bool isVirtualBase() const { return IsVirtualBase; }
174 std::unique_ptr<PDBSymbolTypeBaseClass> Base;
180 #endif // LLVM_DEBUGINFO_PDB_UDTLAYOUT_H