/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/lib/AST/RecordLayout.cpp
Line | Count | Source |
1 | | //===- RecordLayout.cpp - Layout information for a struct/union -----------===// |
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 file defines the RecordLayout interface. |
10 | | // |
11 | | //===----------------------------------------------------------------------===// |
12 | | |
13 | | #include "clang/AST/RecordLayout.h" |
14 | | #include "clang/AST/ASTContext.h" |
15 | | #include "clang/Basic/TargetCXXABI.h" |
16 | | #include "clang/Basic/TargetInfo.h" |
17 | | #include <cassert> |
18 | | |
19 | | using namespace clang; |
20 | | |
21 | 420k | void ASTRecordLayout::Destroy(ASTContext &Ctx) { |
22 | 420k | if (CXXInfo) { |
23 | 301k | CXXInfo->~CXXRecordLayoutInfo(); |
24 | 301k | Ctx.Deallocate(CXXInfo); |
25 | 301k | } |
26 | 420k | this->~ASTRecordLayout(); |
27 | 420k | Ctx.Deallocate(this); |
28 | 420k | } |
29 | | |
30 | | ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, CharUnits size, |
31 | | CharUnits alignment, |
32 | | CharUnits preferredAlignment, |
33 | | CharUnits unadjustedAlignment, |
34 | | CharUnits requiredAlignment, |
35 | | CharUnits datasize, |
36 | | ArrayRef<uint64_t> fieldoffsets) |
37 | | : Size(size), DataSize(datasize), Alignment(alignment), |
38 | | PreferredAlignment(preferredAlignment), |
39 | | UnadjustedAlignment(unadjustedAlignment), |
40 | 119k | RequiredAlignment(requiredAlignment) { |
41 | 119k | FieldOffsets.append(Ctx, fieldoffsets.begin(), fieldoffsets.end()); |
42 | 119k | } |
43 | | |
44 | | // Constructor for C++ records. |
45 | | ASTRecordLayout::ASTRecordLayout( |
46 | | const ASTContext &Ctx, CharUnits size, CharUnits alignment, |
47 | | CharUnits preferredAlignment, CharUnits unadjustedAlignment, |
48 | | CharUnits requiredAlignment, bool hasOwnVFPtr, bool hasExtendableVFPtr, |
49 | | CharUnits vbptroffset, CharUnits datasize, ArrayRef<uint64_t> fieldoffsets, |
50 | | CharUnits nonvirtualsize, CharUnits nonvirtualalignment, |
51 | | CharUnits preferrednvalignment, CharUnits SizeOfLargestEmptySubobject, |
52 | | const CXXRecordDecl *PrimaryBase, bool IsPrimaryBaseVirtual, |
53 | | const CXXRecordDecl *BaseSharingVBPtr, bool EndsWithZeroSizedObject, |
54 | | bool LeadsWithZeroSizedBase, const BaseOffsetsMapTy &BaseOffsets, |
55 | | const VBaseOffsetsMapTy &VBaseOffsets) |
56 | | : Size(size), DataSize(datasize), Alignment(alignment), |
57 | | PreferredAlignment(preferredAlignment), |
58 | | UnadjustedAlignment(unadjustedAlignment), |
59 | | RequiredAlignment(requiredAlignment), |
60 | 301k | CXXInfo(new (Ctx) CXXRecordLayoutInfo) { |
61 | 301k | FieldOffsets.append(Ctx, fieldoffsets.begin(), fieldoffsets.end()); |
62 | | |
63 | 301k | CXXInfo->PrimaryBase.setPointer(PrimaryBase); |
64 | 301k | CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual); |
65 | 301k | CXXInfo->NonVirtualSize = nonvirtualsize; |
66 | 301k | CXXInfo->NonVirtualAlignment = nonvirtualalignment; |
67 | 301k | CXXInfo->PreferredNVAlignment = preferrednvalignment; |
68 | 301k | CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject; |
69 | 301k | CXXInfo->BaseOffsets = BaseOffsets; |
70 | 301k | CXXInfo->VBaseOffsets = VBaseOffsets; |
71 | 301k | CXXInfo->HasOwnVFPtr = hasOwnVFPtr; |
72 | 301k | CXXInfo->VBPtrOffset = vbptroffset; |
73 | 301k | CXXInfo->HasExtendableVFPtr = hasExtendableVFPtr; |
74 | 301k | CXXInfo->BaseSharingVBPtr = BaseSharingVBPtr; |
75 | 301k | CXXInfo->EndsWithZeroSizedObject = EndsWithZeroSizedObject; |
76 | 301k | CXXInfo->LeadsWithZeroSizedBase = LeadsWithZeroSizedBase; |
77 | | |
78 | 301k | #ifndef NDEBUG |
79 | 301k | if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) { |
80 | 11.7k | if (isPrimaryBaseVirtual()) { |
81 | 232 | if (Ctx.getTargetInfo().getCXXABI().hasPrimaryVBases()) { |
82 | 232 | assert(getVBaseClassOffset(PrimaryBase).isZero() && |
83 | 232 | "Primary virtual base must be at offset 0!"); |
84 | 232 | } |
85 | 11.5k | } else { |
86 | 11.5k | assert(getBaseClassOffset(PrimaryBase).isZero() && |
87 | 11.5k | "Primary base must be at offset 0!"); |
88 | 11.5k | } |
89 | 11.7k | } |
90 | 301k | #endif |
91 | 301k | } |