clang API Documentation
00001 //===-- RecordLayout.cpp - Layout information for a struct/union -*- C++ -*-==// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file defines the RecordLayout interface. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #include "clang/AST/ASTContext.h" 00015 #include "clang/AST/RecordLayout.h" 00016 #include "clang/Basic/TargetInfo.h" 00017 00018 using namespace clang; 00019 00020 void ASTRecordLayout::Destroy(ASTContext &Ctx) { 00021 if (FieldOffsets) 00022 Ctx.Deallocate(FieldOffsets); 00023 if (CXXInfo) { 00024 Ctx.Deallocate(CXXInfo); 00025 CXXInfo->~CXXRecordLayoutInfo(); 00026 } 00027 this->~ASTRecordLayout(); 00028 Ctx.Deallocate(this); 00029 } 00030 00031 ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, CharUnits size, 00032 CharUnits alignment, CharUnits datasize, 00033 const uint64_t *fieldoffsets, 00034 unsigned fieldcount) 00035 : Size(size), DataSize(datasize), Alignment(alignment), FieldOffsets(0), 00036 FieldCount(fieldcount), CXXInfo(0) { 00037 if (FieldCount > 0) { 00038 FieldOffsets = new (Ctx) uint64_t[FieldCount]; 00039 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets)); 00040 } 00041 } 00042 00043 // Constructor for C++ records. 00044 ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, 00045 CharUnits size, CharUnits alignment, 00046 bool hasOwnVFPtr, CharUnits vbptroffset, 00047 CharUnits datasize, 00048 const uint64_t *fieldoffsets, 00049 unsigned fieldcount, 00050 CharUnits nonvirtualsize, 00051 CharUnits nonvirtualalign, 00052 CharUnits SizeOfLargestEmptySubobject, 00053 const CXXRecordDecl *PrimaryBase, 00054 bool IsPrimaryBaseVirtual, 00055 const BaseOffsetsMapTy& BaseOffsets, 00056 const VBaseOffsetsMapTy& VBaseOffsets) 00057 : Size(size), DataSize(datasize), Alignment(alignment), FieldOffsets(0), 00058 FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo) 00059 { 00060 if (FieldCount > 0) { 00061 FieldOffsets = new (Ctx) uint64_t[FieldCount]; 00062 memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets)); 00063 } 00064 00065 CXXInfo->PrimaryBase.setPointer(PrimaryBase); 00066 CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual); 00067 CXXInfo->NonVirtualSize = nonvirtualsize; 00068 CXXInfo->NonVirtualAlign = nonvirtualalign; 00069 CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject; 00070 CXXInfo->BaseOffsets = BaseOffsets; 00071 CXXInfo->VBaseOffsets = VBaseOffsets; 00072 CXXInfo->HasOwnVFPtr = hasOwnVFPtr; 00073 CXXInfo->VBPtrOffset = vbptroffset; 00074 00075 #ifndef NDEBUG 00076 if (const CXXRecordDecl *PrimaryBase = getPrimaryBase()) { 00077 if (isPrimaryBaseVirtual()) { 00078 // Microsoft ABI doesn't have primary virtual base 00079 if (Ctx.getTargetInfo().getCXXABI() != CXXABI_Microsoft) { 00080 assert(getVBaseClassOffset(PrimaryBase).isZero() && 00081 "Primary virtual base must be at offset 0!"); 00082 } 00083 } else { 00084 assert(getBaseClassOffsetInBits(PrimaryBase) == 0 && 00085 "Primary base must be at offset 0!"); 00086 } 00087 } 00088 #endif 00089 }