1 //===- BaseSubobject.h - BaseSubobject class --------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file provides a definition of the BaseSubobject class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_AST_BASESUBOBJECT_H 14 #define LLVM_CLANG_AST_BASESUBOBJECT_H 15 16 #include "clang/AST/CharUnits.h" 17 #include "clang/AST/DeclCXX.h" 18 #include "llvm/ADT/DenseMapInfo.h" 19 #include "llvm/Support/type_traits.h" 20 #include <cstdint> 21 #include <utility> 22 23 namespace clang { 24 25 class CXXRecordDecl; 26 27 // BaseSubobject - Uniquely identifies a direct or indirect base class. 28 // Stores both the base class decl and the offset from the most derived class to 29 // the base class. Used for vtable and VTT generation. 30 class BaseSubobject { 31 /// Base - The base class declaration. 32 const CXXRecordDecl *Base; 33 34 /// BaseOffset - The offset from the most derived class to the base class. 35 CharUnits BaseOffset; 36 37 public: 38 BaseSubobject() = default; 39 BaseSubobject(const CXXRecordDecl *Base, CharUnits BaseOffset) 40 : Base(Base), BaseOffset(BaseOffset) {} 41 42 /// getBase - Returns the base class declaration. 43 const CXXRecordDecl *getBase() const { return Base; } 44 45 /// getBaseOffset - Returns the base class offset. 46 CharUnits getBaseOffset() const { return BaseOffset; } 47 48 friend bool operator==(const BaseSubobject &LHS, const BaseSubobject &RHS) { 49 return LHS.Base == RHS.Base && LHS.BaseOffset == RHS.BaseOffset; 50 } 51 }; 52 53 } // namespace clang 54 55 namespace llvm { 56 57 template<> struct DenseMapInfo<clang::BaseSubobject> { 58 static clang::BaseSubobject getEmptyKey() { 59 return clang::BaseSubobject( 60 DenseMapInfo<const clang::CXXRecordDecl *>::getEmptyKey(), 61 clang::CharUnits::fromQuantity(DenseMapInfo<int64_t>::getEmptyKey())); 62 } 63 64 static clang::BaseSubobject getTombstoneKey() { 65 return clang::BaseSubobject( 66 DenseMapInfo<const clang::CXXRecordDecl *>::getTombstoneKey(), 67 clang::CharUnits::fromQuantity(DenseMapInfo<int64_t>::getTombstoneKey())); 68 } 69 70 static unsigned getHashValue(const clang::BaseSubobject &Base) { 71 using PairTy = std::pair<const clang::CXXRecordDecl *, clang::CharUnits>; 72 73 return DenseMapInfo<PairTy>::getHashValue(PairTy(Base.getBase(), 74 Base.getBaseOffset())); 75 } 76 77 static bool isEqual(const clang::BaseSubobject &LHS, 78 const clang::BaseSubobject &RHS) { 79 return LHS == RHS; 80 } 81 }; 82 83 } // namespace llvm 84 85 #endif // LLVM_CLANG_AST_BASESUBOBJECT_H 86