1 //===--- BaseSubobject.h - BaseSubobject class ----------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file provides a definition of the BaseSubobject class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_AST_BASESUBOBJECT_H 15 #define LLVM_CLANG_AST_BASESUBOBJECT_H 16 17 #include "clang/AST/CharUnits.h" 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/Support/DataTypes.h" 20 #include "llvm/Support/type_traits.h" 21 22 namespace clang { 23 class CXXRecordDecl; 24 25 // BaseSubobject - Uniquely identifies a direct or indirect base class. 26 // Stores both the base class decl and the offset from the most derived class to 27 // the base class. Used for vtable and VTT generation. 28 class BaseSubobject { 29 /// Base - The base class declaration. 30 const CXXRecordDecl *Base; 31 32 /// BaseOffset - The offset from the most derived class to the base class. 33 CharUnits BaseOffset; 34 35 public: BaseSubobject()36 BaseSubobject() { } BaseSubobject(const CXXRecordDecl * Base,CharUnits BaseOffset)37 BaseSubobject(const CXXRecordDecl *Base, CharUnits BaseOffset) 38 : Base(Base), BaseOffset(BaseOffset) { } 39 40 /// getBase - Returns the base class declaration. getBase()41 const CXXRecordDecl *getBase() const { return Base; } 42 43 /// getBaseOffset - Returns the base class offset. getBaseOffset()44 CharUnits getBaseOffset() const { return BaseOffset; } 45 46 friend bool operator==(const BaseSubobject &LHS, const BaseSubobject &RHS) { 47 return LHS.Base == RHS.Base && LHS.BaseOffset == RHS.BaseOffset; 48 } 49 }; 50 51 } // end namespace clang 52 53 namespace llvm { 54 55 template<> struct DenseMapInfo<clang::BaseSubobject> { 56 static clang::BaseSubobject getEmptyKey() { 57 return clang::BaseSubobject( 58 DenseMapInfo<const clang::CXXRecordDecl *>::getEmptyKey(), 59 clang::CharUnits::fromQuantity(DenseMapInfo<int64_t>::getEmptyKey())); 60 } 61 62 static clang::BaseSubobject getTombstoneKey() { 63 return clang::BaseSubobject( 64 DenseMapInfo<const clang::CXXRecordDecl *>::getTombstoneKey(), 65 clang::CharUnits::fromQuantity(DenseMapInfo<int64_t>::getTombstoneKey())); 66 } 67 68 static unsigned getHashValue(const clang::BaseSubobject &Base) { 69 typedef std::pair<const clang::CXXRecordDecl *, clang::CharUnits> PairTy; 70 return DenseMapInfo<PairTy>::getHashValue(PairTy(Base.getBase(), 71 Base.getBaseOffset())); 72 } 73 74 static bool isEqual(const clang::BaseSubobject &LHS, 75 const clang::BaseSubobject &RHS) { 76 return LHS == RHS; 77 } 78 }; 79 80 // It's OK to treat BaseSubobject as a POD type. 81 template <> struct isPodLike<clang::BaseSubobject> { 82 static const bool value = true; 83 }; 84 85 } 86 87 #endif 88