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