RecordLayout.cpp revision 212904
1//===-- 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    CXXInfo->~CXXRecordLayoutInfo();
25  }
26  this->~ASTRecordLayout();
27  Ctx.Deallocate(this);
28}
29
30ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx, uint64_t size, unsigned alignment,
31                unsigned datasize, const uint64_t *fieldoffsets,
32                unsigned fieldcount)
33  : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
34    FieldCount(fieldcount), CXXInfo(0) {
35  if (FieldCount > 0)  {
36    FieldOffsets = new (Ctx) uint64_t[FieldCount];
37    memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
38  }
39}
40
41// Constructor for C++ records.
42ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
43                                 uint64_t size, unsigned alignment,
44                                 uint64_t datasize,
45                                 const uint64_t *fieldoffsets,
46                                 unsigned fieldcount,
47                                 uint64_t nonvirtualsize,
48                                 unsigned nonvirtualalign,
49                                 uint64_t SizeOfLargestEmptySubobject,
50                                 const CXXRecordDecl *PrimaryBase,
51                                 bool PrimaryBaseIsVirtual,
52                                 const BaseOffsetsMapTy& BaseOffsets,
53                                 const BaseOffsetsMapTy& VBaseOffsets)
54  : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
55    FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
56{
57  if (FieldCount > 0)  {
58    FieldOffsets = new (Ctx) uint64_t[FieldCount];
59    memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
60  }
61
62  CXXInfo->PrimaryBase = PrimaryBaseInfo(PrimaryBase, PrimaryBaseIsVirtual);
63  CXXInfo->NonVirtualSize = nonvirtualsize;
64  CXXInfo->NonVirtualAlign = nonvirtualalign;
65  CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
66  CXXInfo->BaseOffsets = BaseOffsets;
67  CXXInfo->VBaseOffsets = VBaseOffsets;
68
69#ifndef NDEBUG
70    if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
71      if (getPrimaryBaseWasVirtual())
72        assert(getVBaseClassOffset(PrimaryBase) == 0 &&
73               "Primary virtual base must be at offset 0!");
74      else
75        assert(getBaseClassOffset(PrimaryBase) == 0 &&
76               "Primary base must be at offset 0!");
77    }
78#endif
79}
80