clang API Documentation

RecordLayout.cpp
Go to the documentation of this file.
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 }