blob: 68357450fb3ca88c2bcee71b9551a51daa20af98 [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,
41 uint64_t size, unsigned alignment,
42 uint64_t datasize,
43 const uint64_t *fieldoffsets,
44 unsigned fieldcount,
45 uint64_t nonvirtualsize,
46 unsigned nonvirtualalign,
47 const PrimaryBaseInfo &PrimaryBase,
48 const std::pair<const CXXRecordDecl *, uint64_t> *bases,
49 unsigned numbases,
50 const std::pair<const CXXRecordDecl *, uint64_t> *vbases,
51 unsigned numvbases)
52 : 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
60 CXXInfo->PrimaryBase = PrimaryBase;
61 CXXInfo->NonVirtualSize = nonvirtualsize;
62 CXXInfo->NonVirtualAlign = nonvirtualalign;
63 for (unsigned i = 0; i != numbases; ++i)
64 CXXInfo->BaseOffsets[bases[i].first] = bases[i].second;
65 for (unsigned i = 0; i != numvbases; ++i)
66 CXXInfo->VBaseOffsets[vbases[i].first] = vbases[i].second;
Anders Carlsson09db5372010-03-11 01:49:18 +000067
68#ifndef NDEBUG
69 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
70 if (getPrimaryBaseWasVirtual())
71 assert(getVBaseClassOffset(PrimaryBase) == 0 &&
72 "Primary virtual base must be at offset 0!");
73 else
74 assert(getBaseClassOffset(PrimaryBase) == 0 &&
75 "Primary base must be at offset 0!");
76 }
77#endif
Ted Kremenekc3015a92010-03-08 20:56:29 +000078}