blob: 19f577cfbf5c2eaed8d3c999bd539182bb6db506 [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);
Argyrios Kyrtzidis96dbfa22010-08-25 00:32:19 +000022 if (CXXInfo) {
Ted Kremenekc3015a92010-03-08 20:56:29 +000023 Ctx.Deallocate(CXXInfo);
Argyrios Kyrtzidis96dbfa22010-08-25 00:32:19 +000024 CXXInfo->~CXXRecordLayoutInfo();
25 }
Ted Kremenekc3015a92010-03-08 20:56:29 +000026 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];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000037 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000038 }
39}
40
41// Constructor for C++ records.
42ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
Anders Carlsson6a848892010-03-11 04:10:39 +000043 uint64_t size, unsigned alignment,
44 uint64_t datasize,
45 const uint64_t *fieldoffsets,
46 unsigned fieldcount,
47 uint64_t nonvirtualsize,
48 unsigned nonvirtualalign,
Anders Carlsson28466ab2010-10-31 22:13:23 +000049 CharUnits SizeOfLargestEmptySubobject,
Anders Carlssond20e7cd2010-05-26 05:20:58 +000050 const CXXRecordDecl *PrimaryBase,
51 bool PrimaryBaseIsVirtual,
Anders Carlsson6a848892010-03-11 04:10:39 +000052 const BaseOffsetsMapTy& BaseOffsets,
53 const BaseOffsetsMapTy& VBaseOffsets)
Ted Kremenekc3015a92010-03-08 20:56:29 +000054 : 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];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000059 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000060 }
61
Anders Carlssond20e7cd2010-05-26 05:20:58 +000062 CXXInfo->PrimaryBase = PrimaryBaseInfo(PrimaryBase, PrimaryBaseIsVirtual);
Ted Kremenekc3015a92010-03-08 20:56:29 +000063 CXXInfo->NonVirtualSize = nonvirtualsize;
64 CXXInfo->NonVirtualAlign = nonvirtualalign;
Anders Carlsson2357bfd2010-05-08 22:35:05 +000065 CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
Anders Carlsson6a848892010-03-11 04:10:39 +000066 CXXInfo->BaseOffsets = BaseOffsets;
67 CXXInfo->VBaseOffsets = VBaseOffsets;
Anders Carlsson09db5372010-03-11 01:49:18 +000068
69#ifndef NDEBUG
70 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
71 if (getPrimaryBaseWasVirtual())
Anders Carlssonfd88a612010-10-31 23:22:37 +000072 assert(getVBaseClassOffsetInBits(PrimaryBase) == 0 &&
Anders Carlsson09db5372010-03-11 01:49:18 +000073 "Primary virtual base must be at offset 0!");
74 else
Anders Carlssonfd88a612010-10-31 23:22:37 +000075 assert(getBaseClassOffsetInBits(PrimaryBase) == 0 &&
Anders Carlsson09db5372010-03-11 01:49:18 +000076 "Primary base must be at offset 0!");
77 }
78#endif
Ted Kremenekc3015a92010-03-08 20:56:29 +000079}