blob: 9f8bdec94ee6c7ccca7e8268a63335a7766316b7 [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];
35 for (unsigned i = 0; i < FieldCount; ++i)
36 FieldOffsets[i] = fieldoffsets[i];
37 }
38}
39
40// Constructor for C++ records.
41ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
42 uint64_t size, unsigned alignment,
43 uint64_t datasize,
44 const uint64_t *fieldoffsets,
45 unsigned fieldcount,
46 uint64_t nonvirtualsize,
47 unsigned nonvirtualalign,
48 const PrimaryBaseInfo &PrimaryBase,
49 const std::pair<const CXXRecordDecl *, uint64_t> *bases,
50 unsigned numbases,
51 const std::pair<const CXXRecordDecl *, uint64_t> *vbases,
52 unsigned numvbases)
53 : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
54 FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
55{
56 if (FieldCount > 0) {
57 FieldOffsets = new (Ctx) uint64_t[FieldCount];
58 for (unsigned i = 0; i < FieldCount; ++i)
59 FieldOffsets[i] = fieldoffsets[i];
60 }
61
62 CXXInfo->PrimaryBase = PrimaryBase;
63 CXXInfo->NonVirtualSize = nonvirtualsize;
64 CXXInfo->NonVirtualAlign = nonvirtualalign;
65 for (unsigned i = 0; i != numbases; ++i)
66 CXXInfo->BaseOffsets[bases[i].first] = bases[i].second;
67 for (unsigned i = 0; i != numvbases; ++i)
68 CXXInfo->VBaseOffsets[vbases[i].first] = vbases[i].second;
69}