blob: ade2483722ef819ddab760d429e6225de4ef8bd1 [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,
47 const PrimaryBaseInfo &PrimaryBase,
48 const BaseOffsetsMapTy& BaseOffsets,
49 const BaseOffsetsMapTy& VBaseOffsets)
Ted Kremenekc3015a92010-03-08 20:56:29 +000050 : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
51 FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
52{
53 if (FieldCount > 0) {
54 FieldOffsets = new (Ctx) uint64_t[FieldCount];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000055 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000056 }
57
58 CXXInfo->PrimaryBase = PrimaryBase;
59 CXXInfo->NonVirtualSize = nonvirtualsize;
60 CXXInfo->NonVirtualAlign = nonvirtualalign;
Anders Carlsson6a848892010-03-11 04:10:39 +000061 CXXInfo->BaseOffsets = BaseOffsets;
62 CXXInfo->VBaseOffsets = VBaseOffsets;
Anders Carlsson09db5372010-03-11 01:49:18 +000063
64#ifndef NDEBUG
65 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
66 if (getPrimaryBaseWasVirtual())
67 assert(getVBaseClassOffset(PrimaryBase) == 0 &&
68 "Primary virtual base must be at offset 0!");
69 else
70 assert(getBaseClassOffset(PrimaryBase) == 0 &&
71 "Primary base must be at offset 0!");
72 }
73#endif
Ted Kremenekc3015a92010-03-08 20:56:29 +000074}