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