18 using namespace clang;
20 void ASTRecordLayout::Destroy(
ASTContext &Ctx) {
24 CXXInfo->~CXXRecordLayoutInfo();
35 const uint64_t *fieldoffsets,
37 : Size(size), DataSize(datasize), Alignment(alignment),
38 RequiredAlignment(requiredAlignment), FieldOffsets(nullptr),
39 FieldCount(fieldcount), CXXInfo(nullptr) {
41 FieldOffsets =
new (Ctx) uint64_t[FieldCount];
42 memcpy(FieldOffsets, fieldoffsets, FieldCount *
sizeof(*FieldOffsets));
47 ASTRecordLayout::ASTRecordLayout(
const ASTContext &Ctx,
50 bool hasOwnVFPtr,
bool hasExtendableVFPtr,
53 const uint64_t *fieldoffsets,
59 bool IsPrimaryBaseVirtual,
61 bool HasZeroSizedSubObject,
62 bool LeadsWithZeroSizedBase,
63 const BaseOffsetsMapTy& BaseOffsets,
64 const VBaseOffsetsMapTy& VBaseOffsets)
65 : Size(size), DataSize(datasize), Alignment(alignment),
66 RequiredAlignment(requiredAlignment), FieldOffsets(nullptr),
67 FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
70 FieldOffsets =
new (Ctx) uint64_t[FieldCount];
71 memcpy(FieldOffsets, fieldoffsets, FieldCount *
sizeof(*FieldOffsets));
74 CXXInfo->PrimaryBase.setPointer(PrimaryBase);
75 CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual);
76 CXXInfo->NonVirtualSize = nonvirtualsize;
77 CXXInfo->NonVirtualAlignment = nonvirtualalignment;
78 CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
79 CXXInfo->BaseOffsets = BaseOffsets;
80 CXXInfo->VBaseOffsets = VBaseOffsets;
81 CXXInfo->HasOwnVFPtr = hasOwnVFPtr;
82 CXXInfo->VBPtrOffset = vbptroffset;
83 CXXInfo->HasExtendableVFPtr = hasExtendableVFPtr;
84 CXXInfo->BaseSharingVBPtr = BaseSharingVBPtr;
85 CXXInfo->HasZeroSizedSubObject = HasZeroSizedSubObject;
86 CXXInfo->LeadsWithZeroSizedBase = LeadsWithZeroSizedBase;
91 if (isPrimaryBaseVirtual()) {
93 assert(getVBaseClassOffset(PrimaryBase).isZero() &&
94 "Primary virtual base must be at offset 0!");
97 assert(getBaseClassOffset(PrimaryBase).isZero() &&
98 "Primary base must be at offset 0!");
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
void Deallocate(void *Ptr) const
bool hasPrimaryVBases() const
Does this ABI allow virtual bases to be primary base classes?
const TargetInfo & getTargetInfo() const
Represents a C++ struct/union/class.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
Defines the clang::TargetInfo interface.