blob: 2acf97523c15d8e9fe35ad5b91322a960b0fc16f [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
Ken Dyckc8ae5502011-02-09 01:59:34 +000030ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, CharUnits size,
Jay Foad39c79802011-01-12 09:06:06 +000031 unsigned alignment, unsigned datasize,
32 const uint64_t *fieldoffsets,
33 unsigned fieldcount)
Ted Kremenekc3015a92010-03-08 20:56:29 +000034 : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
35 FieldCount(fieldcount), CXXInfo(0) {
36 if (FieldCount > 0) {
37 FieldOffsets = new (Ctx) uint64_t[FieldCount];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000038 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000039 }
40}
41
42// Constructor for C++ records.
Jay Foad39c79802011-01-12 09:06:06 +000043ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
Ken Dyckc8ae5502011-02-09 01:59:34 +000044 CharUnits size, unsigned alignment,
Anders Carlsson6a848892010-03-11 04:10:39 +000045 uint64_t datasize,
46 const uint64_t *fieldoffsets,
47 unsigned fieldcount,
Ken Dyck316d6f62011-02-01 01:52:10 +000048 CharUnits nonvirtualsize,
Ken Dyckbec02852011-02-08 02:02:47 +000049 CharUnits nonvirtualalign,
Anders Carlsson28466ab2010-10-31 22:13:23 +000050 CharUnits SizeOfLargestEmptySubobject,
Anders Carlssond20e7cd2010-05-26 05:20:58 +000051 const CXXRecordDecl *PrimaryBase,
Anders Carlsson19bda8a2010-11-24 23:20:19 +000052 bool IsPrimaryBaseVirtual,
Anders Carlsson6a848892010-03-11 04:10:39 +000053 const BaseOffsetsMapTy& BaseOffsets,
54 const BaseOffsetsMapTy& VBaseOffsets)
Ted Kremenekc3015a92010-03-08 20:56:29 +000055 : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
56 FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
57{
58 if (FieldCount > 0) {
59 FieldOffsets = new (Ctx) uint64_t[FieldCount];
Benjamin Kramerbbf5c262010-03-09 12:53:38 +000060 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
Ted Kremenekc3015a92010-03-08 20:56:29 +000061 }
62
Anders Carlsson19bda8a2010-11-24 23:20:19 +000063 CXXInfo->PrimaryBase.setPointer(PrimaryBase);
64 CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual);
Ted Kremenekc3015a92010-03-08 20:56:29 +000065 CXXInfo->NonVirtualSize = nonvirtualsize;
66 CXXInfo->NonVirtualAlign = nonvirtualalign;
Anders Carlsson2357bfd2010-05-08 22:35:05 +000067 CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
Anders Carlsson6a848892010-03-11 04:10:39 +000068 CXXInfo->BaseOffsets = BaseOffsets;
69 CXXInfo->VBaseOffsets = VBaseOffsets;
Anders Carlsson09db5372010-03-11 01:49:18 +000070
71#ifndef NDEBUG
72 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) {
Anders Carlsson7f95cd12010-11-24 23:12:57 +000073 if (isPrimaryBaseVirtual())
Anders Carlsson3f018712010-10-31 23:45:59 +000074 assert(getVBaseClassOffset(PrimaryBase).isZero() &&
Anders Carlsson09db5372010-03-11 01:49:18 +000075 "Primary virtual base must be at offset 0!");
76 else
Anders Carlssonfd88a612010-10-31 23:22:37 +000077 assert(getBaseClassOffsetInBits(PrimaryBase) == 0 &&
Anders Carlsson09db5372010-03-11 01:49:18 +000078 "Primary base must be at offset 0!");
79 }
80#endif
Ted Kremenekc3015a92010-03-08 20:56:29 +000081}