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