blob: 299fd111bf6a694ece4d91fe522e472d25a21967 [file] [log] [blame]
Ted Kremenekc3015a92010-03-08 20:56:29 +00001//===-- RecordLayout.cpp - Layout information for a struct/union -*- C++ -*-==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the RecordLayout interface.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/ASTContext.h"
15#include "clang/AST/RecordLayout.h"
Eli Friedman84d2d3a2011-09-27 19:12:27 +000016#include "clang/Basic/TargetInfo.h"
Ted Kremenekc3015a92010-03-08 20:56:29 +000017
18using namespace clang;
19
20void ASTRecordLayout::Destroy(ASTContext &Ctx) {
Argyrios Kyrtzidis96dbfa22010-08-25 00:32:19 +000021 if (CXXInfo) {
Argyrios Kyrtzidis96dbfa22010-08-25 00:32:19 +000022 CXXInfo->~CXXRecordLayoutInfo();
Yaron Keren188cafb2014-05-24 07:19:25 +000023 Ctx.Deallocate(CXXInfo);
Argyrios Kyrtzidis96dbfa22010-08-25 00:32:19 +000024 }
Ted Kremenekc3015a92010-03-08 20:56:29 +000025 this->~ASTRecordLayout();
26 Ctx.Deallocate(this);
27}
28
Ken Dyckc8ae5502011-02-09 01:59:34 +000029ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, CharUnits size,
David Majnemer97276c82016-05-24 18:10:50 +000030 CharUnits alignment,
Warren Hunt7b252d22013-12-06 00:01:17 +000031 CharUnits requiredAlignment,
32 CharUnits datasize,
David Majnemer97276c82016-05-24 18:10:50 +000033 ArrayRef<uint64_t> fieldoffsets)
34 : Size(size), DataSize(datasize), Alignment(alignment),
35 RequiredAlignment(requiredAlignment), CXXInfo(nullptr) {
36 FieldOffsets.append(Ctx, fieldoffsets.begin(), fieldoffsets.end());
Ted Kremenekc3015a92010-03-08 20:56:29 +000037}
38
39// Constructor for C++ records.
Jay Foad39c79802011-01-12 09:06:06 +000040ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
Ken Dyck7ad11e72011-02-15 02:32:40 +000041 CharUnits size, CharUnits alignment,
Warren Hunt7b252d22013-12-06 00:01:17 +000042 CharUnits requiredAlignment,
Warren Hunt486e7142013-11-13 22:16:13 +000043 bool hasOwnVFPtr, bool hasExtendableVFPtr,
Warren Hunt8f8bad72013-10-11 20:19:00 +000044 CharUnits vbptroffset,
Eli Friedman43114f92011-10-21 22:49:56 +000045 CharUnits datasize,
David Majnemer97276c82016-05-24 18:10:50 +000046 ArrayRef<uint64_t> fieldoffsets,
Ken Dyck316d6f62011-02-01 01:52:10 +000047 CharUnits nonvirtualsize,
Warren Huntd640d7d2014-01-09 00:30:56 +000048 CharUnits nonvirtualalignment,
Anders Carlsson28466ab2010-10-31 22:13:23 +000049 CharUnits SizeOfLargestEmptySubobject,
Anders Carlssond20e7cd2010-05-26 05:20:58 +000050 const CXXRecordDecl *PrimaryBase,
Anders Carlsson19bda8a2010-11-24 23:20:19 +000051 bool IsPrimaryBaseVirtual,
Timur Iskhodzhanov2c9341f2013-11-08 11:45:35 +000052 const CXXRecordDecl *BaseSharingVBPtr,
David Majnemercd3ebfe2016-05-23 17:16:12 +000053 bool EndsWithZeroSizedObject,
Warren Hunt049f6732013-12-06 19:54:25 +000054 bool LeadsWithZeroSizedBase,
Anders Carlsson6a848892010-03-11 04:10:39 +000055 const BaseOffsetsMapTy& BaseOffsets,
John McCalle42a3362012-05-01 08:55:32 +000056 const VBaseOffsetsMapTy& VBaseOffsets)
Warren Hunt7b252d22013-12-06 00:01:17 +000057 : Size(size), DataSize(datasize), Alignment(alignment),
David Majnemer97276c82016-05-24 18:10:50 +000058 RequiredAlignment(requiredAlignment), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
Ted Kremenekc3015a92010-03-08 20:56:29 +000059{
David Majnemer97276c82016-05-24 18:10:50 +000060 FieldOffsets.append(Ctx, fieldoffsets.begin(), fieldoffsets.end());
Ted Kremenekc3015a92010-03-08 20:56:29 +000061
Anders Carlsson19bda8a2010-11-24 23:20:19 +000062 CXXInfo->PrimaryBase.setPointer(PrimaryBase);
63 CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual);
Ted Kremenekc3015a92010-03-08 20:56:29 +000064 CXXInfo->NonVirtualSize = nonvirtualsize;
Warren Huntd640d7d2014-01-09 00:30:56 +000065 CXXInfo->NonVirtualAlignment = nonvirtualalignment;
Anders Carlsson2357bfd2010-05-08 22:35:05 +000066 CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
Anders Carlsson6a848892010-03-11 04:10:39 +000067 CXXInfo->BaseOffsets = BaseOffsets;
68 CXXInfo->VBaseOffsets = VBaseOffsets;
John McCalle42a3362012-05-01 08:55:32 +000069 CXXInfo->HasOwnVFPtr = hasOwnVFPtr;
Eli Friedman84d2d3a2011-09-27 19:12:27 +000070 CXXInfo->VBPtrOffset = vbptroffset;
Warren Hunt486e7142013-11-13 22:16:13 +000071 CXXInfo->HasExtendableVFPtr = hasExtendableVFPtr;
Timur Iskhodzhanov2c9341f2013-11-08 11:45:35 +000072 CXXInfo->BaseSharingVBPtr = BaseSharingVBPtr;
David Majnemercd3ebfe2016-05-23 17:16:12 +000073 CXXInfo->EndsWithZeroSizedObject = EndsWithZeroSizedObject;
Warren Hunt049f6732013-12-06 19:54:25 +000074 CXXInfo->LeadsWithZeroSizedBase = LeadsWithZeroSizedBase;
Warren Hunt8f8bad72013-10-11 20:19:00 +000075
Anders Carlsson09db5372010-03-11 01:49:18 +000076
77#ifndef NDEBUG
78 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
Eli Friedman84d2d3a2011-09-27 19:12:27 +000079 if (isPrimaryBaseVirtual()) {
John McCall359b8852013-01-25 22:30:49 +000080 if (Ctx.getTargetInfo().getCXXABI().hasPrimaryVBases()) {
81 assert(getVBaseClassOffset(PrimaryBase).isZero() &&
82 "Primary virtual base must be at offset 0!");
Eli Friedman84d2d3a2011-09-27 19:12:27 +000083 }
84 } else {
Benjamin Kramer2ef30312012-07-04 18:45:14 +000085 assert(getBaseClassOffset(PrimaryBase).isZero() &&
Anders Carlsson09db5372010-03-11 01:49:18 +000086 "Primary base must be at offset 0!");
Eli Friedman84d2d3a2011-09-27 19:12:27 +000087 }
Anders Carlsson09db5372010-03-11 01:49:18 +000088 }
89#endif
Ted Kremenekc3015a92010-03-08 20:56:29 +000090}