1*9880d681SAndroid Build Coastguard Worker //===-- LLVMContextImpl.h - The LLVMContextImpl opaque class ----*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file declares LLVMContextImpl, the opaque implementation 11*9880d681SAndroid Build Coastguard Worker // of LLVMContext. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_IR_LLVMCONTEXTIMPL_H 16*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_IR_LLVMCONTEXTIMPL_H 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker #include "AttributeImpl.h" 19*9880d681SAndroid Build Coastguard Worker #include "ConstantsContext.h" 20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/APFloat.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/APInt.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/ArrayRef.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DenseMap.h" 24*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DenseSet.h" 25*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/FoldingSet.h" 26*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Hashing.h" 27*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallPtrSet.h" 28*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringMap.h" 29*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h" 30*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugInfoMetadata.h" 31*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h" 32*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h" 33*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.h" 34*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ValueHandle.h" 35*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Dwarf.h" 36*9880d681SAndroid Build Coastguard Worker #include <vector> 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker namespace llvm { 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker class ConstantInt; 41*9880d681SAndroid Build Coastguard Worker class ConstantFP; 42*9880d681SAndroid Build Coastguard Worker class DiagnosticInfoOptimizationRemark; 43*9880d681SAndroid Build Coastguard Worker class DiagnosticInfoOptimizationRemarkMissed; 44*9880d681SAndroid Build Coastguard Worker class DiagnosticInfoOptimizationRemarkAnalysis; 45*9880d681SAndroid Build Coastguard Worker class GCStrategy; 46*9880d681SAndroid Build Coastguard Worker class LLVMContext; 47*9880d681SAndroid Build Coastguard Worker class Type; 48*9880d681SAndroid Build Coastguard Worker class Value; 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker struct DenseMapAPIntKeyInfo { getEmptyKeyDenseMapAPIntKeyInfo51*9880d681SAndroid Build Coastguard Worker static inline APInt getEmptyKey() { 52*9880d681SAndroid Build Coastguard Worker APInt V(nullptr, 0); 53*9880d681SAndroid Build Coastguard Worker V.VAL = 0; 54*9880d681SAndroid Build Coastguard Worker return V; 55*9880d681SAndroid Build Coastguard Worker } getTombstoneKeyDenseMapAPIntKeyInfo56*9880d681SAndroid Build Coastguard Worker static inline APInt getTombstoneKey() { 57*9880d681SAndroid Build Coastguard Worker APInt V(nullptr, 0); 58*9880d681SAndroid Build Coastguard Worker V.VAL = 1; 59*9880d681SAndroid Build Coastguard Worker return V; 60*9880d681SAndroid Build Coastguard Worker } getHashValueDenseMapAPIntKeyInfo61*9880d681SAndroid Build Coastguard Worker static unsigned getHashValue(const APInt &Key) { 62*9880d681SAndroid Build Coastguard Worker return static_cast<unsigned>(hash_value(Key)); 63*9880d681SAndroid Build Coastguard Worker } isEqualDenseMapAPIntKeyInfo64*9880d681SAndroid Build Coastguard Worker static bool isEqual(const APInt &LHS, const APInt &RHS) { 65*9880d681SAndroid Build Coastguard Worker return LHS.getBitWidth() == RHS.getBitWidth() && LHS == RHS; 66*9880d681SAndroid Build Coastguard Worker } 67*9880d681SAndroid Build Coastguard Worker }; 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker struct DenseMapAPFloatKeyInfo { getEmptyKeyDenseMapAPFloatKeyInfo70*9880d681SAndroid Build Coastguard Worker static inline APFloat getEmptyKey() { return APFloat(APFloat::Bogus, 1); } getTombstoneKeyDenseMapAPFloatKeyInfo71*9880d681SAndroid Build Coastguard Worker static inline APFloat getTombstoneKey() { return APFloat(APFloat::Bogus, 2); } getHashValueDenseMapAPFloatKeyInfo72*9880d681SAndroid Build Coastguard Worker static unsigned getHashValue(const APFloat &Key) { 73*9880d681SAndroid Build Coastguard Worker return static_cast<unsigned>(hash_value(Key)); 74*9880d681SAndroid Build Coastguard Worker } isEqualDenseMapAPFloatKeyInfo75*9880d681SAndroid Build Coastguard Worker static bool isEqual(const APFloat &LHS, const APFloat &RHS) { 76*9880d681SAndroid Build Coastguard Worker return LHS.bitwiseIsEqual(RHS); 77*9880d681SAndroid Build Coastguard Worker } 78*9880d681SAndroid Build Coastguard Worker }; 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker struct AnonStructTypeKeyInfo { 81*9880d681SAndroid Build Coastguard Worker struct KeyTy { 82*9880d681SAndroid Build Coastguard Worker ArrayRef<Type*> ETypes; 83*9880d681SAndroid Build Coastguard Worker bool isPacked; KeyTyAnonStructTypeKeyInfo::KeyTy84*9880d681SAndroid Build Coastguard Worker KeyTy(const ArrayRef<Type*>& E, bool P) : 85*9880d681SAndroid Build Coastguard Worker ETypes(E), isPacked(P) {} KeyTyAnonStructTypeKeyInfo::KeyTy86*9880d681SAndroid Build Coastguard Worker KeyTy(const StructType *ST) 87*9880d681SAndroid Build Coastguard Worker : ETypes(ST->elements()), isPacked(ST->isPacked()) {} 88*9880d681SAndroid Build Coastguard Worker bool operator==(const KeyTy& that) const { 89*9880d681SAndroid Build Coastguard Worker if (isPacked != that.isPacked) 90*9880d681SAndroid Build Coastguard Worker return false; 91*9880d681SAndroid Build Coastguard Worker if (ETypes != that.ETypes) 92*9880d681SAndroid Build Coastguard Worker return false; 93*9880d681SAndroid Build Coastguard Worker return true; 94*9880d681SAndroid Build Coastguard Worker } 95*9880d681SAndroid Build Coastguard Worker bool operator!=(const KeyTy& that) const { 96*9880d681SAndroid Build Coastguard Worker return !this->operator==(that); 97*9880d681SAndroid Build Coastguard Worker } 98*9880d681SAndroid Build Coastguard Worker }; getEmptyKeyAnonStructTypeKeyInfo99*9880d681SAndroid Build Coastguard Worker static inline StructType* getEmptyKey() { 100*9880d681SAndroid Build Coastguard Worker return DenseMapInfo<StructType*>::getEmptyKey(); 101*9880d681SAndroid Build Coastguard Worker } getTombstoneKeyAnonStructTypeKeyInfo102*9880d681SAndroid Build Coastguard Worker static inline StructType* getTombstoneKey() { 103*9880d681SAndroid Build Coastguard Worker return DenseMapInfo<StructType*>::getTombstoneKey(); 104*9880d681SAndroid Build Coastguard Worker } getHashValueAnonStructTypeKeyInfo105*9880d681SAndroid Build Coastguard Worker static unsigned getHashValue(const KeyTy& Key) { 106*9880d681SAndroid Build Coastguard Worker return hash_combine(hash_combine_range(Key.ETypes.begin(), 107*9880d681SAndroid Build Coastguard Worker Key.ETypes.end()), 108*9880d681SAndroid Build Coastguard Worker Key.isPacked); 109*9880d681SAndroid Build Coastguard Worker } getHashValueAnonStructTypeKeyInfo110*9880d681SAndroid Build Coastguard Worker static unsigned getHashValue(const StructType *ST) { 111*9880d681SAndroid Build Coastguard Worker return getHashValue(KeyTy(ST)); 112*9880d681SAndroid Build Coastguard Worker } isEqualAnonStructTypeKeyInfo113*9880d681SAndroid Build Coastguard Worker static bool isEqual(const KeyTy& LHS, const StructType *RHS) { 114*9880d681SAndroid Build Coastguard Worker if (RHS == getEmptyKey() || RHS == getTombstoneKey()) 115*9880d681SAndroid Build Coastguard Worker return false; 116*9880d681SAndroid Build Coastguard Worker return LHS == KeyTy(RHS); 117*9880d681SAndroid Build Coastguard Worker } isEqualAnonStructTypeKeyInfo118*9880d681SAndroid Build Coastguard Worker static bool isEqual(const StructType *LHS, const StructType *RHS) { 119*9880d681SAndroid Build Coastguard Worker return LHS == RHS; 120*9880d681SAndroid Build Coastguard Worker } 121*9880d681SAndroid Build Coastguard Worker }; 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker struct FunctionTypeKeyInfo { 124*9880d681SAndroid Build Coastguard Worker struct KeyTy { 125*9880d681SAndroid Build Coastguard Worker const Type *ReturnType; 126*9880d681SAndroid Build Coastguard Worker ArrayRef<Type*> Params; 127*9880d681SAndroid Build Coastguard Worker bool isVarArg; KeyTyFunctionTypeKeyInfo::KeyTy128*9880d681SAndroid Build Coastguard Worker KeyTy(const Type* R, const ArrayRef<Type*>& P, bool V) : 129*9880d681SAndroid Build Coastguard Worker ReturnType(R), Params(P), isVarArg(V) {} KeyTyFunctionTypeKeyInfo::KeyTy130*9880d681SAndroid Build Coastguard Worker KeyTy(const FunctionType *FT) 131*9880d681SAndroid Build Coastguard Worker : ReturnType(FT->getReturnType()), Params(FT->params()), 132*9880d681SAndroid Build Coastguard Worker isVarArg(FT->isVarArg()) {} 133*9880d681SAndroid Build Coastguard Worker bool operator==(const KeyTy& that) const { 134*9880d681SAndroid Build Coastguard Worker if (ReturnType != that.ReturnType) 135*9880d681SAndroid Build Coastguard Worker return false; 136*9880d681SAndroid Build Coastguard Worker if (isVarArg != that.isVarArg) 137*9880d681SAndroid Build Coastguard Worker return false; 138*9880d681SAndroid Build Coastguard Worker if (Params != that.Params) 139*9880d681SAndroid Build Coastguard Worker return false; 140*9880d681SAndroid Build Coastguard Worker return true; 141*9880d681SAndroid Build Coastguard Worker } 142*9880d681SAndroid Build Coastguard Worker bool operator!=(const KeyTy& that) const { 143*9880d681SAndroid Build Coastguard Worker return !this->operator==(that); 144*9880d681SAndroid Build Coastguard Worker } 145*9880d681SAndroid Build Coastguard Worker }; getEmptyKeyFunctionTypeKeyInfo146*9880d681SAndroid Build Coastguard Worker static inline FunctionType* getEmptyKey() { 147*9880d681SAndroid Build Coastguard Worker return DenseMapInfo<FunctionType*>::getEmptyKey(); 148*9880d681SAndroid Build Coastguard Worker } getTombstoneKeyFunctionTypeKeyInfo149*9880d681SAndroid Build Coastguard Worker static inline FunctionType* getTombstoneKey() { 150*9880d681SAndroid Build Coastguard Worker return DenseMapInfo<FunctionType*>::getTombstoneKey(); 151*9880d681SAndroid Build Coastguard Worker } getHashValueFunctionTypeKeyInfo152*9880d681SAndroid Build Coastguard Worker static unsigned getHashValue(const KeyTy& Key) { 153*9880d681SAndroid Build Coastguard Worker return hash_combine(Key.ReturnType, 154*9880d681SAndroid Build Coastguard Worker hash_combine_range(Key.Params.begin(), 155*9880d681SAndroid Build Coastguard Worker Key.Params.end()), 156*9880d681SAndroid Build Coastguard Worker Key.isVarArg); 157*9880d681SAndroid Build Coastguard Worker } getHashValueFunctionTypeKeyInfo158*9880d681SAndroid Build Coastguard Worker static unsigned getHashValue(const FunctionType *FT) { 159*9880d681SAndroid Build Coastguard Worker return getHashValue(KeyTy(FT)); 160*9880d681SAndroid Build Coastguard Worker } isEqualFunctionTypeKeyInfo161*9880d681SAndroid Build Coastguard Worker static bool isEqual(const KeyTy& LHS, const FunctionType *RHS) { 162*9880d681SAndroid Build Coastguard Worker if (RHS == getEmptyKey() || RHS == getTombstoneKey()) 163*9880d681SAndroid Build Coastguard Worker return false; 164*9880d681SAndroid Build Coastguard Worker return LHS == KeyTy(RHS); 165*9880d681SAndroid Build Coastguard Worker } isEqualFunctionTypeKeyInfo166*9880d681SAndroid Build Coastguard Worker static bool isEqual(const FunctionType *LHS, const FunctionType *RHS) { 167*9880d681SAndroid Build Coastguard Worker return LHS == RHS; 168*9880d681SAndroid Build Coastguard Worker } 169*9880d681SAndroid Build Coastguard Worker }; 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker /// \brief Structure for hashing arbitrary MDNode operands. 172*9880d681SAndroid Build Coastguard Worker class MDNodeOpsKey { 173*9880d681SAndroid Build Coastguard Worker ArrayRef<Metadata *> RawOps; 174*9880d681SAndroid Build Coastguard Worker ArrayRef<MDOperand> Ops; 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker unsigned Hash; 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker protected: MDNodeOpsKey(ArrayRef<Metadata * > Ops)179*9880d681SAndroid Build Coastguard Worker MDNodeOpsKey(ArrayRef<Metadata *> Ops) 180*9880d681SAndroid Build Coastguard Worker : RawOps(Ops), Hash(calculateHash(Ops)) {} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker template <class NodeTy> 183*9880d681SAndroid Build Coastguard Worker MDNodeOpsKey(const NodeTy *N, unsigned Offset = 0) 184*9880d681SAndroid Build Coastguard Worker : Ops(N->op_begin() + Offset, N->op_end()), Hash(N->getHash()) {} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker template <class NodeTy> 187*9880d681SAndroid Build Coastguard Worker bool compareOps(const NodeTy *RHS, unsigned Offset = 0) const { 188*9880d681SAndroid Build Coastguard Worker if (getHash() != RHS->getHash()) 189*9880d681SAndroid Build Coastguard Worker return false; 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker assert((RawOps.empty() || Ops.empty()) && "Two sets of operands?"); 192*9880d681SAndroid Build Coastguard Worker return RawOps.empty() ? compareOps(Ops, RHS, Offset) 193*9880d681SAndroid Build Coastguard Worker : compareOps(RawOps, RHS, Offset); 194*9880d681SAndroid Build Coastguard Worker } 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker static unsigned calculateHash(MDNode *N, unsigned Offset = 0); 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker private: 199*9880d681SAndroid Build Coastguard Worker template <class T> compareOps(ArrayRef<T> Ops,const MDNode * RHS,unsigned Offset)200*9880d681SAndroid Build Coastguard Worker static bool compareOps(ArrayRef<T> Ops, const MDNode *RHS, unsigned Offset) { 201*9880d681SAndroid Build Coastguard Worker if (Ops.size() != RHS->getNumOperands() - Offset) 202*9880d681SAndroid Build Coastguard Worker return false; 203*9880d681SAndroid Build Coastguard Worker return std::equal(Ops.begin(), Ops.end(), RHS->op_begin() + Offset); 204*9880d681SAndroid Build Coastguard Worker } 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker static unsigned calculateHash(ArrayRef<Metadata *> Ops); 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker public: getHash()209*9880d681SAndroid Build Coastguard Worker unsigned getHash() const { return Hash; } 210*9880d681SAndroid Build Coastguard Worker }; 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker template <class NodeTy> struct MDNodeKeyImpl; 213*9880d681SAndroid Build Coastguard Worker template <class NodeTy> struct MDNodeInfo; 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker /// Configuration point for MDNodeInfo::isEqual(). 216*9880d681SAndroid Build Coastguard Worker template <class NodeTy> struct MDNodeSubsetEqualImpl { 217*9880d681SAndroid Build Coastguard Worker typedef MDNodeKeyImpl<NodeTy> KeyTy; isSubsetEqualMDNodeSubsetEqualImpl218*9880d681SAndroid Build Coastguard Worker static bool isSubsetEqual(const KeyTy &LHS, const NodeTy *RHS) { 219*9880d681SAndroid Build Coastguard Worker return false; 220*9880d681SAndroid Build Coastguard Worker } isSubsetEqualMDNodeSubsetEqualImpl221*9880d681SAndroid Build Coastguard Worker static bool isSubsetEqual(const NodeTy *LHS, const NodeTy *RHS) { 222*9880d681SAndroid Build Coastguard Worker return false; 223*9880d681SAndroid Build Coastguard Worker } 224*9880d681SAndroid Build Coastguard Worker }; 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker /// \brief DenseMapInfo for MDTuple. 227*9880d681SAndroid Build Coastguard Worker /// 228*9880d681SAndroid Build Coastguard Worker /// Note that we don't need the is-function-local bit, since that's implicit in 229*9880d681SAndroid Build Coastguard Worker /// the operands. 230*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<MDTuple> : MDNodeOpsKey { 231*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(ArrayRef<Metadata *> Ops) : MDNodeOpsKey(Ops) {} 232*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const MDTuple *N) : MDNodeOpsKey(N) {} 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const MDTuple *RHS) const { return compareOps(RHS); } 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { return getHash(); } 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker static unsigned calculateHash(MDTuple *N) { 239*9880d681SAndroid Build Coastguard Worker return MDNodeOpsKey::calculateHash(N); 240*9880d681SAndroid Build Coastguard Worker } 241*9880d681SAndroid Build Coastguard Worker }; 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker /// \brief DenseMapInfo for DILocation. 244*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DILocation> { 245*9880d681SAndroid Build Coastguard Worker unsigned Line; 246*9880d681SAndroid Build Coastguard Worker unsigned Column; 247*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 248*9880d681SAndroid Build Coastguard Worker Metadata *InlinedAt; 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned Line, unsigned Column, Metadata *Scope, 251*9880d681SAndroid Build Coastguard Worker Metadata *InlinedAt) 252*9880d681SAndroid Build Coastguard Worker : Line(Line), Column(Column), Scope(Scope), InlinedAt(InlinedAt) {} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DILocation *L) 255*9880d681SAndroid Build Coastguard Worker : Line(L->getLine()), Column(L->getColumn()), Scope(L->getRawScope()), 256*9880d681SAndroid Build Coastguard Worker InlinedAt(L->getRawInlinedAt()) {} 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DILocation *RHS) const { 259*9880d681SAndroid Build Coastguard Worker return Line == RHS->getLine() && Column == RHS->getColumn() && 260*9880d681SAndroid Build Coastguard Worker Scope == RHS->getRawScope() && InlinedAt == RHS->getRawInlinedAt(); 261*9880d681SAndroid Build Coastguard Worker } 262*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 263*9880d681SAndroid Build Coastguard Worker return hash_combine(Line, Column, Scope, InlinedAt); 264*9880d681SAndroid Build Coastguard Worker } 265*9880d681SAndroid Build Coastguard Worker }; 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Worker /// \brief DenseMapInfo for GenericDINode. 268*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<GenericDINode> : MDNodeOpsKey { 269*9880d681SAndroid Build Coastguard Worker unsigned Tag; 270*9880d681SAndroid Build Coastguard Worker MDString *Header; 271*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned Tag, MDString *Header, ArrayRef<Metadata *> DwarfOps) 272*9880d681SAndroid Build Coastguard Worker : MDNodeOpsKey(DwarfOps), Tag(Tag), Header(Header) {} 273*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const GenericDINode *N) 274*9880d681SAndroid Build Coastguard Worker : MDNodeOpsKey(N, 1), Tag(N->getTag()), Header(N->getRawHeader()) {} 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const GenericDINode *RHS) const { 277*9880d681SAndroid Build Coastguard Worker return Tag == RHS->getTag() && Header == RHS->getRawHeader() && 278*9880d681SAndroid Build Coastguard Worker compareOps(RHS, 1); 279*9880d681SAndroid Build Coastguard Worker } 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { return hash_combine(getHash(), Tag, Header); } 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker static unsigned calculateHash(GenericDINode *N) { 284*9880d681SAndroid Build Coastguard Worker return MDNodeOpsKey::calculateHash(N, 1); 285*9880d681SAndroid Build Coastguard Worker } 286*9880d681SAndroid Build Coastguard Worker }; 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DISubrange> { 289*9880d681SAndroid Build Coastguard Worker int64_t Count; 290*9880d681SAndroid Build Coastguard Worker int64_t LowerBound; 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(int64_t Count, int64_t LowerBound) 293*9880d681SAndroid Build Coastguard Worker : Count(Count), LowerBound(LowerBound) {} 294*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DISubrange *N) 295*9880d681SAndroid Build Coastguard Worker : Count(N->getCount()), LowerBound(N->getLowerBound()) {} 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DISubrange *RHS) const { 298*9880d681SAndroid Build Coastguard Worker return Count == RHS->getCount() && LowerBound == RHS->getLowerBound(); 299*9880d681SAndroid Build Coastguard Worker } 300*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { return hash_combine(Count, LowerBound); } 301*9880d681SAndroid Build Coastguard Worker }; 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIEnumerator> { 304*9880d681SAndroid Build Coastguard Worker int64_t Value; 305*9880d681SAndroid Build Coastguard Worker MDString *Name; 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(int64_t Value, MDString *Name) : Value(Value), Name(Name) {} 308*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIEnumerator *N) 309*9880d681SAndroid Build Coastguard Worker : Value(N->getValue()), Name(N->getRawName()) {} 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIEnumerator *RHS) const { 312*9880d681SAndroid Build Coastguard Worker return Value == RHS->getValue() && Name == RHS->getRawName(); 313*9880d681SAndroid Build Coastguard Worker } 314*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { return hash_combine(Value, Name); } 315*9880d681SAndroid Build Coastguard Worker }; 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIBasicType> { 318*9880d681SAndroid Build Coastguard Worker unsigned Tag; 319*9880d681SAndroid Build Coastguard Worker MDString *Name; 320*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits; 321*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits; 322*9880d681SAndroid Build Coastguard Worker unsigned Encoding; 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned Tag, MDString *Name, uint64_t SizeInBits, 325*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits, unsigned Encoding) 326*9880d681SAndroid Build Coastguard Worker : Tag(Tag), Name(Name), SizeInBits(SizeInBits), AlignInBits(AlignInBits), 327*9880d681SAndroid Build Coastguard Worker Encoding(Encoding) {} 328*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIBasicType *N) 329*9880d681SAndroid Build Coastguard Worker : Tag(N->getTag()), Name(N->getRawName()), SizeInBits(N->getSizeInBits()), 330*9880d681SAndroid Build Coastguard Worker AlignInBits(N->getAlignInBits()), Encoding(N->getEncoding()) {} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIBasicType *RHS) const { 333*9880d681SAndroid Build Coastguard Worker return Tag == RHS->getTag() && Name == RHS->getRawName() && 334*9880d681SAndroid Build Coastguard Worker SizeInBits == RHS->getSizeInBits() && 335*9880d681SAndroid Build Coastguard Worker AlignInBits == RHS->getAlignInBits() && 336*9880d681SAndroid Build Coastguard Worker Encoding == RHS->getEncoding(); 337*9880d681SAndroid Build Coastguard Worker } 338*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 339*9880d681SAndroid Build Coastguard Worker return hash_combine(Tag, Name, SizeInBits, AlignInBits, Encoding); 340*9880d681SAndroid Build Coastguard Worker } 341*9880d681SAndroid Build Coastguard Worker }; 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIDerivedType> { 344*9880d681SAndroid Build Coastguard Worker unsigned Tag; 345*9880d681SAndroid Build Coastguard Worker MDString *Name; 346*9880d681SAndroid Build Coastguard Worker Metadata *File; 347*9880d681SAndroid Build Coastguard Worker unsigned Line; 348*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 349*9880d681SAndroid Build Coastguard Worker Metadata *BaseType; 350*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits; 351*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits; 352*9880d681SAndroid Build Coastguard Worker uint64_t OffsetInBits; 353*9880d681SAndroid Build Coastguard Worker unsigned Flags; 354*9880d681SAndroid Build Coastguard Worker Metadata *ExtraData; 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned Tag, MDString *Name, Metadata *File, unsigned Line, 357*9880d681SAndroid Build Coastguard Worker Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, 358*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, 359*9880d681SAndroid Build Coastguard Worker Metadata *ExtraData) 360*9880d681SAndroid Build Coastguard Worker : Tag(Tag), Name(Name), File(File), Line(Line), Scope(Scope), 361*9880d681SAndroid Build Coastguard Worker BaseType(BaseType), SizeInBits(SizeInBits), AlignInBits(AlignInBits), 362*9880d681SAndroid Build Coastguard Worker OffsetInBits(OffsetInBits), Flags(Flags), ExtraData(ExtraData) {} 363*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIDerivedType *N) 364*9880d681SAndroid Build Coastguard Worker : Tag(N->getTag()), Name(N->getRawName()), File(N->getRawFile()), 365*9880d681SAndroid Build Coastguard Worker Line(N->getLine()), Scope(N->getRawScope()), 366*9880d681SAndroid Build Coastguard Worker BaseType(N->getRawBaseType()), SizeInBits(N->getSizeInBits()), 367*9880d681SAndroid Build Coastguard Worker AlignInBits(N->getAlignInBits()), OffsetInBits(N->getOffsetInBits()), 368*9880d681SAndroid Build Coastguard Worker Flags(N->getFlags()), ExtraData(N->getRawExtraData()) {} 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIDerivedType *RHS) const { 371*9880d681SAndroid Build Coastguard Worker return Tag == RHS->getTag() && Name == RHS->getRawName() && 372*9880d681SAndroid Build Coastguard Worker File == RHS->getRawFile() && Line == RHS->getLine() && 373*9880d681SAndroid Build Coastguard Worker Scope == RHS->getRawScope() && BaseType == RHS->getRawBaseType() && 374*9880d681SAndroid Build Coastguard Worker SizeInBits == RHS->getSizeInBits() && 375*9880d681SAndroid Build Coastguard Worker AlignInBits == RHS->getAlignInBits() && 376*9880d681SAndroid Build Coastguard Worker OffsetInBits == RHS->getOffsetInBits() && Flags == RHS->getFlags() && 377*9880d681SAndroid Build Coastguard Worker ExtraData == RHS->getRawExtraData(); 378*9880d681SAndroid Build Coastguard Worker } 379*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 380*9880d681SAndroid Build Coastguard Worker // If this is a member inside an ODR type, only hash the type and the name. 381*9880d681SAndroid Build Coastguard Worker // Otherwise the hash will be stronger than 382*9880d681SAndroid Build Coastguard Worker // MDNodeSubsetEqualImpl::isODRMember(). 383*9880d681SAndroid Build Coastguard Worker if (Tag == dwarf::DW_TAG_member && Name) 384*9880d681SAndroid Build Coastguard Worker if (auto *CT = dyn_cast_or_null<DICompositeType>(Scope)) 385*9880d681SAndroid Build Coastguard Worker if (CT->getRawIdentifier()) 386*9880d681SAndroid Build Coastguard Worker return hash_combine(Name, Scope); 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Worker // Intentionally computes the hash on a subset of the operands for 389*9880d681SAndroid Build Coastguard Worker // performance reason. The subset has to be significant enough to avoid 390*9880d681SAndroid Build Coastguard Worker // collision "most of the time". There is no correctness issue in case of 391*9880d681SAndroid Build Coastguard Worker // collision because of the full check above. 392*9880d681SAndroid Build Coastguard Worker return hash_combine(Tag, Name, File, Line, Scope, BaseType, Flags); 393*9880d681SAndroid Build Coastguard Worker } 394*9880d681SAndroid Build Coastguard Worker }; 395*9880d681SAndroid Build Coastguard Worker 396*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeSubsetEqualImpl<DIDerivedType> { 397*9880d681SAndroid Build Coastguard Worker typedef MDNodeKeyImpl<DIDerivedType> KeyTy; 398*9880d681SAndroid Build Coastguard Worker static bool isSubsetEqual(const KeyTy &LHS, const DIDerivedType *RHS) { 399*9880d681SAndroid Build Coastguard Worker return isODRMember(LHS.Tag, LHS.Scope, LHS.Name, RHS); 400*9880d681SAndroid Build Coastguard Worker } 401*9880d681SAndroid Build Coastguard Worker static bool isSubsetEqual(const DIDerivedType *LHS, const DIDerivedType *RHS) { 402*9880d681SAndroid Build Coastguard Worker return isODRMember(LHS->getTag(), LHS->getRawScope(), LHS->getRawName(), 403*9880d681SAndroid Build Coastguard Worker RHS); 404*9880d681SAndroid Build Coastguard Worker } 405*9880d681SAndroid Build Coastguard Worker 406*9880d681SAndroid Build Coastguard Worker /// Subprograms compare equal if they declare the same function in an ODR 407*9880d681SAndroid Build Coastguard Worker /// type. 408*9880d681SAndroid Build Coastguard Worker static bool isODRMember(unsigned Tag, const Metadata *Scope, 409*9880d681SAndroid Build Coastguard Worker const MDString *Name, const DIDerivedType *RHS) { 410*9880d681SAndroid Build Coastguard Worker // Check whether the LHS is eligible. 411*9880d681SAndroid Build Coastguard Worker if (Tag != dwarf::DW_TAG_member || !Name) 412*9880d681SAndroid Build Coastguard Worker return false; 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Worker auto *CT = dyn_cast_or_null<DICompositeType>(Scope); 415*9880d681SAndroid Build Coastguard Worker if (!CT || !CT->getRawIdentifier()) 416*9880d681SAndroid Build Coastguard Worker return false; 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Worker // Compare to the RHS. 419*9880d681SAndroid Build Coastguard Worker return Tag == RHS->getTag() && Name == RHS->getRawName() && 420*9880d681SAndroid Build Coastguard Worker Scope == RHS->getRawScope(); 421*9880d681SAndroid Build Coastguard Worker } 422*9880d681SAndroid Build Coastguard Worker }; 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DICompositeType> { 425*9880d681SAndroid Build Coastguard Worker unsigned Tag; 426*9880d681SAndroid Build Coastguard Worker MDString *Name; 427*9880d681SAndroid Build Coastguard Worker Metadata *File; 428*9880d681SAndroid Build Coastguard Worker unsigned Line; 429*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 430*9880d681SAndroid Build Coastguard Worker Metadata *BaseType; 431*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits; 432*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits; 433*9880d681SAndroid Build Coastguard Worker uint64_t OffsetInBits; 434*9880d681SAndroid Build Coastguard Worker unsigned Flags; 435*9880d681SAndroid Build Coastguard Worker Metadata *Elements; 436*9880d681SAndroid Build Coastguard Worker unsigned RuntimeLang; 437*9880d681SAndroid Build Coastguard Worker Metadata *VTableHolder; 438*9880d681SAndroid Build Coastguard Worker Metadata *TemplateParams; 439*9880d681SAndroid Build Coastguard Worker MDString *Identifier; 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned Tag, MDString *Name, Metadata *File, unsigned Line, 442*9880d681SAndroid Build Coastguard Worker Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, 443*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, 444*9880d681SAndroid Build Coastguard Worker Metadata *Elements, unsigned RuntimeLang, 445*9880d681SAndroid Build Coastguard Worker Metadata *VTableHolder, Metadata *TemplateParams, 446*9880d681SAndroid Build Coastguard Worker MDString *Identifier) 447*9880d681SAndroid Build Coastguard Worker : Tag(Tag), Name(Name), File(File), Line(Line), Scope(Scope), 448*9880d681SAndroid Build Coastguard Worker BaseType(BaseType), SizeInBits(SizeInBits), AlignInBits(AlignInBits), 449*9880d681SAndroid Build Coastguard Worker OffsetInBits(OffsetInBits), Flags(Flags), Elements(Elements), 450*9880d681SAndroid Build Coastguard Worker RuntimeLang(RuntimeLang), VTableHolder(VTableHolder), 451*9880d681SAndroid Build Coastguard Worker TemplateParams(TemplateParams), Identifier(Identifier) {} 452*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DICompositeType *N) 453*9880d681SAndroid Build Coastguard Worker : Tag(N->getTag()), Name(N->getRawName()), File(N->getRawFile()), 454*9880d681SAndroid Build Coastguard Worker Line(N->getLine()), Scope(N->getRawScope()), 455*9880d681SAndroid Build Coastguard Worker BaseType(N->getRawBaseType()), SizeInBits(N->getSizeInBits()), 456*9880d681SAndroid Build Coastguard Worker AlignInBits(N->getAlignInBits()), OffsetInBits(N->getOffsetInBits()), 457*9880d681SAndroid Build Coastguard Worker Flags(N->getFlags()), Elements(N->getRawElements()), 458*9880d681SAndroid Build Coastguard Worker RuntimeLang(N->getRuntimeLang()), VTableHolder(N->getRawVTableHolder()), 459*9880d681SAndroid Build Coastguard Worker TemplateParams(N->getRawTemplateParams()), 460*9880d681SAndroid Build Coastguard Worker Identifier(N->getRawIdentifier()) {} 461*9880d681SAndroid Build Coastguard Worker 462*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DICompositeType *RHS) const { 463*9880d681SAndroid Build Coastguard Worker return Tag == RHS->getTag() && Name == RHS->getRawName() && 464*9880d681SAndroid Build Coastguard Worker File == RHS->getRawFile() && Line == RHS->getLine() && 465*9880d681SAndroid Build Coastguard Worker Scope == RHS->getRawScope() && BaseType == RHS->getRawBaseType() && 466*9880d681SAndroid Build Coastguard Worker SizeInBits == RHS->getSizeInBits() && 467*9880d681SAndroid Build Coastguard Worker AlignInBits == RHS->getAlignInBits() && 468*9880d681SAndroid Build Coastguard Worker OffsetInBits == RHS->getOffsetInBits() && Flags == RHS->getFlags() && 469*9880d681SAndroid Build Coastguard Worker Elements == RHS->getRawElements() && 470*9880d681SAndroid Build Coastguard Worker RuntimeLang == RHS->getRuntimeLang() && 471*9880d681SAndroid Build Coastguard Worker VTableHolder == RHS->getRawVTableHolder() && 472*9880d681SAndroid Build Coastguard Worker TemplateParams == RHS->getRawTemplateParams() && 473*9880d681SAndroid Build Coastguard Worker Identifier == RHS->getRawIdentifier(); 474*9880d681SAndroid Build Coastguard Worker } 475*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 476*9880d681SAndroid Build Coastguard Worker // Intentionally computes the hash on a subset of the operands for 477*9880d681SAndroid Build Coastguard Worker // performance reason. The subset has to be significant enough to avoid 478*9880d681SAndroid Build Coastguard Worker // collision "most of the time". There is no correctness issue in case of 479*9880d681SAndroid Build Coastguard Worker // collision because of the full check above. 480*9880d681SAndroid Build Coastguard Worker return hash_combine(Name, File, Line, BaseType, Scope, Elements, 481*9880d681SAndroid Build Coastguard Worker TemplateParams); 482*9880d681SAndroid Build Coastguard Worker } 483*9880d681SAndroid Build Coastguard Worker }; 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DISubroutineType> { 486*9880d681SAndroid Build Coastguard Worker unsigned Flags; 487*9880d681SAndroid Build Coastguard Worker uint8_t CC; 488*9880d681SAndroid Build Coastguard Worker Metadata *TypeArray; 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned Flags, uint8_t CC, Metadata *TypeArray) 491*9880d681SAndroid Build Coastguard Worker : Flags(Flags), CC(CC), TypeArray(TypeArray) {} 492*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DISubroutineType *N) 493*9880d681SAndroid Build Coastguard Worker : Flags(N->getFlags()), CC(N->getCC()), TypeArray(N->getRawTypeArray()) {} 494*9880d681SAndroid Build Coastguard Worker 495*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DISubroutineType *RHS) const { 496*9880d681SAndroid Build Coastguard Worker return Flags == RHS->getFlags() && CC == RHS->getCC() && 497*9880d681SAndroid Build Coastguard Worker TypeArray == RHS->getRawTypeArray(); 498*9880d681SAndroid Build Coastguard Worker } 499*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { return hash_combine(Flags, CC, TypeArray); } 500*9880d681SAndroid Build Coastguard Worker }; 501*9880d681SAndroid Build Coastguard Worker 502*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIFile> { 503*9880d681SAndroid Build Coastguard Worker MDString *Filename; 504*9880d681SAndroid Build Coastguard Worker MDString *Directory; 505*9880d681SAndroid Build Coastguard Worker 506*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(MDString *Filename, MDString *Directory) 507*9880d681SAndroid Build Coastguard Worker : Filename(Filename), Directory(Directory) {} 508*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIFile *N) 509*9880d681SAndroid Build Coastguard Worker : Filename(N->getRawFilename()), Directory(N->getRawDirectory()) {} 510*9880d681SAndroid Build Coastguard Worker 511*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIFile *RHS) const { 512*9880d681SAndroid Build Coastguard Worker return Filename == RHS->getRawFilename() && 513*9880d681SAndroid Build Coastguard Worker Directory == RHS->getRawDirectory(); 514*9880d681SAndroid Build Coastguard Worker } 515*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { return hash_combine(Filename, Directory); } 516*9880d681SAndroid Build Coastguard Worker }; 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DISubprogram> { 519*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 520*9880d681SAndroid Build Coastguard Worker MDString *Name; 521*9880d681SAndroid Build Coastguard Worker MDString *LinkageName; 522*9880d681SAndroid Build Coastguard Worker Metadata *File; 523*9880d681SAndroid Build Coastguard Worker unsigned Line; 524*9880d681SAndroid Build Coastguard Worker Metadata *Type; 525*9880d681SAndroid Build Coastguard Worker bool IsLocalToUnit; 526*9880d681SAndroid Build Coastguard Worker bool IsDefinition; 527*9880d681SAndroid Build Coastguard Worker unsigned ScopeLine; 528*9880d681SAndroid Build Coastguard Worker Metadata *ContainingType; 529*9880d681SAndroid Build Coastguard Worker unsigned Virtuality; 530*9880d681SAndroid Build Coastguard Worker unsigned VirtualIndex; 531*9880d681SAndroid Build Coastguard Worker int ThisAdjustment; 532*9880d681SAndroid Build Coastguard Worker unsigned Flags; 533*9880d681SAndroid Build Coastguard Worker bool IsOptimized; 534*9880d681SAndroid Build Coastguard Worker Metadata *Unit; 535*9880d681SAndroid Build Coastguard Worker Metadata *TemplateParams; 536*9880d681SAndroid Build Coastguard Worker Metadata *Declaration; 537*9880d681SAndroid Build Coastguard Worker Metadata *Variables; 538*9880d681SAndroid Build Coastguard Worker 539*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(Metadata *Scope, MDString *Name, MDString *LinkageName, 540*9880d681SAndroid Build Coastguard Worker Metadata *File, unsigned Line, Metadata *Type, 541*9880d681SAndroid Build Coastguard Worker bool IsLocalToUnit, bool IsDefinition, unsigned ScopeLine, 542*9880d681SAndroid Build Coastguard Worker Metadata *ContainingType, unsigned Virtuality, 543*9880d681SAndroid Build Coastguard Worker unsigned VirtualIndex, int ThisAdjustment, unsigned Flags, 544*9880d681SAndroid Build Coastguard Worker bool IsOptimized, Metadata *Unit, Metadata *TemplateParams, 545*9880d681SAndroid Build Coastguard Worker Metadata *Declaration, Metadata *Variables) 546*9880d681SAndroid Build Coastguard Worker : Scope(Scope), Name(Name), LinkageName(LinkageName), File(File), 547*9880d681SAndroid Build Coastguard Worker Line(Line), Type(Type), IsLocalToUnit(IsLocalToUnit), 548*9880d681SAndroid Build Coastguard Worker IsDefinition(IsDefinition), ScopeLine(ScopeLine), 549*9880d681SAndroid Build Coastguard Worker ContainingType(ContainingType), Virtuality(Virtuality), 550*9880d681SAndroid Build Coastguard Worker VirtualIndex(VirtualIndex), ThisAdjustment(ThisAdjustment), 551*9880d681SAndroid Build Coastguard Worker Flags(Flags), IsOptimized(IsOptimized), Unit(Unit), 552*9880d681SAndroid Build Coastguard Worker TemplateParams(TemplateParams), Declaration(Declaration), 553*9880d681SAndroid Build Coastguard Worker Variables(Variables) {} 554*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DISubprogram *N) 555*9880d681SAndroid Build Coastguard Worker : Scope(N->getRawScope()), Name(N->getRawName()), 556*9880d681SAndroid Build Coastguard Worker LinkageName(N->getRawLinkageName()), File(N->getRawFile()), 557*9880d681SAndroid Build Coastguard Worker Line(N->getLine()), Type(N->getRawType()), 558*9880d681SAndroid Build Coastguard Worker IsLocalToUnit(N->isLocalToUnit()), IsDefinition(N->isDefinition()), 559*9880d681SAndroid Build Coastguard Worker ScopeLine(N->getScopeLine()), ContainingType(N->getRawContainingType()), 560*9880d681SAndroid Build Coastguard Worker Virtuality(N->getVirtuality()), VirtualIndex(N->getVirtualIndex()), 561*9880d681SAndroid Build Coastguard Worker ThisAdjustment(N->getThisAdjustment()), Flags(N->getFlags()), 562*9880d681SAndroid Build Coastguard Worker IsOptimized(N->isOptimized()), Unit(N->getRawUnit()), 563*9880d681SAndroid Build Coastguard Worker TemplateParams(N->getRawTemplateParams()), 564*9880d681SAndroid Build Coastguard Worker Declaration(N->getRawDeclaration()), Variables(N->getRawVariables()) {} 565*9880d681SAndroid Build Coastguard Worker 566*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DISubprogram *RHS) const { 567*9880d681SAndroid Build Coastguard Worker return Scope == RHS->getRawScope() && Name == RHS->getRawName() && 568*9880d681SAndroid Build Coastguard Worker LinkageName == RHS->getRawLinkageName() && 569*9880d681SAndroid Build Coastguard Worker File == RHS->getRawFile() && Line == RHS->getLine() && 570*9880d681SAndroid Build Coastguard Worker Type == RHS->getRawType() && IsLocalToUnit == RHS->isLocalToUnit() && 571*9880d681SAndroid Build Coastguard Worker IsDefinition == RHS->isDefinition() && 572*9880d681SAndroid Build Coastguard Worker ScopeLine == RHS->getScopeLine() && 573*9880d681SAndroid Build Coastguard Worker ContainingType == RHS->getRawContainingType() && 574*9880d681SAndroid Build Coastguard Worker Virtuality == RHS->getVirtuality() && 575*9880d681SAndroid Build Coastguard Worker VirtualIndex == RHS->getVirtualIndex() && 576*9880d681SAndroid Build Coastguard Worker ThisAdjustment == RHS->getThisAdjustment() && 577*9880d681SAndroid Build Coastguard Worker Flags == RHS->getFlags() && IsOptimized == RHS->isOptimized() && 578*9880d681SAndroid Build Coastguard Worker Unit == RHS->getUnit() && 579*9880d681SAndroid Build Coastguard Worker TemplateParams == RHS->getRawTemplateParams() && 580*9880d681SAndroid Build Coastguard Worker Declaration == RHS->getRawDeclaration() && 581*9880d681SAndroid Build Coastguard Worker Variables == RHS->getRawVariables(); 582*9880d681SAndroid Build Coastguard Worker } 583*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 584*9880d681SAndroid Build Coastguard Worker // If this is a declaration inside an ODR type, only hash the type and the 585*9880d681SAndroid Build Coastguard Worker // name. Otherwise the hash will be stronger than 586*9880d681SAndroid Build Coastguard Worker // MDNodeSubsetEqualImpl::isDeclarationOfODRMember(). 587*9880d681SAndroid Build Coastguard Worker if (!IsDefinition && LinkageName) 588*9880d681SAndroid Build Coastguard Worker if (auto *CT = dyn_cast_or_null<DICompositeType>(Scope)) 589*9880d681SAndroid Build Coastguard Worker if (CT->getRawIdentifier()) 590*9880d681SAndroid Build Coastguard Worker return hash_combine(LinkageName, Scope); 591*9880d681SAndroid Build Coastguard Worker 592*9880d681SAndroid Build Coastguard Worker // Intentionally computes the hash on a subset of the operands for 593*9880d681SAndroid Build Coastguard Worker // performance reason. The subset has to be significant enough to avoid 594*9880d681SAndroid Build Coastguard Worker // collision "most of the time". There is no correctness issue in case of 595*9880d681SAndroid Build Coastguard Worker // collision because of the full check above. 596*9880d681SAndroid Build Coastguard Worker return hash_combine(Name, Scope, File, Type, Line); 597*9880d681SAndroid Build Coastguard Worker } 598*9880d681SAndroid Build Coastguard Worker }; 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeSubsetEqualImpl<DISubprogram> { 601*9880d681SAndroid Build Coastguard Worker typedef MDNodeKeyImpl<DISubprogram> KeyTy; 602*9880d681SAndroid Build Coastguard Worker static bool isSubsetEqual(const KeyTy &LHS, const DISubprogram *RHS) { 603*9880d681SAndroid Build Coastguard Worker return isDeclarationOfODRMember(LHS.IsDefinition, LHS.Scope, 604*9880d681SAndroid Build Coastguard Worker LHS.LinkageName, RHS); 605*9880d681SAndroid Build Coastguard Worker } 606*9880d681SAndroid Build Coastguard Worker static bool isSubsetEqual(const DISubprogram *LHS, const DISubprogram *RHS) { 607*9880d681SAndroid Build Coastguard Worker return isDeclarationOfODRMember(LHS->isDefinition(), LHS->getRawScope(), 608*9880d681SAndroid Build Coastguard Worker LHS->getRawLinkageName(), RHS); 609*9880d681SAndroid Build Coastguard Worker } 610*9880d681SAndroid Build Coastguard Worker 611*9880d681SAndroid Build Coastguard Worker /// Subprograms compare equal if they declare the same function in an ODR 612*9880d681SAndroid Build Coastguard Worker /// type. 613*9880d681SAndroid Build Coastguard Worker static bool isDeclarationOfODRMember(bool IsDefinition, const Metadata *Scope, 614*9880d681SAndroid Build Coastguard Worker const MDString *LinkageName, 615*9880d681SAndroid Build Coastguard Worker const DISubprogram *RHS) { 616*9880d681SAndroid Build Coastguard Worker // Check whether the LHS is eligible. 617*9880d681SAndroid Build Coastguard Worker if (IsDefinition || !Scope || !LinkageName) 618*9880d681SAndroid Build Coastguard Worker return false; 619*9880d681SAndroid Build Coastguard Worker 620*9880d681SAndroid Build Coastguard Worker auto *CT = dyn_cast_or_null<DICompositeType>(Scope); 621*9880d681SAndroid Build Coastguard Worker if (!CT || !CT->getRawIdentifier()) 622*9880d681SAndroid Build Coastguard Worker return false; 623*9880d681SAndroid Build Coastguard Worker 624*9880d681SAndroid Build Coastguard Worker // Compare to the RHS. 625*9880d681SAndroid Build Coastguard Worker return IsDefinition == RHS->isDefinition() && Scope == RHS->getRawScope() && 626*9880d681SAndroid Build Coastguard Worker LinkageName == RHS->getRawLinkageName(); 627*9880d681SAndroid Build Coastguard Worker } 628*9880d681SAndroid Build Coastguard Worker }; 629*9880d681SAndroid Build Coastguard Worker 630*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DILexicalBlock> { 631*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 632*9880d681SAndroid Build Coastguard Worker Metadata *File; 633*9880d681SAndroid Build Coastguard Worker unsigned Line; 634*9880d681SAndroid Build Coastguard Worker unsigned Column; 635*9880d681SAndroid Build Coastguard Worker 636*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(Metadata *Scope, Metadata *File, unsigned Line, unsigned Column) 637*9880d681SAndroid Build Coastguard Worker : Scope(Scope), File(File), Line(Line), Column(Column) {} 638*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DILexicalBlock *N) 639*9880d681SAndroid Build Coastguard Worker : Scope(N->getRawScope()), File(N->getRawFile()), Line(N->getLine()), 640*9880d681SAndroid Build Coastguard Worker Column(N->getColumn()) {} 641*9880d681SAndroid Build Coastguard Worker 642*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DILexicalBlock *RHS) const { 643*9880d681SAndroid Build Coastguard Worker return Scope == RHS->getRawScope() && File == RHS->getRawFile() && 644*9880d681SAndroid Build Coastguard Worker Line == RHS->getLine() && Column == RHS->getColumn(); 645*9880d681SAndroid Build Coastguard Worker } 646*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 647*9880d681SAndroid Build Coastguard Worker return hash_combine(Scope, File, Line, Column); 648*9880d681SAndroid Build Coastguard Worker } 649*9880d681SAndroid Build Coastguard Worker }; 650*9880d681SAndroid Build Coastguard Worker 651*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DILexicalBlockFile> { 652*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 653*9880d681SAndroid Build Coastguard Worker Metadata *File; 654*9880d681SAndroid Build Coastguard Worker unsigned Discriminator; 655*9880d681SAndroid Build Coastguard Worker 656*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(Metadata *Scope, Metadata *File, unsigned Discriminator) 657*9880d681SAndroid Build Coastguard Worker : Scope(Scope), File(File), Discriminator(Discriminator) {} 658*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DILexicalBlockFile *N) 659*9880d681SAndroid Build Coastguard Worker : Scope(N->getRawScope()), File(N->getRawFile()), 660*9880d681SAndroid Build Coastguard Worker Discriminator(N->getDiscriminator()) {} 661*9880d681SAndroid Build Coastguard Worker 662*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DILexicalBlockFile *RHS) const { 663*9880d681SAndroid Build Coastguard Worker return Scope == RHS->getRawScope() && File == RHS->getRawFile() && 664*9880d681SAndroid Build Coastguard Worker Discriminator == RHS->getDiscriminator(); 665*9880d681SAndroid Build Coastguard Worker } 666*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 667*9880d681SAndroid Build Coastguard Worker return hash_combine(Scope, File, Discriminator); 668*9880d681SAndroid Build Coastguard Worker } 669*9880d681SAndroid Build Coastguard Worker }; 670*9880d681SAndroid Build Coastguard Worker 671*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DINamespace> { 672*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 673*9880d681SAndroid Build Coastguard Worker Metadata *File; 674*9880d681SAndroid Build Coastguard Worker MDString *Name; 675*9880d681SAndroid Build Coastguard Worker unsigned Line; 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(Metadata *Scope, Metadata *File, MDString *Name, unsigned Line) 678*9880d681SAndroid Build Coastguard Worker : Scope(Scope), File(File), Name(Name), Line(Line) {} 679*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DINamespace *N) 680*9880d681SAndroid Build Coastguard Worker : Scope(N->getRawScope()), File(N->getRawFile()), Name(N->getRawName()), 681*9880d681SAndroid Build Coastguard Worker Line(N->getLine()) {} 682*9880d681SAndroid Build Coastguard Worker 683*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DINamespace *RHS) const { 684*9880d681SAndroid Build Coastguard Worker return Scope == RHS->getRawScope() && File == RHS->getRawFile() && 685*9880d681SAndroid Build Coastguard Worker Name == RHS->getRawName() && Line == RHS->getLine(); 686*9880d681SAndroid Build Coastguard Worker } 687*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 688*9880d681SAndroid Build Coastguard Worker return hash_combine(Scope, File, Name, Line); 689*9880d681SAndroid Build Coastguard Worker } 690*9880d681SAndroid Build Coastguard Worker }; 691*9880d681SAndroid Build Coastguard Worker 692*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIModule> { 693*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 694*9880d681SAndroid Build Coastguard Worker MDString *Name; 695*9880d681SAndroid Build Coastguard Worker MDString *ConfigurationMacros; 696*9880d681SAndroid Build Coastguard Worker MDString *IncludePath; 697*9880d681SAndroid Build Coastguard Worker MDString *ISysRoot; 698*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(Metadata *Scope, MDString *Name, MDString *ConfigurationMacros, 699*9880d681SAndroid Build Coastguard Worker MDString *IncludePath, MDString *ISysRoot) 700*9880d681SAndroid Build Coastguard Worker : Scope(Scope), Name(Name), ConfigurationMacros(ConfigurationMacros), 701*9880d681SAndroid Build Coastguard Worker IncludePath(IncludePath), ISysRoot(ISysRoot) {} 702*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIModule *N) 703*9880d681SAndroid Build Coastguard Worker : Scope(N->getRawScope()), Name(N->getRawName()), 704*9880d681SAndroid Build Coastguard Worker ConfigurationMacros(N->getRawConfigurationMacros()), 705*9880d681SAndroid Build Coastguard Worker IncludePath(N->getRawIncludePath()), ISysRoot(N->getRawISysRoot()) {} 706*9880d681SAndroid Build Coastguard Worker 707*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIModule *RHS) const { 708*9880d681SAndroid Build Coastguard Worker return Scope == RHS->getRawScope() && Name == RHS->getRawName() && 709*9880d681SAndroid Build Coastguard Worker ConfigurationMacros == RHS->getRawConfigurationMacros() && 710*9880d681SAndroid Build Coastguard Worker IncludePath == RHS->getRawIncludePath() && 711*9880d681SAndroid Build Coastguard Worker ISysRoot == RHS->getRawISysRoot(); 712*9880d681SAndroid Build Coastguard Worker } 713*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 714*9880d681SAndroid Build Coastguard Worker return hash_combine(Scope, Name, 715*9880d681SAndroid Build Coastguard Worker ConfigurationMacros, IncludePath, ISysRoot); 716*9880d681SAndroid Build Coastguard Worker } 717*9880d681SAndroid Build Coastguard Worker }; 718*9880d681SAndroid Build Coastguard Worker 719*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DITemplateTypeParameter> { 720*9880d681SAndroid Build Coastguard Worker MDString *Name; 721*9880d681SAndroid Build Coastguard Worker Metadata *Type; 722*9880d681SAndroid Build Coastguard Worker 723*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(MDString *Name, Metadata *Type) : Name(Name), Type(Type) {} 724*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DITemplateTypeParameter *N) 725*9880d681SAndroid Build Coastguard Worker : Name(N->getRawName()), Type(N->getRawType()) {} 726*9880d681SAndroid Build Coastguard Worker 727*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DITemplateTypeParameter *RHS) const { 728*9880d681SAndroid Build Coastguard Worker return Name == RHS->getRawName() && Type == RHS->getRawType(); 729*9880d681SAndroid Build Coastguard Worker } 730*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { return hash_combine(Name, Type); } 731*9880d681SAndroid Build Coastguard Worker }; 732*9880d681SAndroid Build Coastguard Worker 733*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DITemplateValueParameter> { 734*9880d681SAndroid Build Coastguard Worker unsigned Tag; 735*9880d681SAndroid Build Coastguard Worker MDString *Name; 736*9880d681SAndroid Build Coastguard Worker Metadata *Type; 737*9880d681SAndroid Build Coastguard Worker Metadata *Value; 738*9880d681SAndroid Build Coastguard Worker 739*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned Tag, MDString *Name, Metadata *Type, Metadata *Value) 740*9880d681SAndroid Build Coastguard Worker : Tag(Tag), Name(Name), Type(Type), Value(Value) {} 741*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DITemplateValueParameter *N) 742*9880d681SAndroid Build Coastguard Worker : Tag(N->getTag()), Name(N->getRawName()), Type(N->getRawType()), 743*9880d681SAndroid Build Coastguard Worker Value(N->getValue()) {} 744*9880d681SAndroid Build Coastguard Worker 745*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DITemplateValueParameter *RHS) const { 746*9880d681SAndroid Build Coastguard Worker return Tag == RHS->getTag() && Name == RHS->getRawName() && 747*9880d681SAndroid Build Coastguard Worker Type == RHS->getRawType() && Value == RHS->getValue(); 748*9880d681SAndroid Build Coastguard Worker } 749*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { return hash_combine(Tag, Name, Type, Value); } 750*9880d681SAndroid Build Coastguard Worker }; 751*9880d681SAndroid Build Coastguard Worker 752*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIGlobalVariable> { 753*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 754*9880d681SAndroid Build Coastguard Worker MDString *Name; 755*9880d681SAndroid Build Coastguard Worker MDString *LinkageName; 756*9880d681SAndroid Build Coastguard Worker Metadata *File; 757*9880d681SAndroid Build Coastguard Worker unsigned Line; 758*9880d681SAndroid Build Coastguard Worker Metadata *Type; 759*9880d681SAndroid Build Coastguard Worker bool IsLocalToUnit; 760*9880d681SAndroid Build Coastguard Worker bool IsDefinition; 761*9880d681SAndroid Build Coastguard Worker Metadata *Variable; 762*9880d681SAndroid Build Coastguard Worker Metadata *StaticDataMemberDeclaration; 763*9880d681SAndroid Build Coastguard Worker 764*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(Metadata *Scope, MDString *Name, MDString *LinkageName, 765*9880d681SAndroid Build Coastguard Worker Metadata *File, unsigned Line, Metadata *Type, 766*9880d681SAndroid Build Coastguard Worker bool IsLocalToUnit, bool IsDefinition, Metadata *Variable, 767*9880d681SAndroid Build Coastguard Worker Metadata *StaticDataMemberDeclaration) 768*9880d681SAndroid Build Coastguard Worker : Scope(Scope), Name(Name), LinkageName(LinkageName), File(File), 769*9880d681SAndroid Build Coastguard Worker Line(Line), Type(Type), IsLocalToUnit(IsLocalToUnit), 770*9880d681SAndroid Build Coastguard Worker IsDefinition(IsDefinition), Variable(Variable), 771*9880d681SAndroid Build Coastguard Worker StaticDataMemberDeclaration(StaticDataMemberDeclaration) {} 772*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIGlobalVariable *N) 773*9880d681SAndroid Build Coastguard Worker : Scope(N->getRawScope()), Name(N->getRawName()), 774*9880d681SAndroid Build Coastguard Worker LinkageName(N->getRawLinkageName()), File(N->getRawFile()), 775*9880d681SAndroid Build Coastguard Worker Line(N->getLine()), Type(N->getRawType()), 776*9880d681SAndroid Build Coastguard Worker IsLocalToUnit(N->isLocalToUnit()), IsDefinition(N->isDefinition()), 777*9880d681SAndroid Build Coastguard Worker Variable(N->getRawVariable()), 778*9880d681SAndroid Build Coastguard Worker StaticDataMemberDeclaration(N->getRawStaticDataMemberDeclaration()) {} 779*9880d681SAndroid Build Coastguard Worker 780*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIGlobalVariable *RHS) const { 781*9880d681SAndroid Build Coastguard Worker return Scope == RHS->getRawScope() && Name == RHS->getRawName() && 782*9880d681SAndroid Build Coastguard Worker LinkageName == RHS->getRawLinkageName() && 783*9880d681SAndroid Build Coastguard Worker File == RHS->getRawFile() && Line == RHS->getLine() && 784*9880d681SAndroid Build Coastguard Worker Type == RHS->getRawType() && IsLocalToUnit == RHS->isLocalToUnit() && 785*9880d681SAndroid Build Coastguard Worker IsDefinition == RHS->isDefinition() && 786*9880d681SAndroid Build Coastguard Worker Variable == RHS->getRawVariable() && 787*9880d681SAndroid Build Coastguard Worker StaticDataMemberDeclaration == 788*9880d681SAndroid Build Coastguard Worker RHS->getRawStaticDataMemberDeclaration(); 789*9880d681SAndroid Build Coastguard Worker } 790*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 791*9880d681SAndroid Build Coastguard Worker return hash_combine(Scope, Name, LinkageName, File, Line, Type, 792*9880d681SAndroid Build Coastguard Worker IsLocalToUnit, IsDefinition, Variable, 793*9880d681SAndroid Build Coastguard Worker StaticDataMemberDeclaration); 794*9880d681SAndroid Build Coastguard Worker } 795*9880d681SAndroid Build Coastguard Worker }; 796*9880d681SAndroid Build Coastguard Worker 797*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DILocalVariable> { 798*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 799*9880d681SAndroid Build Coastguard Worker MDString *Name; 800*9880d681SAndroid Build Coastguard Worker Metadata *File; 801*9880d681SAndroid Build Coastguard Worker unsigned Line; 802*9880d681SAndroid Build Coastguard Worker Metadata *Type; 803*9880d681SAndroid Build Coastguard Worker unsigned Arg; 804*9880d681SAndroid Build Coastguard Worker unsigned Flags; 805*9880d681SAndroid Build Coastguard Worker 806*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(Metadata *Scope, MDString *Name, Metadata *File, unsigned Line, 807*9880d681SAndroid Build Coastguard Worker Metadata *Type, unsigned Arg, unsigned Flags) 808*9880d681SAndroid Build Coastguard Worker : Scope(Scope), Name(Name), File(File), Line(Line), Type(Type), Arg(Arg), 809*9880d681SAndroid Build Coastguard Worker Flags(Flags) {} 810*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DILocalVariable *N) 811*9880d681SAndroid Build Coastguard Worker : Scope(N->getRawScope()), Name(N->getRawName()), File(N->getRawFile()), 812*9880d681SAndroid Build Coastguard Worker Line(N->getLine()), Type(N->getRawType()), Arg(N->getArg()), 813*9880d681SAndroid Build Coastguard Worker Flags(N->getFlags()) {} 814*9880d681SAndroid Build Coastguard Worker 815*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DILocalVariable *RHS) const { 816*9880d681SAndroid Build Coastguard Worker return Scope == RHS->getRawScope() && Name == RHS->getRawName() && 817*9880d681SAndroid Build Coastguard Worker File == RHS->getRawFile() && Line == RHS->getLine() && 818*9880d681SAndroid Build Coastguard Worker Type == RHS->getRawType() && Arg == RHS->getArg() && 819*9880d681SAndroid Build Coastguard Worker Flags == RHS->getFlags(); 820*9880d681SAndroid Build Coastguard Worker } 821*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 822*9880d681SAndroid Build Coastguard Worker return hash_combine(Scope, Name, File, Line, Type, Arg, Flags); 823*9880d681SAndroid Build Coastguard Worker } 824*9880d681SAndroid Build Coastguard Worker }; 825*9880d681SAndroid Build Coastguard Worker 826*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIExpression> { 827*9880d681SAndroid Build Coastguard Worker ArrayRef<uint64_t> Elements; 828*9880d681SAndroid Build Coastguard Worker 829*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(ArrayRef<uint64_t> Elements) : Elements(Elements) {} 830*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIExpression *N) : Elements(N->getElements()) {} 831*9880d681SAndroid Build Coastguard Worker 832*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIExpression *RHS) const { 833*9880d681SAndroid Build Coastguard Worker return Elements == RHS->getElements(); 834*9880d681SAndroid Build Coastguard Worker } 835*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 836*9880d681SAndroid Build Coastguard Worker return hash_combine_range(Elements.begin(), Elements.end()); 837*9880d681SAndroid Build Coastguard Worker } 838*9880d681SAndroid Build Coastguard Worker }; 839*9880d681SAndroid Build Coastguard Worker 840*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIObjCProperty> { 841*9880d681SAndroid Build Coastguard Worker MDString *Name; 842*9880d681SAndroid Build Coastguard Worker Metadata *File; 843*9880d681SAndroid Build Coastguard Worker unsigned Line; 844*9880d681SAndroid Build Coastguard Worker MDString *GetterName; 845*9880d681SAndroid Build Coastguard Worker MDString *SetterName; 846*9880d681SAndroid Build Coastguard Worker unsigned Attributes; 847*9880d681SAndroid Build Coastguard Worker Metadata *Type; 848*9880d681SAndroid Build Coastguard Worker 849*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(MDString *Name, Metadata *File, unsigned Line, 850*9880d681SAndroid Build Coastguard Worker MDString *GetterName, MDString *SetterName, unsigned Attributes, 851*9880d681SAndroid Build Coastguard Worker Metadata *Type) 852*9880d681SAndroid Build Coastguard Worker : Name(Name), File(File), Line(Line), GetterName(GetterName), 853*9880d681SAndroid Build Coastguard Worker SetterName(SetterName), Attributes(Attributes), Type(Type) {} 854*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIObjCProperty *N) 855*9880d681SAndroid Build Coastguard Worker : Name(N->getRawName()), File(N->getRawFile()), Line(N->getLine()), 856*9880d681SAndroid Build Coastguard Worker GetterName(N->getRawGetterName()), SetterName(N->getRawSetterName()), 857*9880d681SAndroid Build Coastguard Worker Attributes(N->getAttributes()), Type(N->getRawType()) {} 858*9880d681SAndroid Build Coastguard Worker 859*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIObjCProperty *RHS) const { 860*9880d681SAndroid Build Coastguard Worker return Name == RHS->getRawName() && File == RHS->getRawFile() && 861*9880d681SAndroid Build Coastguard Worker Line == RHS->getLine() && GetterName == RHS->getRawGetterName() && 862*9880d681SAndroid Build Coastguard Worker SetterName == RHS->getRawSetterName() && 863*9880d681SAndroid Build Coastguard Worker Attributes == RHS->getAttributes() && Type == RHS->getRawType(); 864*9880d681SAndroid Build Coastguard Worker } 865*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 866*9880d681SAndroid Build Coastguard Worker return hash_combine(Name, File, Line, GetterName, SetterName, Attributes, 867*9880d681SAndroid Build Coastguard Worker Type); 868*9880d681SAndroid Build Coastguard Worker } 869*9880d681SAndroid Build Coastguard Worker }; 870*9880d681SAndroid Build Coastguard Worker 871*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIImportedEntity> { 872*9880d681SAndroid Build Coastguard Worker unsigned Tag; 873*9880d681SAndroid Build Coastguard Worker Metadata *Scope; 874*9880d681SAndroid Build Coastguard Worker Metadata *Entity; 875*9880d681SAndroid Build Coastguard Worker unsigned Line; 876*9880d681SAndroid Build Coastguard Worker MDString *Name; 877*9880d681SAndroid Build Coastguard Worker 878*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned Tag, Metadata *Scope, Metadata *Entity, unsigned Line, 879*9880d681SAndroid Build Coastguard Worker MDString *Name) 880*9880d681SAndroid Build Coastguard Worker : Tag(Tag), Scope(Scope), Entity(Entity), Line(Line), Name(Name) {} 881*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIImportedEntity *N) 882*9880d681SAndroid Build Coastguard Worker : Tag(N->getTag()), Scope(N->getRawScope()), Entity(N->getRawEntity()), 883*9880d681SAndroid Build Coastguard Worker Line(N->getLine()), Name(N->getRawName()) {} 884*9880d681SAndroid Build Coastguard Worker 885*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIImportedEntity *RHS) const { 886*9880d681SAndroid Build Coastguard Worker return Tag == RHS->getTag() && Scope == RHS->getRawScope() && 887*9880d681SAndroid Build Coastguard Worker Entity == RHS->getRawEntity() && Line == RHS->getLine() && 888*9880d681SAndroid Build Coastguard Worker Name == RHS->getRawName(); 889*9880d681SAndroid Build Coastguard Worker } 890*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 891*9880d681SAndroid Build Coastguard Worker return hash_combine(Tag, Scope, Entity, Line, Name); 892*9880d681SAndroid Build Coastguard Worker } 893*9880d681SAndroid Build Coastguard Worker }; 894*9880d681SAndroid Build Coastguard Worker 895*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIMacro> { 896*9880d681SAndroid Build Coastguard Worker unsigned MIType; 897*9880d681SAndroid Build Coastguard Worker unsigned Line; 898*9880d681SAndroid Build Coastguard Worker MDString *Name; 899*9880d681SAndroid Build Coastguard Worker MDString *Value; 900*9880d681SAndroid Build Coastguard Worker 901*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned MIType, unsigned Line, MDString *Name, MDString *Value) 902*9880d681SAndroid Build Coastguard Worker : MIType(MIType), Line(Line), Name(Name), Value(Value) {} 903*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIMacro *N) 904*9880d681SAndroid Build Coastguard Worker : MIType(N->getMacinfoType()), Line(N->getLine()), Name(N->getRawName()), 905*9880d681SAndroid Build Coastguard Worker Value(N->getRawValue()) {} 906*9880d681SAndroid Build Coastguard Worker 907*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIMacro *RHS) const { 908*9880d681SAndroid Build Coastguard Worker return MIType == RHS->getMacinfoType() && Line == RHS->getLine() && 909*9880d681SAndroid Build Coastguard Worker Name == RHS->getRawName() && Value == RHS->getRawValue(); 910*9880d681SAndroid Build Coastguard Worker } 911*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 912*9880d681SAndroid Build Coastguard Worker return hash_combine(MIType, Line, Name, Value); 913*9880d681SAndroid Build Coastguard Worker } 914*9880d681SAndroid Build Coastguard Worker }; 915*9880d681SAndroid Build Coastguard Worker 916*9880d681SAndroid Build Coastguard Worker template <> struct MDNodeKeyImpl<DIMacroFile> { 917*9880d681SAndroid Build Coastguard Worker unsigned MIType; 918*9880d681SAndroid Build Coastguard Worker unsigned Line; 919*9880d681SAndroid Build Coastguard Worker Metadata *File; 920*9880d681SAndroid Build Coastguard Worker Metadata *Elements; 921*9880d681SAndroid Build Coastguard Worker 922*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(unsigned MIType, unsigned Line, Metadata *File, 923*9880d681SAndroid Build Coastguard Worker Metadata *Elements) 924*9880d681SAndroid Build Coastguard Worker : MIType(MIType), Line(Line), File(File), Elements(Elements) {} 925*9880d681SAndroid Build Coastguard Worker MDNodeKeyImpl(const DIMacroFile *N) 926*9880d681SAndroid Build Coastguard Worker : MIType(N->getMacinfoType()), Line(N->getLine()), File(N->getRawFile()), 927*9880d681SAndroid Build Coastguard Worker Elements(N->getRawElements()) {} 928*9880d681SAndroid Build Coastguard Worker 929*9880d681SAndroid Build Coastguard Worker bool isKeyOf(const DIMacroFile *RHS) const { 930*9880d681SAndroid Build Coastguard Worker return MIType == RHS->getMacinfoType() && Line == RHS->getLine() && 931*9880d681SAndroid Build Coastguard Worker File == RHS->getRawFile() && File == RHS->getRawElements(); 932*9880d681SAndroid Build Coastguard Worker } 933*9880d681SAndroid Build Coastguard Worker unsigned getHashValue() const { 934*9880d681SAndroid Build Coastguard Worker return hash_combine(MIType, Line, File, Elements); 935*9880d681SAndroid Build Coastguard Worker } 936*9880d681SAndroid Build Coastguard Worker }; 937*9880d681SAndroid Build Coastguard Worker 938*9880d681SAndroid Build Coastguard Worker /// \brief DenseMapInfo for MDNode subclasses. 939*9880d681SAndroid Build Coastguard Worker template <class NodeTy> struct MDNodeInfo { 940*9880d681SAndroid Build Coastguard Worker typedef MDNodeKeyImpl<NodeTy> KeyTy; 941*9880d681SAndroid Build Coastguard Worker typedef MDNodeSubsetEqualImpl<NodeTy> SubsetEqualTy; 942*9880d681SAndroid Build Coastguard Worker static inline NodeTy *getEmptyKey() { 943*9880d681SAndroid Build Coastguard Worker return DenseMapInfo<NodeTy *>::getEmptyKey(); 944*9880d681SAndroid Build Coastguard Worker } 945*9880d681SAndroid Build Coastguard Worker static inline NodeTy *getTombstoneKey() { 946*9880d681SAndroid Build Coastguard Worker return DenseMapInfo<NodeTy *>::getTombstoneKey(); 947*9880d681SAndroid Build Coastguard Worker } 948*9880d681SAndroid Build Coastguard Worker static unsigned getHashValue(const KeyTy &Key) { return Key.getHashValue(); } 949*9880d681SAndroid Build Coastguard Worker static unsigned getHashValue(const NodeTy *N) { 950*9880d681SAndroid Build Coastguard Worker return KeyTy(N).getHashValue(); 951*9880d681SAndroid Build Coastguard Worker } 952*9880d681SAndroid Build Coastguard Worker static bool isEqual(const KeyTy &LHS, const NodeTy *RHS) { 953*9880d681SAndroid Build Coastguard Worker if (RHS == getEmptyKey() || RHS == getTombstoneKey()) 954*9880d681SAndroid Build Coastguard Worker return false; 955*9880d681SAndroid Build Coastguard Worker return SubsetEqualTy::isSubsetEqual(LHS, RHS) || LHS.isKeyOf(RHS); 956*9880d681SAndroid Build Coastguard Worker } 957*9880d681SAndroid Build Coastguard Worker static bool isEqual(const NodeTy *LHS, const NodeTy *RHS) { 958*9880d681SAndroid Build Coastguard Worker if (LHS == RHS) 959*9880d681SAndroid Build Coastguard Worker return true; 960*9880d681SAndroid Build Coastguard Worker if (RHS == getEmptyKey() || RHS == getTombstoneKey()) 961*9880d681SAndroid Build Coastguard Worker return false; 962*9880d681SAndroid Build Coastguard Worker return SubsetEqualTy::isSubsetEqual(LHS, RHS); 963*9880d681SAndroid Build Coastguard Worker } 964*9880d681SAndroid Build Coastguard Worker }; 965*9880d681SAndroid Build Coastguard Worker 966*9880d681SAndroid Build Coastguard Worker #define HANDLE_MDNODE_LEAF(CLASS) typedef MDNodeInfo<CLASS> CLASS##Info; 967*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.def" 968*9880d681SAndroid Build Coastguard Worker 969*9880d681SAndroid Build Coastguard Worker /// \brief Map-like storage for metadata attachments. 970*9880d681SAndroid Build Coastguard Worker class MDAttachmentMap { 971*9880d681SAndroid Build Coastguard Worker SmallVector<std::pair<unsigned, TrackingMDNodeRef>, 2> Attachments; 972*9880d681SAndroid Build Coastguard Worker 973*9880d681SAndroid Build Coastguard Worker public: 974*9880d681SAndroid Build Coastguard Worker bool empty() const { return Attachments.empty(); } 975*9880d681SAndroid Build Coastguard Worker size_t size() const { return Attachments.size(); } 976*9880d681SAndroid Build Coastguard Worker 977*9880d681SAndroid Build Coastguard Worker /// \brief Get a particular attachment (if any). 978*9880d681SAndroid Build Coastguard Worker MDNode *lookup(unsigned ID) const; 979*9880d681SAndroid Build Coastguard Worker 980*9880d681SAndroid Build Coastguard Worker /// \brief Set an attachment to a particular node. 981*9880d681SAndroid Build Coastguard Worker /// 982*9880d681SAndroid Build Coastguard Worker /// Set the \c ID attachment to \c MD, replacing the current attachment at \c 983*9880d681SAndroid Build Coastguard Worker /// ID (if anyway). 984*9880d681SAndroid Build Coastguard Worker void set(unsigned ID, MDNode &MD); 985*9880d681SAndroid Build Coastguard Worker 986*9880d681SAndroid Build Coastguard Worker /// \brief Remove an attachment. 987*9880d681SAndroid Build Coastguard Worker /// 988*9880d681SAndroid Build Coastguard Worker /// Remove the attachment at \c ID, if any. 989*9880d681SAndroid Build Coastguard Worker void erase(unsigned ID); 990*9880d681SAndroid Build Coastguard Worker 991*9880d681SAndroid Build Coastguard Worker /// \brief Copy out all the attachments. 992*9880d681SAndroid Build Coastguard Worker /// 993*9880d681SAndroid Build Coastguard Worker /// Copies all the current attachments into \c Result, sorting by attachment 994*9880d681SAndroid Build Coastguard Worker /// ID. This function does \em not clear \c Result. 995*9880d681SAndroid Build Coastguard Worker void getAll(SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const; 996*9880d681SAndroid Build Coastguard Worker 997*9880d681SAndroid Build Coastguard Worker /// \brief Erase matching attachments. 998*9880d681SAndroid Build Coastguard Worker /// 999*9880d681SAndroid Build Coastguard Worker /// Erases all attachments matching the \c shouldRemove predicate. 1000*9880d681SAndroid Build Coastguard Worker template <class PredTy> void remove_if(PredTy shouldRemove) { 1001*9880d681SAndroid Build Coastguard Worker Attachments.erase( 1002*9880d681SAndroid Build Coastguard Worker std::remove_if(Attachments.begin(), Attachments.end(), shouldRemove), 1003*9880d681SAndroid Build Coastguard Worker Attachments.end()); 1004*9880d681SAndroid Build Coastguard Worker } 1005*9880d681SAndroid Build Coastguard Worker }; 1006*9880d681SAndroid Build Coastguard Worker 1007*9880d681SAndroid Build Coastguard Worker /// Multimap-like storage for metadata attachments for globals. This differs 1008*9880d681SAndroid Build Coastguard Worker /// from MDAttachmentMap in that it allows multiple attachments per metadata 1009*9880d681SAndroid Build Coastguard Worker /// kind. 1010*9880d681SAndroid Build Coastguard Worker class MDGlobalAttachmentMap { 1011*9880d681SAndroid Build Coastguard Worker struct Attachment { 1012*9880d681SAndroid Build Coastguard Worker unsigned MDKind; 1013*9880d681SAndroid Build Coastguard Worker TrackingMDNodeRef Node; 1014*9880d681SAndroid Build Coastguard Worker }; 1015*9880d681SAndroid Build Coastguard Worker SmallVector<Attachment, 1> Attachments; 1016*9880d681SAndroid Build Coastguard Worker 1017*9880d681SAndroid Build Coastguard Worker public: 1018*9880d681SAndroid Build Coastguard Worker bool empty() const { return Attachments.empty(); } 1019*9880d681SAndroid Build Coastguard Worker 1020*9880d681SAndroid Build Coastguard Worker /// Appends all attachments with the given ID to \c Result in insertion order. 1021*9880d681SAndroid Build Coastguard Worker /// If the global has no attachments with the given ID, or if ID is invalid, 1022*9880d681SAndroid Build Coastguard Worker /// leaves Result unchanged. 1023*9880d681SAndroid Build Coastguard Worker void get(unsigned ID, SmallVectorImpl<MDNode *> &Result); 1024*9880d681SAndroid Build Coastguard Worker 1025*9880d681SAndroid Build Coastguard Worker void insert(unsigned ID, MDNode &MD); 1026*9880d681SAndroid Build Coastguard Worker void erase(unsigned ID); 1027*9880d681SAndroid Build Coastguard Worker 1028*9880d681SAndroid Build Coastguard Worker /// Appends all attachments for the global to \c Result, sorting by attachment 1029*9880d681SAndroid Build Coastguard Worker /// ID. Attachments with the same ID appear in insertion order. This function 1030*9880d681SAndroid Build Coastguard Worker /// does \em not clear \c Result. 1031*9880d681SAndroid Build Coastguard Worker void getAll(SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const; 1032*9880d681SAndroid Build Coastguard Worker }; 1033*9880d681SAndroid Build Coastguard Worker 1034*9880d681SAndroid Build Coastguard Worker class LLVMContextImpl { 1035*9880d681SAndroid Build Coastguard Worker public: 1036*9880d681SAndroid Build Coastguard Worker /// OwnedModules - The set of modules instantiated in this context, and which 1037*9880d681SAndroid Build Coastguard Worker /// will be automatically deleted if this context is deleted. 1038*9880d681SAndroid Build Coastguard Worker SmallPtrSet<Module*, 4> OwnedModules; 1039*9880d681SAndroid Build Coastguard Worker 1040*9880d681SAndroid Build Coastguard Worker LLVMContext::InlineAsmDiagHandlerTy InlineAsmDiagHandler; 1041*9880d681SAndroid Build Coastguard Worker void *InlineAsmDiagContext; 1042*9880d681SAndroid Build Coastguard Worker 1043*9880d681SAndroid Build Coastguard Worker LLVMContext::DiagnosticHandlerTy DiagnosticHandler; 1044*9880d681SAndroid Build Coastguard Worker void *DiagnosticContext; 1045*9880d681SAndroid Build Coastguard Worker bool RespectDiagnosticFilters; 1046*9880d681SAndroid Build Coastguard Worker 1047*9880d681SAndroid Build Coastguard Worker LLVMContext::YieldCallbackTy YieldCallback; 1048*9880d681SAndroid Build Coastguard Worker void *YieldOpaqueHandle; 1049*9880d681SAndroid Build Coastguard Worker 1050*9880d681SAndroid Build Coastguard Worker typedef DenseMap<APInt, ConstantInt *, DenseMapAPIntKeyInfo> IntMapTy; 1051*9880d681SAndroid Build Coastguard Worker IntMapTy IntConstants; 1052*9880d681SAndroid Build Coastguard Worker 1053*9880d681SAndroid Build Coastguard Worker typedef DenseMap<APFloat, ConstantFP *, DenseMapAPFloatKeyInfo> FPMapTy; 1054*9880d681SAndroid Build Coastguard Worker FPMapTy FPConstants; 1055*9880d681SAndroid Build Coastguard Worker 1056*9880d681SAndroid Build Coastguard Worker FoldingSet<AttributeImpl> AttrsSet; 1057*9880d681SAndroid Build Coastguard Worker FoldingSet<AttributeSetImpl> AttrsLists; 1058*9880d681SAndroid Build Coastguard Worker FoldingSet<AttributeSetNode> AttrsSetNodes; 1059*9880d681SAndroid Build Coastguard Worker 1060*9880d681SAndroid Build Coastguard Worker StringMap<MDString, BumpPtrAllocator> MDStringCache; 1061*9880d681SAndroid Build Coastguard Worker DenseMap<Value *, ValueAsMetadata *> ValuesAsMetadata; 1062*9880d681SAndroid Build Coastguard Worker DenseMap<Metadata *, MetadataAsValue *> MetadataAsValues; 1063*9880d681SAndroid Build Coastguard Worker 1064*9880d681SAndroid Build Coastguard Worker DenseMap<const Value*, ValueName*> ValueNames; 1065*9880d681SAndroid Build Coastguard Worker 1066*9880d681SAndroid Build Coastguard Worker #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \ 1067*9880d681SAndroid Build Coastguard Worker DenseSet<CLASS *, CLASS##Info> CLASS##s; 1068*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.def" 1069*9880d681SAndroid Build Coastguard Worker 1070*9880d681SAndroid Build Coastguard Worker // Optional map for looking up composite types by identifier. 1071*9880d681SAndroid Build Coastguard Worker Optional<DenseMap<const MDString *, DICompositeType *>> DITypeMap; 1072*9880d681SAndroid Build Coastguard Worker 1073*9880d681SAndroid Build Coastguard Worker // MDNodes may be uniqued or not uniqued. When they're not uniqued, they 1074*9880d681SAndroid Build Coastguard Worker // aren't in the MDNodeSet, but they're still shared between objects, so no 1075*9880d681SAndroid Build Coastguard Worker // one object can destroy them. Keep track of them here so we can delete 1076*9880d681SAndroid Build Coastguard Worker // them on context teardown. 1077*9880d681SAndroid Build Coastguard Worker std::vector<MDNode *> DistinctMDNodes; 1078*9880d681SAndroid Build Coastguard Worker 1079*9880d681SAndroid Build Coastguard Worker DenseMap<Type*, ConstantAggregateZero*> CAZConstants; 1080*9880d681SAndroid Build Coastguard Worker 1081*9880d681SAndroid Build Coastguard Worker typedef ConstantUniqueMap<ConstantArray> ArrayConstantsTy; 1082*9880d681SAndroid Build Coastguard Worker ArrayConstantsTy ArrayConstants; 1083*9880d681SAndroid Build Coastguard Worker 1084*9880d681SAndroid Build Coastguard Worker typedef ConstantUniqueMap<ConstantStruct> StructConstantsTy; 1085*9880d681SAndroid Build Coastguard Worker StructConstantsTy StructConstants; 1086*9880d681SAndroid Build Coastguard Worker 1087*9880d681SAndroid Build Coastguard Worker typedef ConstantUniqueMap<ConstantVector> VectorConstantsTy; 1088*9880d681SAndroid Build Coastguard Worker VectorConstantsTy VectorConstants; 1089*9880d681SAndroid Build Coastguard Worker 1090*9880d681SAndroid Build Coastguard Worker DenseMap<PointerType*, ConstantPointerNull*> CPNConstants; 1091*9880d681SAndroid Build Coastguard Worker 1092*9880d681SAndroid Build Coastguard Worker DenseMap<Type*, UndefValue*> UVConstants; 1093*9880d681SAndroid Build Coastguard Worker 1094*9880d681SAndroid Build Coastguard Worker StringMap<ConstantDataSequential*> CDSConstants; 1095*9880d681SAndroid Build Coastguard Worker 1096*9880d681SAndroid Build Coastguard Worker DenseMap<std::pair<const Function *, const BasicBlock *>, BlockAddress *> 1097*9880d681SAndroid Build Coastguard Worker BlockAddresses; 1098*9880d681SAndroid Build Coastguard Worker ConstantUniqueMap<ConstantExpr> ExprConstants; 1099*9880d681SAndroid Build Coastguard Worker 1100*9880d681SAndroid Build Coastguard Worker ConstantUniqueMap<InlineAsm> InlineAsms; 1101*9880d681SAndroid Build Coastguard Worker 1102*9880d681SAndroid Build Coastguard Worker ConstantInt *TheTrueVal; 1103*9880d681SAndroid Build Coastguard Worker ConstantInt *TheFalseVal; 1104*9880d681SAndroid Build Coastguard Worker 1105*9880d681SAndroid Build Coastguard Worker std::unique_ptr<ConstantTokenNone> TheNoneToken; 1106*9880d681SAndroid Build Coastguard Worker 1107*9880d681SAndroid Build Coastguard Worker // Basic type instances. 1108*9880d681SAndroid Build Coastguard Worker Type VoidTy, LabelTy, HalfTy, FloatTy, DoubleTy, MetadataTy, TokenTy; 1109*9880d681SAndroid Build Coastguard Worker Type X86_FP80Ty, FP128Ty, PPC_FP128Ty, X86_MMXTy; 1110*9880d681SAndroid Build Coastguard Worker IntegerType Int1Ty, Int8Ty, Int16Ty, Int32Ty, Int64Ty, Int128Ty; 1111*9880d681SAndroid Build Coastguard Worker 1112*9880d681SAndroid Build Coastguard Worker 1113*9880d681SAndroid Build Coastguard Worker /// TypeAllocator - All dynamically allocated types are allocated from this. 1114*9880d681SAndroid Build Coastguard Worker /// They live forever until the context is torn down. 1115*9880d681SAndroid Build Coastguard Worker BumpPtrAllocator TypeAllocator; 1116*9880d681SAndroid Build Coastguard Worker 1117*9880d681SAndroid Build Coastguard Worker DenseMap<unsigned, IntegerType*> IntegerTypes; 1118*9880d681SAndroid Build Coastguard Worker 1119*9880d681SAndroid Build Coastguard Worker typedef DenseSet<FunctionType *, FunctionTypeKeyInfo> FunctionTypeSet; 1120*9880d681SAndroid Build Coastguard Worker FunctionTypeSet FunctionTypes; 1121*9880d681SAndroid Build Coastguard Worker typedef DenseSet<StructType *, AnonStructTypeKeyInfo> StructTypeSet; 1122*9880d681SAndroid Build Coastguard Worker StructTypeSet AnonStructTypes; 1123*9880d681SAndroid Build Coastguard Worker StringMap<StructType*> NamedStructTypes; 1124*9880d681SAndroid Build Coastguard Worker unsigned NamedStructTypesUniqueID; 1125*9880d681SAndroid Build Coastguard Worker 1126*9880d681SAndroid Build Coastguard Worker DenseMap<std::pair<Type *, uint64_t>, ArrayType*> ArrayTypes; 1127*9880d681SAndroid Build Coastguard Worker DenseMap<std::pair<Type *, unsigned>, VectorType*> VectorTypes; 1128*9880d681SAndroid Build Coastguard Worker DenseMap<Type*, PointerType*> PointerTypes; // Pointers in AddrSpace = 0 1129*9880d681SAndroid Build Coastguard Worker DenseMap<std::pair<Type*, unsigned>, PointerType*> ASPointerTypes; 1130*9880d681SAndroid Build Coastguard Worker 1131*9880d681SAndroid Build Coastguard Worker 1132*9880d681SAndroid Build Coastguard Worker /// ValueHandles - This map keeps track of all of the value handles that are 1133*9880d681SAndroid Build Coastguard Worker /// watching a Value*. The Value::HasValueHandle bit is used to know 1134*9880d681SAndroid Build Coastguard Worker /// whether or not a value has an entry in this map. 1135*9880d681SAndroid Build Coastguard Worker typedef DenseMap<Value*, ValueHandleBase*> ValueHandlesTy; 1136*9880d681SAndroid Build Coastguard Worker ValueHandlesTy ValueHandles; 1137*9880d681SAndroid Build Coastguard Worker 1138*9880d681SAndroid Build Coastguard Worker /// CustomMDKindNames - Map to hold the metadata string to ID mapping. 1139*9880d681SAndroid Build Coastguard Worker StringMap<unsigned> CustomMDKindNames; 1140*9880d681SAndroid Build Coastguard Worker 1141*9880d681SAndroid Build Coastguard Worker /// Collection of per-instruction metadata used in this context. 1142*9880d681SAndroid Build Coastguard Worker DenseMap<const Instruction *, MDAttachmentMap> InstructionMetadata; 1143*9880d681SAndroid Build Coastguard Worker 1144*9880d681SAndroid Build Coastguard Worker /// Collection of per-GlobalObject metadata used in this context. 1145*9880d681SAndroid Build Coastguard Worker DenseMap<const GlobalObject *, MDGlobalAttachmentMap> GlobalObjectMetadata; 1146*9880d681SAndroid Build Coastguard Worker 1147*9880d681SAndroid Build Coastguard Worker /// DiscriminatorTable - This table maps file:line locations to an 1148*9880d681SAndroid Build Coastguard Worker /// integer representing the next DWARF path discriminator to assign to 1149*9880d681SAndroid Build Coastguard Worker /// instructions in different blocks at the same location. 1150*9880d681SAndroid Build Coastguard Worker DenseMap<std::pair<const char *, unsigned>, unsigned> DiscriminatorTable; 1151*9880d681SAndroid Build Coastguard Worker 1152*9880d681SAndroid Build Coastguard Worker int getOrAddScopeRecordIdxEntry(MDNode *N, int ExistingIdx); 1153*9880d681SAndroid Build Coastguard Worker int getOrAddScopeInlinedAtIdxEntry(MDNode *Scope, MDNode *IA,int ExistingIdx); 1154*9880d681SAndroid Build Coastguard Worker 1155*9880d681SAndroid Build Coastguard Worker /// \brief A set of interned tags for operand bundles. The StringMap maps 1156*9880d681SAndroid Build Coastguard Worker /// bundle tags to their IDs. 1157*9880d681SAndroid Build Coastguard Worker /// 1158*9880d681SAndroid Build Coastguard Worker /// \see LLVMContext::getOperandBundleTagID 1159*9880d681SAndroid Build Coastguard Worker StringMap<uint32_t> BundleTagCache; 1160*9880d681SAndroid Build Coastguard Worker 1161*9880d681SAndroid Build Coastguard Worker StringMapEntry<uint32_t> *getOrInsertBundleTag(StringRef Tag); 1162*9880d681SAndroid Build Coastguard Worker void getOperandBundleTags(SmallVectorImpl<StringRef> &Tags) const; 1163*9880d681SAndroid Build Coastguard Worker uint32_t getOperandBundleTagID(StringRef Tag) const; 1164*9880d681SAndroid Build Coastguard Worker 1165*9880d681SAndroid Build Coastguard Worker /// Maintain the GC name for each function. 1166*9880d681SAndroid Build Coastguard Worker /// 1167*9880d681SAndroid Build Coastguard Worker /// This saves allocating an additional word in Function for programs which 1168*9880d681SAndroid Build Coastguard Worker /// do not use GC (i.e., most programs) at the cost of increased overhead for 1169*9880d681SAndroid Build Coastguard Worker /// clients which do use GC. 1170*9880d681SAndroid Build Coastguard Worker DenseMap<const Function*, std::string> GCNames; 1171*9880d681SAndroid Build Coastguard Worker 1172*9880d681SAndroid Build Coastguard Worker /// Flag to indicate if Value (other than GlobalValue) retains their name or 1173*9880d681SAndroid Build Coastguard Worker /// not. 1174*9880d681SAndroid Build Coastguard Worker bool DiscardValueNames = false; 1175*9880d681SAndroid Build Coastguard Worker 1176*9880d681SAndroid Build Coastguard Worker LLVMContextImpl(LLVMContext &C); 1177*9880d681SAndroid Build Coastguard Worker ~LLVMContextImpl(); 1178*9880d681SAndroid Build Coastguard Worker 1179*9880d681SAndroid Build Coastguard Worker /// Destroy the ConstantArrays if they are not used. 1180*9880d681SAndroid Build Coastguard Worker void dropTriviallyDeadConstantArrays(); 1181*9880d681SAndroid Build Coastguard Worker 1182*9880d681SAndroid Build Coastguard Worker /// \brief Access the object which manages optimization bisection for failure 1183*9880d681SAndroid Build Coastguard Worker /// analysis. 1184*9880d681SAndroid Build Coastguard Worker OptBisect &getOptBisect(); 1185*9880d681SAndroid Build Coastguard Worker }; 1186*9880d681SAndroid Build Coastguard Worker 1187*9880d681SAndroid Build Coastguard Worker } 1188*9880d681SAndroid Build Coastguard Worker 1189*9880d681SAndroid Build Coastguard Worker #endif 1190