annotate clang/lib/AST/RecordLayout.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- RecordLayout.cpp - Layout information for a struct/union -----------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file defines the RecordLayout interface.
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include "clang/AST/RecordLayout.h"
anatofuz
parents:
diff changeset
14 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
15 #include "clang/Basic/TargetCXXABI.h"
anatofuz
parents:
diff changeset
16 #include "clang/Basic/TargetInfo.h"
anatofuz
parents:
diff changeset
17 #include <cassert>
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 using namespace clang;
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 void ASTRecordLayout::Destroy(ASTContext &Ctx) {
anatofuz
parents:
diff changeset
22 if (CXXInfo) {
anatofuz
parents:
diff changeset
23 CXXInfo->~CXXRecordLayoutInfo();
anatofuz
parents:
diff changeset
24 Ctx.Deallocate(CXXInfo);
anatofuz
parents:
diff changeset
25 }
anatofuz
parents:
diff changeset
26 this->~ASTRecordLayout();
anatofuz
parents:
diff changeset
27 Ctx.Deallocate(this);
anatofuz
parents:
diff changeset
28 }
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, CharUnits size,
anatofuz
parents:
diff changeset
31 CharUnits alignment,
anatofuz
parents:
diff changeset
32 CharUnits unadjustedAlignment,
anatofuz
parents:
diff changeset
33 CharUnits requiredAlignment,
anatofuz
parents:
diff changeset
34 CharUnits datasize,
anatofuz
parents:
diff changeset
35 ArrayRef<uint64_t> fieldoffsets)
anatofuz
parents:
diff changeset
36 : Size(size), DataSize(datasize), Alignment(alignment),
anatofuz
parents:
diff changeset
37 UnadjustedAlignment(unadjustedAlignment),
anatofuz
parents:
diff changeset
38 RequiredAlignment(requiredAlignment) {
anatofuz
parents:
diff changeset
39 FieldOffsets.append(Ctx, fieldoffsets.begin(), fieldoffsets.end());
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 // Constructor for C++ records.
anatofuz
parents:
diff changeset
43 ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
anatofuz
parents:
diff changeset
44 CharUnits size, CharUnits alignment,
anatofuz
parents:
diff changeset
45 CharUnits unadjustedAlignment,
anatofuz
parents:
diff changeset
46 CharUnits requiredAlignment,
anatofuz
parents:
diff changeset
47 bool hasOwnVFPtr, bool hasExtendableVFPtr,
anatofuz
parents:
diff changeset
48 CharUnits vbptroffset,
anatofuz
parents:
diff changeset
49 CharUnits datasize,
anatofuz
parents:
diff changeset
50 ArrayRef<uint64_t> fieldoffsets,
anatofuz
parents:
diff changeset
51 CharUnits nonvirtualsize,
anatofuz
parents:
diff changeset
52 CharUnits nonvirtualalignment,
anatofuz
parents:
diff changeset
53 CharUnits SizeOfLargestEmptySubobject,
anatofuz
parents:
diff changeset
54 const CXXRecordDecl *PrimaryBase,
anatofuz
parents:
diff changeset
55 bool IsPrimaryBaseVirtual,
anatofuz
parents:
diff changeset
56 const CXXRecordDecl *BaseSharingVBPtr,
anatofuz
parents:
diff changeset
57 bool EndsWithZeroSizedObject,
anatofuz
parents:
diff changeset
58 bool LeadsWithZeroSizedBase,
anatofuz
parents:
diff changeset
59 const BaseOffsetsMapTy& BaseOffsets,
anatofuz
parents:
diff changeset
60 const VBaseOffsetsMapTy& VBaseOffsets)
anatofuz
parents:
diff changeset
61 : Size(size), DataSize(datasize), Alignment(alignment),
anatofuz
parents:
diff changeset
62 UnadjustedAlignment(unadjustedAlignment),
anatofuz
parents:
diff changeset
63 RequiredAlignment(requiredAlignment), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
anatofuz
parents:
diff changeset
64 {
anatofuz
parents:
diff changeset
65 FieldOffsets.append(Ctx, fieldoffsets.begin(), fieldoffsets.end());
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 CXXInfo->PrimaryBase.setPointer(PrimaryBase);
anatofuz
parents:
diff changeset
68 CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual);
anatofuz
parents:
diff changeset
69 CXXInfo->NonVirtualSize = nonvirtualsize;
anatofuz
parents:
diff changeset
70 CXXInfo->NonVirtualAlignment = nonvirtualalignment;
anatofuz
parents:
diff changeset
71 CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
anatofuz
parents:
diff changeset
72 CXXInfo->BaseOffsets = BaseOffsets;
anatofuz
parents:
diff changeset
73 CXXInfo->VBaseOffsets = VBaseOffsets;
anatofuz
parents:
diff changeset
74 CXXInfo->HasOwnVFPtr = hasOwnVFPtr;
anatofuz
parents:
diff changeset
75 CXXInfo->VBPtrOffset = vbptroffset;
anatofuz
parents:
diff changeset
76 CXXInfo->HasExtendableVFPtr = hasExtendableVFPtr;
anatofuz
parents:
diff changeset
77 CXXInfo->BaseSharingVBPtr = BaseSharingVBPtr;
anatofuz
parents:
diff changeset
78 CXXInfo->EndsWithZeroSizedObject = EndsWithZeroSizedObject;
anatofuz
parents:
diff changeset
79 CXXInfo->LeadsWithZeroSizedBase = LeadsWithZeroSizedBase;
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 #ifndef NDEBUG
anatofuz
parents:
diff changeset
82 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
anatofuz
parents:
diff changeset
83 if (isPrimaryBaseVirtual()) {
anatofuz
parents:
diff changeset
84 if (Ctx.getTargetInfo().getCXXABI().hasPrimaryVBases()) {
anatofuz
parents:
diff changeset
85 assert(getVBaseClassOffset(PrimaryBase).isZero() &&
anatofuz
parents:
diff changeset
86 "Primary virtual base must be at offset 0!");
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88 } else {
anatofuz
parents:
diff changeset
89 assert(getBaseClassOffset(PrimaryBase).isZero() &&
anatofuz
parents:
diff changeset
90 "Primary base must be at offset 0!");
anatofuz
parents:
diff changeset
91 }
anatofuz
parents:
diff changeset
92 }
anatofuz
parents:
diff changeset
93 #endif
anatofuz
parents:
diff changeset
94 }