blob: 262c4597f8468831973e328311dbd5225cd1607e [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"
16
17using namespace clang;
18
19void ASTRecordLayout::Destroy(ASTContext &Ctx) {
20 if (FieldOffsets)
21 Ctx.Deallocate(FieldOffsets);
22 if (CXXInfo)
23 Ctx.Deallocate(CXXInfo);
24 this->~ASTRecordLayout();
25 Ctx.Deallocate(this);
26}
27
28ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx, uint64_t size, unsigned alignment,
29 unsigned datasize, const uint64_t *fieldoffsets,
30 unsigned fieldcount)
31 : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
32 FieldCount(fieldcount), CXXInfo(0) {
33 if (FieldCount > 0) {
34 FieldOffsets = new (Ctx) uint64_t[FieldCount];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000035 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000036 }
37}
38
39// Constructor for C++ records.
40ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
Anders Carlsson6a848892010-03-11 04:10:39 +000041 uint64_t size, unsigned alignment,
42 uint64_t datasize,
43 const uint64_t *fieldoffsets,
44 unsigned fieldcount,
45 uint64_t nonvirtualsize,
46 unsigned nonvirtualalign,
Anders Carlsson2357bfd2010-05-08 22:35:05 +000047 uint64_t SizeOfLargestEmptySubobject,
Anders Carlssond20e7cd2010-05-26 05:20:58 +000048 const CXXRecordDecl *PrimaryBase,
49 bool PrimaryBaseIsVirtual,
Anders Carlsson6a848892010-03-11 04:10:39 +000050 const BaseOffsetsMapTy& BaseOffsets,
51 const BaseOffsetsMapTy& VBaseOffsets)
Ted Kremenekc3015a92010-03-08 20:56:29 +000052 : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
53 FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
54{
55 if (FieldCount > 0) {
56 FieldOffsets = new (Ctx) uint64_t[FieldCount];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000057 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000058 }
59
Anders Carlssond20e7cd2010-05-26 05:20:58 +000060 CXXInfo->PrimaryBase = PrimaryBaseInfo(PrimaryBase, PrimaryBaseIsVirtual);
Ted Kremenekc3015a92010-03-08 20:56:29 +000061 CXXInfo->NonVirtualSize = nonvirtualsize;
62 CXXInfo->NonVirtualAlign = nonvirtualalign;
Anders Carlsson2357bfd2010-05-08 22:35:05 +000063 CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
Anders Carlsson6a848892010-03-11 04:10:39 +000064 CXXInfo->BaseOffsets = BaseOffsets;
65 CXXInfo->VBaseOffsets = VBaseOffsets;
Anders Carlsson09db5372010-03-11 01:49:18 +000066
67#ifndef NDEBUG
68 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
69 if (getPrimaryBaseWasVirtual())
70 assert(getVBaseClassOffset(PrimaryBase) == 0 &&
71 "Primary virtual base must be at offset 0!");
72 else
73 assert(getBaseClassOffset(PrimaryBase) == 0 &&
74 "Primary base must be at offset 0!");
75 }
76#endif
Ted Kremenekc3015a92010-03-08 20:56:29 +000077}