blob: df5f79c961487237dff6f3e4ef60ea0c2c49fe86 [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) {
21 if (FieldOffsets)
22 Ctx.Deallocate(FieldOffsets);
Argyrios Kyrtzidis96dbfa22010-08-25 00:32:19 +000023 if (CXXInfo) {
Ted Kremenekc3015a92010-03-08 20:56:29 +000024 Ctx.Deallocate(CXXInfo);
Argyrios Kyrtzidis96dbfa22010-08-25 00:32:19 +000025 CXXInfo->~CXXRecordLayoutInfo();
26 }
Ted Kremenekc3015a92010-03-08 20:56:29 +000027 this->~ASTRecordLayout();
28 Ctx.Deallocate(this);
29}
30
Ken Dyckc8ae5502011-02-09 01:59:34 +000031ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, CharUnits size,
Ken Dyck7ad11e72011-02-15 02:32:40 +000032 CharUnits alignment, CharUnits datasize,
Jay Foad39c79802011-01-12 09:06:06 +000033 const uint64_t *fieldoffsets,
34 unsigned fieldcount)
John McCalle42a3362012-05-01 08:55:32 +000035 : Size(size), DataSize(datasize), Alignment(alignment), FieldOffsets(0),
Ted Kremenekc3015a92010-03-08 20:56:29 +000036 FieldCount(fieldcount), CXXInfo(0) {
37 if (FieldCount > 0) {
38 FieldOffsets = new (Ctx) uint64_t[FieldCount];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000039 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000040 }
41}
42
43// Constructor for C++ records.
Jay Foad39c79802011-01-12 09:06:06 +000044ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
Ken Dyck7ad11e72011-02-15 02:32:40 +000045 CharUnits size, CharUnits alignment,
Warren Hunt8f8bad72013-10-11 20:19:00 +000046 bool hasOwnVFPtr, bool hasVFPtr,
Warren Hunt8f8bad72013-10-11 20:19:00 +000047 CharUnits vbptroffset,
Eli Friedman43114f92011-10-21 22:49:56 +000048 CharUnits datasize,
Anders Carlsson6a848892010-03-11 04:10:39 +000049 const uint64_t *fieldoffsets,
50 unsigned fieldcount,
Ken Dyck316d6f62011-02-01 01:52:10 +000051 CharUnits nonvirtualsize,
Ken Dyckbec02852011-02-08 02:02:47 +000052 CharUnits nonvirtualalign,
Anders Carlsson28466ab2010-10-31 22:13:23 +000053 CharUnits SizeOfLargestEmptySubobject,
Anders Carlssond20e7cd2010-05-26 05:20:58 +000054 const CXXRecordDecl *PrimaryBase,
Anders Carlsson19bda8a2010-11-24 23:20:19 +000055 bool IsPrimaryBaseVirtual,
Timur Iskhodzhanov2c9341f2013-11-08 11:45:35 +000056 const CXXRecordDecl *BaseSharingVBPtr,
Warren Hunt8f8bad72013-10-11 20:19:00 +000057 bool AlignAfterVBases,
Anders Carlsson6a848892010-03-11 04:10:39 +000058 const BaseOffsetsMapTy& BaseOffsets,
John McCalle42a3362012-05-01 08:55:32 +000059 const VBaseOffsetsMapTy& VBaseOffsets)
60 : Size(size), DataSize(datasize), Alignment(alignment), FieldOffsets(0),
Ted Kremenekc3015a92010-03-08 20:56:29 +000061 FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
62{
63 if (FieldCount > 0) {
64 FieldOffsets = new (Ctx) uint64_t[FieldCount];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000065 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000066 }
67
Anders Carlsson19bda8a2010-11-24 23:20:19 +000068 CXXInfo->PrimaryBase.setPointer(PrimaryBase);
69 CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual);
Ted Kremenekc3015a92010-03-08 20:56:29 +000070 CXXInfo->NonVirtualSize = nonvirtualsize;
71 CXXInfo->NonVirtualAlign = nonvirtualalign;
Anders Carlsson2357bfd2010-05-08 22:35:05 +000072 CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
Anders Carlsson6a848892010-03-11 04:10:39 +000073 CXXInfo->BaseOffsets = BaseOffsets;
74 CXXInfo->VBaseOffsets = VBaseOffsets;
John McCalle42a3362012-05-01 08:55:32 +000075 CXXInfo->HasOwnVFPtr = hasOwnVFPtr;
Eli Friedman84d2d3a2011-09-27 19:12:27 +000076 CXXInfo->VBPtrOffset = vbptroffset;
Warren Hunt8f8bad72013-10-11 20:19:00 +000077 CXXInfo->HasVFPtr = hasVFPtr;
Timur Iskhodzhanov2c9341f2013-11-08 11:45:35 +000078 CXXInfo->BaseSharingVBPtr = BaseSharingVBPtr;
Warren Hunt8f8bad72013-10-11 20:19:00 +000079 CXXInfo->AlignAfterVBases = AlignAfterVBases;
80
Anders Carlsson09db5372010-03-11 01:49:18 +000081
82#ifndef NDEBUG
83 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
Eli Friedman84d2d3a2011-09-27 19:12:27 +000084 if (isPrimaryBaseVirtual()) {
John McCall359b8852013-01-25 22:30:49 +000085 if (Ctx.getTargetInfo().getCXXABI().hasPrimaryVBases()) {
86 assert(getVBaseClassOffset(PrimaryBase).isZero() &&
87 "Primary virtual base must be at offset 0!");
Eli Friedman84d2d3a2011-09-27 19:12:27 +000088 }
89 } else {
Benjamin Kramer2ef30312012-07-04 18:45:14 +000090 assert(getBaseClassOffset(PrimaryBase).isZero() &&
Anders Carlsson09db5372010-03-11 01:49:18 +000091 "Primary base must be at offset 0!");
Eli Friedman84d2d3a2011-09-27 19:12:27 +000092 }
Anders Carlsson09db5372010-03-11 01:49:18 +000093 }
94#endif
Ted Kremenekc3015a92010-03-08 20:56:29 +000095}