CGRecordLayout.h revision efbf487da83883c2da81181cac6f040928aa4289
12924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar//===--- CGRecordLayout.h - LLVM Record Layout Information ------*- C++ -*-===// 22924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar// 32924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar// The LLVM Compiler Infrastructure 42924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar// 52924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar// This file is distributed under the University of Illinois Open Source 62924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar// License. See LICENSE.TXT for details. 72924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar// 82924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar//===----------------------------------------------------------------------===// 92924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 102924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar#ifndef CLANG_CODEGEN_CGRECORDLAYOUT_H 112924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar#define CLANG_CODEGEN_CGRECORDLAYOUT_H 122924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 13198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar#include "llvm/ADT/DenseMap.h" 14198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar#include "clang/AST/Decl.h" 15270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbarnamespace llvm { 16270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbar class Type; 17270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbar} 18270e203b50ed8791e61afd357596bcf050cf2bfdDaniel Dunbar 192924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbarnamespace clang { 202924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbarnamespace CodeGen { 212924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 222eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbarclass CGBitFieldInfo { 232eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbarpublic: 24efbf487da83883c2da81181cac6f040928aa4289Daniel Dunbar CGBitFieldInfo(unsigned FieldNo, unsigned Start, unsigned Size, 25efbf487da83883c2da81181cac6f040928aa4289Daniel Dunbar bool IsSigned) 26efbf487da83883c2da81181cac6f040928aa4289Daniel Dunbar : FieldNo(FieldNo), Start(Start), Size(Size), IsSigned(IsSigned) {} 272eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar 282eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar unsigned FieldNo; 292eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar unsigned Start; 302eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar unsigned Size; 31efbf487da83883c2da81181cac6f040928aa4289Daniel Dunbar bool IsSigned : 1; 322eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar}; 332eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar 342924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar/// CGRecordLayout - This class handles struct and union layout info while 352924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar/// lowering AST types to LLVM types. 36198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar/// 37198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar/// These layout objects are only created on demand as IR generation requires. 382924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbarclass CGRecordLayout { 39198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar friend class CodeGenTypes; 40198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar 412924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar CGRecordLayout(const CGRecordLayout&); // DO NOT IMPLEMENT 422924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar void operator=(const CGRecordLayout&); // DO NOT IMPLEMENT 432924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 44198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbarprivate: 452924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar /// The LLVMType corresponding to this record layout. 462924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar const llvm::Type *LLVMType; 472924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 48198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// Map from (non-bit-field) struct field to the corresponding llvm struct 49198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// type field no. This info is populated by record builder. 50198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar llvm::DenseMap<const FieldDecl *, unsigned> FieldInfo; 51198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar 52198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// Map from (bit-field) struct field to the corresponding llvm struct type 53198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// field no. This info is populated by record builder. 542eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar llvm::DenseMap<const FieldDecl *, CGBitFieldInfo> BitFields; 55198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar 562924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar /// Whether one of the fields in this record layout is a pointer to data 572924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar /// member, or a struct that contains pointer to data member. 58198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar bool ContainsPointerToDataMember : 1; 592924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 602924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbarpublic: 612924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar CGRecordLayout(const llvm::Type *T, bool ContainsPointerToDataMember) 622924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar : LLVMType(T), ContainsPointerToDataMember(ContainsPointerToDataMember) {} 632924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 64198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// \brief Return the LLVM type associated with this record. 652924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar const llvm::Type *getLLVMType() const { 662924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar return LLVMType; 672924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar } 682924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 69198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// \brief Check whether this struct contains pointers to data members. 702924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar bool containsPointerToDataMember() const { 712924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar return ContainsPointerToDataMember; 722924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar } 73198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar 74198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// \brief Return the BitFieldInfo that corresponds to the field FD. 75198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar unsigned getLLVMFieldNo(const FieldDecl *FD) const { 76198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar assert(!FD->isBitField() && "Invalid call for bit-field decl!"); 77198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar assert(FieldInfo.count(FD) && "Invalid field for record!"); 78198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar return FieldInfo.lookup(FD); 79198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar } 80198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar 81198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// \brief Return llvm::StructType element number that corresponds to the 82198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar /// field FD. 832eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar const CGBitFieldInfo &getBitFieldInfo(const FieldDecl *FD) const { 84198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar assert(FD->isBitField() && "Invalid call for non bit-field decl!"); 852eec0b2e3e931de6cefbb266a7652a0622fe95b2Daniel Dunbar llvm::DenseMap<const FieldDecl *, CGBitFieldInfo>::const_iterator 86198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar it = BitFields.find(FD); 87198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar assert(it != BitFields.end() && "Unable to find bitfield info"); 88198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar return it->second; 89198bcb44b6271c92fd856403f34b518828100aacDaniel Dunbar } 902924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar}; 912924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 922924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar} // end namespace CodeGen 932924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar} // end namespace clang 942924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar 952924ade97ee4228fcf3518d89cd4bd1653236b48Daniel Dunbar#endif 96