clang 22.0.0git
VTableBuilder.h
Go to the documentation of this file.
1//===--- VTableBuilder.h - C++ vtable layout builder --------------*- C++ -*-=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This contains code dealing with generation of the layout of virtual tables.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_VTABLEBUILDER_H
14#define LLVM_CLANG_AST_VTABLEBUILDER_H
15
20#include "clang/Basic/ABI.h"
21#include "clang/Basic/Thunk.h"
22#include "llvm/ADT/DenseMap.h"
23#include <memory>
24#include <utility>
25
26namespace clang {
27 class CXXRecordDecl;
28
29/// Represents a single component in a vtable.
31public:
32 enum Kind {
38
39 /// A pointer to the complete destructor.
41
42 /// A pointer to the deleting destructor.
44
45 /// An entry that is never used.
46 ///
47 /// In some cases, a vtable function pointer will end up never being
48 /// called. Such vtable function pointers are represented as a
49 /// CK_UnusedFunctionPointer.
51 };
52
53 VTableComponent() = default;
54
56 return VTableComponent(CK_VCallOffset, Offset);
57 }
58
60 return VTableComponent(CK_VBaseOffset, Offset);
61 }
62
64 return VTableComponent(CK_OffsetToTop, Offset);
65 }
66
68 return VTableComponent(CK_RTTI, reinterpret_cast<uintptr_t>(RD));
69 }
70
72 assert(!isa<CXXDestructorDecl>(MD) &&
73 "Don't use MakeFunction with destructors!");
74
76 reinterpret_cast<uintptr_t>(MD));
77 }
78
81 reinterpret_cast<uintptr_t>(DD));
82 }
83
86 reinterpret_cast<uintptr_t>(DD));
87 }
88
90 assert(!isa<CXXDestructorDecl>(MD) &&
91 "Don't use MakeUnusedFunction with destructors!");
93 reinterpret_cast<uintptr_t>(MD));
94 }
95
96 /// Get the kind of this vtable component.
97 Kind getKind() const {
98 return (Kind)(Value & 0x7);
99 }
100
102 assert(getKind() == CK_VCallOffset && "Invalid component kind!");
103
104 return getOffset();
105 }
106
108 assert(getKind() == CK_VBaseOffset && "Invalid component kind!");
109
110 return getOffset();
111 }
112
114 assert(getKind() == CK_OffsetToTop && "Invalid component kind!");
115
116 return getOffset();
117 }
118
119 const CXXRecordDecl *getRTTIDecl() const {
120 assert(isRTTIKind() && "Invalid component kind!");
121 return reinterpret_cast<CXXRecordDecl *>(getPointer());
122 }
123
125 assert(isFunctionPointerKind() && "Invalid component kind!");
126 if (isDestructorKind())
127 return getDestructorDecl();
128 return reinterpret_cast<CXXMethodDecl *>(getPointer());
129 }
130
132 assert(isDestructorKind() && "Invalid component kind!");
133 return reinterpret_cast<CXXDestructorDecl *>(getPointer());
134 }
135
137 assert(getKind() == CK_UnusedFunctionPointer && "Invalid component kind!");
138 return reinterpret_cast<CXXMethodDecl *>(getPointer());
139 }
140
141 bool isDestructorKind() const { return isDestructorKind(getKind()); }
142
146
149 }
150
151 bool isRTTIKind() const { return isRTTIKind(getKind()); }
152
153 GlobalDecl getGlobalDecl(bool HasVectorDeletingDtors) const {
154 assert(isUsedFunctionPointerKind() &&
155 "GlobalDecl can be created only from virtual function");
156
157 auto *DtorDecl = dyn_cast<CXXDestructorDecl>(getFunctionDecl());
158 switch (getKind()) {
160 return GlobalDecl(getFunctionDecl());
162 return GlobalDecl(DtorDecl, CXXDtorType::Dtor_Complete);
164 return GlobalDecl(DtorDecl, (HasVectorDeletingDtors)
167 case CK_VCallOffset:
168 case CK_VBaseOffset:
169 case CK_OffsetToTop:
170 case CK_RTTI:
172 llvm_unreachable("Only function pointers kinds");
173 }
174 llvm_unreachable("Should already return");
175 }
176
177private:
178 static bool isFunctionPointerKind(Kind ComponentKind) {
179 return isUsedFunctionPointerKind(ComponentKind) ||
180 ComponentKind == CK_UnusedFunctionPointer;
181 }
182 static bool isUsedFunctionPointerKind(Kind ComponentKind) {
183 return ComponentKind == CK_FunctionPointer ||
184 isDestructorKind(ComponentKind);
185 }
186 static bool isDestructorKind(Kind ComponentKind) {
187 return ComponentKind == CK_CompleteDtorPointer ||
188 ComponentKind == CK_DeletingDtorPointer;
189 }
190 static bool isRTTIKind(Kind ComponentKind) {
191 return ComponentKind == CK_RTTI;
192 }
193
194 VTableComponent(Kind ComponentKind, CharUnits Offset) {
195 assert((ComponentKind == CK_VCallOffset ||
196 ComponentKind == CK_VBaseOffset ||
197 ComponentKind == CK_OffsetToTop) && "Invalid component kind!");
198 assert(Offset.getQuantity() < (1LL << 56) && "Offset is too big!");
199 assert(Offset.getQuantity() >= -(1LL << 56) && "Offset is too small!");
200
201 Value = (uint64_t(Offset.getQuantity()) << 3) | ComponentKind;
202 }
203
204 VTableComponent(Kind ComponentKind, uintptr_t Ptr) {
205 assert((isRTTIKind(ComponentKind) || isFunctionPointerKind(ComponentKind)) &&
206 "Invalid component kind!");
207
208 assert((Ptr & 7) == 0 && "Pointer not sufficiently aligned!");
209
210 Value = Ptr | ComponentKind;
211 }
212
213 CharUnits getOffset() const {
214 assert((getKind() == CK_VCallOffset || getKind() == CK_VBaseOffset ||
215 getKind() == CK_OffsetToTop) && "Invalid component kind!");
216
217 return CharUnits::fromQuantity(Value >> 3);
218 }
219
220 uintptr_t getPointer() const {
221 assert((getKind() == CK_RTTI || isFunctionPointerKind()) &&
222 "Invalid component kind!");
223
224 return static_cast<uintptr_t>(Value & ~7ULL);
225 }
226
227 /// The kind is stored in the lower 3 bits of the value. For offsets, we
228 /// make use of the facts that classes can't be larger than 2^55 bytes,
229 /// so we store the offset in the lower part of the 61 bits that remain.
230 /// (The reason that we're not simply using a PointerIntPair here is that we
231 /// need the offsets to be 64-bit, even when on a 32-bit machine).
232 int64_t Value;
233};
234
236public:
237 typedef std::pair<uint64_t, ThunkInfo> VTableThunkTy;
241 typedef llvm::DenseMap<BaseSubobject, AddressPointLocation>
243
244 // Mapping between the VTable index and address point index. This is useful
245 // when you don't care about the base subobjects and only want the address
246 // point for a given vtable index.
248
249private:
250 // Stores the component indices of the first component of each virtual table in
251 // the virtual table group. To save a little memory in the common case where
252 // the vtable group contains a single vtable, an empty vector here represents
253 // the vector {0}.
254 OwningArrayRef<size_t> VTableIndices;
255
256 OwningArrayRef<VTableComponent> VTableComponents;
257
258 /// Contains thunks needed by vtables, sorted by indices.
260
261 /// Address points for all vtables.
262 AddressPointsMapTy AddressPoints;
263
264 /// Address points for all vtable indices.
265 AddressPointsIndexMapTy AddressPointIndices;
266
267public:
268 VTableLayout(ArrayRef<size_t> VTableIndices,
269 ArrayRef<VTableComponent> VTableComponents,
270 ArrayRef<VTableThunkTy> VTableThunks,
271 const AddressPointsMapTy &AddressPoints);
273
275 return VTableComponents;
276 }
277
279 return VTableThunks;
280 }
281
283 assert(AddressPoints.count(Base) && "Did not find address point!");
284 return AddressPoints.lookup(Base);
285 }
286
288 return AddressPoints;
289 }
290
292 return AddressPointIndices;
293 }
294
295 size_t getNumVTables() const {
296 if (VTableIndices.empty())
297 return 1;
298 return VTableIndices.size();
299 }
300
301 size_t getVTableOffset(size_t i) const {
302 if (VTableIndices.empty()) {
303 assert(i == 0);
304 return 0;
305 }
306 return VTableIndices[i];
307 }
308
309 size_t getVTableSize(size_t i) const {
310 if (VTableIndices.empty()) {
311 assert(i == 0);
312 return vtable_components().size();
313 }
314
315 size_t thisIndex = VTableIndices[i];
316 size_t nextIndex = (i + 1 == VTableIndices.size())
317 ? vtable_components().size()
318 : VTableIndices[i + 1];
319 return nextIndex - thisIndex;
320 }
321};
322
324public:
326
327 bool isMicrosoft() const { return IsMicrosoftABI; }
328
330
331protected:
332 typedef llvm::DenseMap<const CXXMethodDecl *, ThunkInfoVectorTy> ThunksMapTy;
333
334 /// Contains all thunks that a given method decl will need.
336
337 /// Compute and store all vtable related information (vtable layout, vbase
338 /// offset offsets, thunks etc) for the given record decl.
340
342
343public:
347
348 // This assumes that all the destructors present in the vtable
349 // use exactly the same set of thunks.
350 ThunksMapTy::const_iterator I = Thunks.find(MD);
351 if (I == Thunks.end()) {
352 // We did not find a thunk for this method.
353 return nullptr;
354 }
355
356 return &I->second;
357 }
358
360
361 /// Determine whether this function should be assigned a vtable slot.
362 static bool hasVtableSlot(const CXXMethodDecl *MD);
363};
364
366public:
367 typedef llvm::DenseMap<const CXXMethodDecl *, const CXXMethodDecl *>
369
370private:
371
372 /// Contains the index (relative to the vtable address point)
373 /// where the function pointer for a virtual function is stored.
374 typedef llvm::DenseMap<GlobalDecl, int64_t> MethodVTableIndicesTy;
375 MethodVTableIndicesTy MethodVTableIndices;
376
377 typedef llvm::DenseMap<const CXXRecordDecl *,
378 std::unique_ptr<const VTableLayout>>
379 VTableLayoutMapTy;
380 VTableLayoutMapTy VTableLayouts;
381
382 typedef std::pair<const CXXRecordDecl *,
383 const CXXRecordDecl *> ClassPairTy;
384
385 /// vtable offsets for offsets of virtual bases of a class.
386 ///
387 /// Contains the vtable offset (relative to the address point) in chars
388 /// where the offsets for virtual bases of a class are stored.
389 typedef llvm::DenseMap<ClassPairTy, CharUnits>
390 VirtualBaseClassOffsetOffsetsMapTy;
391 VirtualBaseClassOffsetOffsetsMapTy VirtualBaseClassOffsetOffsets;
392
393 /// Map from a virtual method to the nearest method in the primary base class
394 /// chain that it overrides.
395 OriginalMethodMapTy OriginalMethodMap;
396
397 void computeVTableRelatedInformation(const CXXRecordDecl *RD) override;
398
399public:
401 /// Components in the vtable are pointers to other structs/functions.
403
404 /// Components in the vtable are relative offsets between the vtable and the
405 /// other structs/functions.
407 };
408
410 VTableComponentLayout ComponentLayout = Pointer);
411 ~ItaniumVTableContext() override;
412
414 computeVTableRelatedInformation(RD);
415 assert(VTableLayouts.count(RD) && "No layout for this record decl!");
416
417 return *VTableLayouts[RD];
418 }
419
420 std::unique_ptr<VTableLayout> createConstructionVTableLayout(
421 const CXXRecordDecl *MostDerivedClass, CharUnits MostDerivedClassOffset,
422 bool MostDerivedClassIsVirtual, const CXXRecordDecl *LayoutClass);
423
424 /// Locate a virtual function in the vtable.
425 ///
426 /// Return the index (relative to the vtable address point) where the
427 /// function pointer for the given virtual function is stored.
428 uint64_t getMethodVTableIndex(GlobalDecl GD);
429
430 /// Return the offset in chars (relative to the vtable address point) where
431 /// the offset of the virtual base that contains the given base is stored,
432 /// otherwise, if no virtual base contains the given class, return 0.
433 ///
434 /// Base must be a virtual base class or an unambiguous base.
436 const CXXRecordDecl *VBase);
437
438 /// Return the method that added the v-table slot that will be used to call
439 /// the given method.
440 ///
441 /// In the Itanium ABI, where overrides always cause methods to be added to
442 /// the primary v-table if they're not already there, this will be the first
443 /// declaration in the primary base class chain for which the return type
444 /// adjustment is trivial.
446
448
449 void setOriginalMethod(const CXXMethodDecl *Key, const CXXMethodDecl *Val) {
450 OriginalMethodMap[Key] = Val;
451 }
452
453 /// This method is reserved for the implementation and shouldn't be used
454 /// directly.
456 return OriginalMethodMap;
457 }
458
459 static bool classof(const VTableContextBase *VT) {
460 return !VT->isMicrosoft();
461 }
462
464 return ComponentLayout;
465 }
466
467 bool isPointerLayout() const { return ComponentLayout == Pointer; }
468 bool isRelativeLayout() const { return ComponentLayout == Relative; }
469
470private:
471 VTableComponentLayout ComponentLayout;
472};
473
474/// Holds information about the inheritance path to a virtual base or function
475/// table pointer. A record may contain as many vfptrs or vbptrs as there are
476/// base subobjects.
477struct VPtrInfo {
479
482
483 /// This is the most derived class that has this vptr at offset zero. When
484 /// single inheritance is used, this is always the most derived class. If
485 /// multiple inheritance is used, it may be any direct or indirect base.
487
488 /// This is the class that introduced the vptr by declaring new virtual
489 /// methods or virtual bases.
491
492 /// IntroducingObject is at this offset from its containing complete object or
493 /// virtual base.
495
496 /// The bases from the inheritance path that got used to mangle the vbtable
497 /// name. This is not really a full path like a CXXBasePath. It holds the
498 /// subset of records that need to be mangled into the vbtable symbol name in
499 /// order to get a unique name.
501
502 /// The next base to push onto the mangled path if this path is ambiguous in a
503 /// derived class. If it's null, then it's already been pushed onto the path.
505
506 /// The set of possibly indirect vbases that contain this vbtable. When a
507 /// derived class indirectly inherits from the same vbase twice, we only keep
508 /// vtables and their paths from the first instance.
510
511 /// This holds the base classes path from the complete type to the first base
512 /// with the given vfptr offset, in the base-to-derived order. Only used for
513 /// vftables.
515
516 /// Static offset from the top of the most derived class to this vfptr,
517 /// including any virtual base offset. Only used for vftables.
519
520 /// The vptr is stored inside the non-virtual component of this virtual base.
522 return ContainingVBases.empty() ? nullptr : ContainingVBases.front();
523 }
524};
525
527
528/// All virtual base related information about a given record decl. Includes
529/// information on all virtual base tables and the path components that are used
530/// to mangle them.
532 /// A map from virtual base to vbtable index for doing a conversion from the
533 /// the derived class to the a base.
534 llvm::DenseMap<const CXXRecordDecl *, unsigned> VBTableIndices;
535
536 /// Information on all virtual base tables used when this record is the most
537 /// derived class.
539};
540
542 /// If nonzero, holds the vbtable index of the virtual base with the vfptr.
543 uint64_t VBTableIndex;
544
545 /// If nonnull, holds the last vbase which contains the vfptr that the
546 /// method definition is adjusted to.
548
549 /// This is the offset of the vfptr from the start of the last vbase, or the
550 /// complete type if there are no virtual bases.
552
553 /// Method's index in the vftable.
554 uint64_t Index;
555
559
564
565 bool operator<(const MethodVFTableLocation &other) const {
566 if (VBTableIndex != other.VBTableIndex) {
567 assert(VBase != other.VBase);
568 return VBTableIndex < other.VBTableIndex;
569 }
570 return std::tie(VFPtrOffset, Index) <
571 std::tie(other.VFPtrOffset, other.Index);
572 }
573};
574
576public:
577
578private:
579 ASTContext &Context;
580
581 typedef llvm::DenseMap<GlobalDecl, MethodVFTableLocation>
582 MethodVFTableLocationsTy;
583 MethodVFTableLocationsTy MethodVFTableLocations;
584
585 typedef llvm::DenseMap<const CXXRecordDecl *, std::unique_ptr<VPtrInfoVector>>
586 VFPtrLocationsMapTy;
587 VFPtrLocationsMapTy VFPtrLocations;
588
589 typedef std::pair<const CXXRecordDecl *, CharUnits> VFTableIdTy;
590 typedef llvm::DenseMap<VFTableIdTy, std::unique_ptr<const VTableLayout>>
591 VFTableLayoutMapTy;
592 VFTableLayoutMapTy VFTableLayouts;
593
594 llvm::DenseMap<const CXXRecordDecl *, std::unique_ptr<VirtualBaseInfo>>
595 VBaseInfo;
596
597 void computeVTableRelatedInformation(const CXXRecordDecl *RD) override;
598
599 void dumpMethodLocations(const CXXRecordDecl *RD,
600 const MethodVFTableLocationsTy &NewMethods,
601 raw_ostream &);
602
603 const VirtualBaseInfo &
604 computeVBTableRelatedInformation(const CXXRecordDecl *RD);
605
606 void computeVTablePaths(bool ForVBTables, const CXXRecordDecl *RD,
607 VPtrInfoVector &Paths);
608
609public:
611 : VTableContextBase(/*MS=*/true), Context(Context) {}
612
613 ~MicrosoftVTableContext() override;
614
616
618 CharUnits VFPtrOffset);
619
621
623 // Complete destructors don't have a slot in a vftable, so no thunks needed.
626 return nullptr;
628 }
629
630 /// Returns the index of VBase in the vbtable of Derived.
631 /// VBase must be a morally virtual base of Derived.
632 /// The vbtable is an array of i32 offsets. The first entry is a self entry,
633 /// and the rest are offsets from the vbptr to virtual bases.
634 unsigned getVBTableIndex(const CXXRecordDecl *Derived,
635 const CXXRecordDecl *VBase);
636
638
639 static bool classof(const VTableContextBase *VT) { return VT->isMicrosoft(); }
640};
641
642} // namespace clang
643
644#endif
Enums/classes describing ABI related information about constructors, destructors and thunks.
Enums/classes describing THUNK related information about constructors, destructors and thunks.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2255
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
CharUnits - This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
Definition CharUnits.h:63
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:978
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:57
CXXDtorType getDtorType() const
Definition GlobalDecl.h:113
const Decl * getDecl() const
Definition GlobalDecl.h:106
@ Relative
Components in the vtable are relative offsets between the vtable and the other structs/functions.
@ Pointer
Components in the vtable are pointers to other structs/functions.
const CXXMethodDecl * findOriginalMethodInMap(const CXXMethodDecl *MD) const
const OriginalMethodMapTy & getOriginalMethodMap()
This method is reserved for the implementation and shouldn't be used directly.
VTableComponentLayout getVTableComponentLayout() const
uint64_t getMethodVTableIndex(GlobalDecl GD)
Locate a virtual function in the vtable.
llvm::DenseMap< const CXXMethodDecl *, const CXXMethodDecl * > OriginalMethodMapTy
std::unique_ptr< VTableLayout > createConstructionVTableLayout(const CXXRecordDecl *MostDerivedClass, CharUnits MostDerivedClassOffset, bool MostDerivedClassIsVirtual, const CXXRecordDecl *LayoutClass)
const VTableLayout & getVTableLayout(const CXXRecordDecl *RD)
CharUnits getVirtualBaseOffsetOffset(const CXXRecordDecl *RD, const CXXRecordDecl *VBase)
Return the offset in chars (relative to the vtable address point) where the offset of the virtual bas...
ItaniumVTableContext(ASTContext &Context, VTableComponentLayout ComponentLayout=Pointer)
GlobalDecl findOriginalMethod(GlobalDecl GD)
Return the method that added the v-table slot that will be used to call the given method.
void setOriginalMethod(const CXXMethodDecl *Key, const CXXMethodDecl *Val)
static bool classof(const VTableContextBase *VT)
static bool classof(const VTableContextBase *VT)
const ThunkInfoVectorTy * getThunkInfo(GlobalDecl GD) override
MicrosoftVTableContext(ASTContext &Context)
unsigned getVBTableIndex(const CXXRecordDecl *Derived, const CXXRecordDecl *VBase)
Returns the index of VBase in the vbtable of Derived.
const VPtrInfoVector & enumerateVBTables(const CXXRecordDecl *RD)
MethodVFTableLocation getMethodVFTableLocation(GlobalDecl GD)
const VPtrInfoVector & getVFPtrOffsets(const CXXRecordDecl *RD)
const VTableLayout & getVFTableLayout(const CXXRecordDecl *RD, CharUnits VFPtrOffset)
static VTableComponent MakeCompleteDtor(const CXXDestructorDecl *DD)
static VTableComponent MakeRTTI(const CXXRecordDecl *RD)
const CXXMethodDecl * getUnusedFunctionDecl() const
static VTableComponent MakeOffsetToTop(CharUnits Offset)
bool isUsedFunctionPointerKind() const
bool isDestructorKind() const
CharUnits getVBaseOffset() const
static VTableComponent MakeUnusedFunction(const CXXMethodDecl *MD)
Kind getKind() const
Get the kind of this vtable component.
static VTableComponent MakeFunction(const CXXMethodDecl *MD)
@ CK_DeletingDtorPointer
A pointer to the deleting destructor.
@ CK_UnusedFunctionPointer
An entry that is never used.
@ CK_CompleteDtorPointer
A pointer to the complete destructor.
static VTableComponent MakeVBaseOffset(CharUnits Offset)
const CXXRecordDecl * getRTTIDecl() const
static VTableComponent MakeDeletingDtor(const CXXDestructorDecl *DD)
bool isFunctionPointerKind() const
CharUnits getOffsetToTop() const
const CXXMethodDecl * getFunctionDecl() const
GlobalDecl getGlobalDecl(bool HasVectorDeletingDtors) const
static VTableComponent MakeVCallOffset(CharUnits Offset)
CharUnits getVCallOffset() const
const CXXDestructorDecl * getDestructorDecl() const
virtual const ThunkInfoVectorTy * getThunkInfo(GlobalDecl GD)
static bool hasVtableSlot(const CXXMethodDecl *MD)
Determine whether this function should be assigned a vtable slot.
virtual void computeVTableRelatedInformation(const CXXRecordDecl *RD)=0
Compute and store all vtable related information (vtable layout, vbase offset offsets,...
SmallVector< ThunkInfo, 1 > ThunkInfoVectorTy
llvm::DenseMap< const CXXMethodDecl *, ThunkInfoVectorTy > ThunksMapTy
ThunksMapTy Thunks
Contains all thunks that a given method decl will need.
const AddressPointsIndexMapTy & getAddressPointIndices() const
size_t getVTableOffset(size_t i) const
llvm::SmallVector< unsigned, 4 > AddressPointsIndexMapTy
VTableLayout(ArrayRef< size_t > VTableIndices, ArrayRef< VTableComponent > VTableComponents, ArrayRef< VTableThunkTy > VTableThunks, const AddressPointsMapTy &AddressPoints)
llvm::DenseMap< BaseSubobject, AddressPointLocation > AddressPointsMapTy
AddressPointLocation getAddressPoint(BaseSubobject Base) const
std::pair< uint64_t, ThunkInfo > VTableThunkTy
ArrayRef< VTableComponent > vtable_components() const
size_t getNumVTables() const
ArrayRef< VTableThunkTy > vtable_thunks() const
const AddressPointsMapTy & getAddressPoints() const
size_t getVTableSize(size_t i) const
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
Definition Address.h:330
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
SmallVector< std::unique_ptr< VPtrInfo >, 2 > VPtrInfoVector
@ Dtor_VectorDeleting
Vector deleting dtor.
Definition ABI.h:40
@ Dtor_Complete
Complete object dtor.
Definition ABI.h:36
@ Dtor_Deleting
Deleting dtor.
Definition ABI.h:35
U cast(CodeGen::Address addr)
Definition Address.h:327
unsigned long uint64_t
long int64_t
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
#define true
Definition stdbool.h:25
bool operator<(const MethodVFTableLocation &other) const
const CXXRecordDecl * VBase
If nonnull, holds the last vbase which contains the vfptr that the method definition is adjusted to.
MethodVFTableLocation(uint64_t VBTableIndex, const CXXRecordDecl *VBase, CharUnits VFPtrOffset, uint64_t Index)
CharUnits VFPtrOffset
This is the offset of the vfptr from the start of the last vbase, or the complete type if there are n...
uint64_t VBTableIndex
If nonzero, holds the vbtable index of the virtual base with the vfptr.
uint64_t Index
Method's index in the vftable.
CharUnits NonVirtualOffset
IntroducingObject is at this offset from its containing complete object or virtual base.
CharUnits FullOffsetInMDC
Static offset from the top of the most derived class to this vfptr, including any virtual base offset...
const CXXRecordDecl * getVBaseWithVPtr() const
The vptr is stored inside the non-virtual component of this virtual base.
SmallVector< const CXXRecordDecl *, 1 > BasePath
VPtrInfo(const CXXRecordDecl *RD)
BasePath ContainingVBases
The set of possibly indirect vbases that contain this vbtable.
const CXXRecordDecl * IntroducingObject
This is the class that introduced the vptr by declaring new virtual methods or virtual bases.
BasePath MangledPath
The bases from the inheritance path that got used to mangle the vbtable name.
const CXXRecordDecl * NextBaseToMangle
The next base to push onto the mangled path if this path is ambiguous in a derived class.
BasePath PathToIntroducingObject
This holds the base classes path from the complete type to the first base with the given vfptr offset...
const CXXRecordDecl * ObjectWithVPtr
This is the most derived class that has this vptr at offset zero.
All virtual base related information about a given record decl.
VPtrInfoVector VBPtrPaths
Information on all virtual base tables used when this record is the most derived class.
llvm::DenseMap< const CXXRecordDecl *, unsigned > VBTableIndices
A map from virtual base to vbtable index for doing a conversion from the the derived class to the a b...