RecordLayout.cpp revision 204962
1204962Srdivacky//===-- RecordLayout.cpp - Layout information for a struct/union -*- C++ -*-==//
2204962Srdivacky//
3204962Srdivacky//                     The LLVM Compiler Infrastructure
4204962Srdivacky//
5204962Srdivacky// This file is distributed under the University of Illinois Open Source
6204962Srdivacky// License. See LICENSE.TXT for details.
7204962Srdivacky//
8204962Srdivacky//===----------------------------------------------------------------------===//
9204962Srdivacky//
10204962Srdivacky//  This file defines the RecordLayout interface.
11204962Srdivacky//
12204962Srdivacky//===----------------------------------------------------------------------===//
13204962Srdivacky
14204962Srdivacky#include "clang/AST/ASTContext.h"
15204962Srdivacky#include "clang/AST/RecordLayout.h"
16204962Srdivacky
17204962Srdivackyusing namespace clang;
18204962Srdivacky
19204962Srdivackyvoid ASTRecordLayout::Destroy(ASTContext &Ctx) {
20204962Srdivacky  if (FieldOffsets)
21204962Srdivacky    Ctx.Deallocate(FieldOffsets);
22204962Srdivacky  if (CXXInfo)
23204962Srdivacky    Ctx.Deallocate(CXXInfo);
24204962Srdivacky  this->~ASTRecordLayout();
25204962Srdivacky  Ctx.Deallocate(this);
26204962Srdivacky}
27204962Srdivacky
28204962SrdivackyASTRecordLayout::ASTRecordLayout(ASTContext &Ctx, uint64_t size, unsigned alignment,
29204962Srdivacky                unsigned datasize, const uint64_t *fieldoffsets,
30204962Srdivacky                unsigned fieldcount)
31204962Srdivacky  : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
32204962Srdivacky    FieldCount(fieldcount), CXXInfo(0) {
33204962Srdivacky  if (FieldCount > 0)  {
34204962Srdivacky    FieldOffsets = new (Ctx) uint64_t[FieldCount];
35204962Srdivacky    memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
36204962Srdivacky  }
37204962Srdivacky}
38204962Srdivacky
39204962Srdivacky// Constructor for C++ records.
40204962SrdivackyASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
41204962Srdivacky                       uint64_t size, unsigned alignment,
42204962Srdivacky                       uint64_t datasize,
43204962Srdivacky                       const uint64_t *fieldoffsets,
44204962Srdivacky                       unsigned fieldcount,
45204962Srdivacky                       uint64_t nonvirtualsize,
46204962Srdivacky                       unsigned nonvirtualalign,
47204962Srdivacky                       const PrimaryBaseInfo &PrimaryBase,
48204962Srdivacky                       const std::pair<const CXXRecordDecl *, uint64_t> *bases,
49204962Srdivacky                       unsigned numbases,
50204962Srdivacky                       const std::pair<const CXXRecordDecl *, uint64_t> *vbases,
51204962Srdivacky                       unsigned numvbases)
52204962Srdivacky  : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
53204962Srdivacky    FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
54204962Srdivacky{
55204962Srdivacky  if (FieldCount > 0)  {
56204962Srdivacky    FieldOffsets = new (Ctx) uint64_t[FieldCount];
57204962Srdivacky    memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
58204962Srdivacky  }
59204962Srdivacky
60204962Srdivacky  CXXInfo->PrimaryBase = PrimaryBase;
61204962Srdivacky  CXXInfo->NonVirtualSize = nonvirtualsize;
62204962Srdivacky  CXXInfo->NonVirtualAlign = nonvirtualalign;
63204962Srdivacky  for (unsigned i = 0; i != numbases; ++i)
64204962Srdivacky    CXXInfo->BaseOffsets[bases[i].first] = bases[i].second;
65204962Srdivacky  for (unsigned i = 0; i != numvbases; ++i)
66204962Srdivacky    CXXInfo->VBaseOffsets[vbases[i].first] = vbases[i].second;
67204962Srdivacky}
68