1 //===- LLVMContextImpl.h - The LLVMContextImpl opaque class -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file declares LLVMContextImpl, the opaque implementation
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_LIB_IR_LLVMCONTEXTIMPL_H
16 #define LLVM_LIB_IR_LLVMCONTEXTIMPL_H
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"
60 class ValueHandleBase
;
62 struct DenseMapAPIntKeyInfo
{
63 static inline APInt
getEmptyKey() {
69 static inline APInt
getTombstoneKey() {
75 static unsigned getHashValue(const APInt
&Key
) {
76 return static_cast<unsigned>(hash_value(Key
));
79 static bool isEqual(const APInt
&LHS
, const APInt
&RHS
) {
80 return LHS
.getBitWidth() == RHS
.getBitWidth() && LHS
== RHS
;
84 struct DenseMapAPFloatKeyInfo
{
85 static inline APFloat
getEmptyKey() { return APFloat(APFloat::Bogus(), 1); }
86 static inline APFloat
getTombstoneKey() { return APFloat(APFloat::Bogus(), 2); }
88 static unsigned getHashValue(const APFloat
&Key
) {
89 return static_cast<unsigned>(hash_value(Key
));
92 static bool isEqual(const APFloat
&LHS
, const APFloat
&RHS
) {
93 return LHS
.bitwiseIsEqual(RHS
);
97 struct AnonStructTypeKeyInfo
{
99 ArrayRef
<Type
*> ETypes
;
102 KeyTy(const ArrayRef
<Type
*>& E
, bool P
) :
103 ETypes(E
), isPacked(P
) {}
105 KeyTy(const StructType
*ST
)
106 : ETypes(ST
->elements()), isPacked(ST
->isPacked()) {}
108 bool operator==(const KeyTy
& that
) const {
109 if (isPacked
!= that
.isPacked
)
111 if (ETypes
!= that
.ETypes
)
115 bool operator!=(const KeyTy
& that
) const {
116 return !this->operator==(that
);
120 static inline StructType
* getEmptyKey() {
121 return DenseMapInfo
<StructType
*>::getEmptyKey();
124 static inline StructType
* getTombstoneKey() {
125 return DenseMapInfo
<StructType
*>::getTombstoneKey();
128 static unsigned getHashValue(const KeyTy
& Key
) {
129 return hash_combine(hash_combine_range(Key
.ETypes
.begin(),
134 static unsigned getHashValue(const StructType
*ST
) {
135 return getHashValue(KeyTy(ST
));
138 static bool isEqual(const KeyTy
& LHS
, const StructType
*RHS
) {
139 if (RHS
== getEmptyKey() || RHS
== getTombstoneKey())
141 return LHS
== KeyTy(RHS
);
144 static bool isEqual(const StructType
*LHS
, const StructType
*RHS
) {
149 struct FunctionTypeKeyInfo
{
151 const Type
*ReturnType
;
152 ArrayRef
<Type
*> Params
;
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()) {}
161 bool operator==(const KeyTy
& that
) const {
162 if (ReturnType
!= that
.ReturnType
)
164 if (isVarArg
!= that
.isVarArg
)
166 if (Params
!= that
.Params
)
170 bool operator!=(const KeyTy
& that
) const {
171 return !this->operator==(that
);
175 static inline FunctionType
* getEmptyKey() {
176 return DenseMapInfo
<FunctionType
*>::getEmptyKey();
179 static inline FunctionType
* getTombstoneKey() {
180 return DenseMapInfo
<FunctionType
*>::getTombstoneKey();
183 static unsigned getHashValue(const KeyTy
& Key
) {
184 return hash_combine(Key
.ReturnType
,
185 hash_combine_range(Key
.Params
.begin(),
190 static unsigned getHashValue(const FunctionType
*FT
) {
191 return getHashValue(KeyTy(FT
));
194 static bool isEqual(const KeyTy
& LHS
, const FunctionType
*RHS
) {
195 if (RHS
== getEmptyKey() || RHS
== getTombstoneKey())
197 return LHS
== KeyTy(RHS
);
200 static bool isEqual(const FunctionType
*LHS
, const FunctionType
*RHS
) {
205 /// Structure for hashing arbitrary MDNode operands.
207 ArrayRef
<Metadata
*> RawOps
;
208 ArrayRef
<MDOperand
> Ops
;
212 MDNodeOpsKey(ArrayRef
<Metadata
*> Ops
)
213 : RawOps(Ops
), Hash(calculateHash(Ops
)) {}
215 template <class NodeTy
>
216 MDNodeOpsKey(const NodeTy
*N
, unsigned Offset
= 0)
217 : Ops(N
->op_begin() + Offset
, N
->op_end()), Hash(N
->getHash()) {}
219 template <class NodeTy
>
220 bool compareOps(const NodeTy
*RHS
, unsigned Offset
= 0) const {
221 if (getHash() != RHS
->getHash())
224 assert((RawOps
.empty() || Ops
.empty()) && "Two sets of operands?");
225 return RawOps
.empty() ? compareOps(Ops
, RHS
, Offset
)
226 : compareOps(RawOps
, RHS
, Offset
);
229 static unsigned calculateHash(MDNode
*N
, unsigned Offset
= 0);
233 static bool compareOps(ArrayRef
<T
> Ops
, const MDNode
*RHS
, unsigned Offset
) {
234 if (Ops
.size() != RHS
->getNumOperands() - Offset
)
236 return std::equal(Ops
.begin(), Ops
.end(), RHS
->op_begin() + Offset
);
239 static unsigned calculateHash(ArrayRef
<Metadata
*> Ops
);
242 unsigned getHash() const { return Hash
; }
245 template <class NodeTy
> struct MDNodeKeyImpl
;
247 /// Configuration point for MDNodeInfo::isEqual().
248 template <class NodeTy
> struct MDNodeSubsetEqualImpl
{
249 using KeyTy
= MDNodeKeyImpl
<NodeTy
>;
251 static bool isSubsetEqual(const KeyTy
&LHS
, const NodeTy
*RHS
) {
255 static bool isSubsetEqual(const NodeTy
*LHS
, const NodeTy
*RHS
) {
260 /// DenseMapInfo for MDTuple.
262 /// Note that we don't need the is-function-local bit, since that's implicit in
264 template <> struct MDNodeKeyImpl
<MDTuple
> : MDNodeOpsKey
{
265 MDNodeKeyImpl(ArrayRef
<Metadata
*> Ops
) : MDNodeOpsKey(Ops
) {}
266 MDNodeKeyImpl(const MDTuple
*N
) : MDNodeOpsKey(N
) {}
268 bool isKeyOf(const MDTuple
*RHS
) const { return compareOps(RHS
); }
270 unsigned getHashValue() const { return getHash(); }
272 static unsigned calculateHash(MDTuple
*N
) {
273 return MDNodeOpsKey::calculateHash(N
);
277 /// DenseMapInfo for DILocation.
278 template <> struct MDNodeKeyImpl
<DILocation
> {
285 MDNodeKeyImpl(unsigned Line
, unsigned Column
, Metadata
*Scope
,
286 Metadata
*InlinedAt
, bool ImplicitCode
)
287 : Line(Line
), Column(Column
), Scope(Scope
), InlinedAt(InlinedAt
),
288 ImplicitCode(ImplicitCode
) {}
289 MDNodeKeyImpl(const DILocation
*L
)
290 : Line(L
->getLine()), Column(L
->getColumn()), Scope(L
->getRawScope()),
291 InlinedAt(L
->getRawInlinedAt()), ImplicitCode(L
->isImplicitCode()) {}
293 bool isKeyOf(const DILocation
*RHS
) const {
294 return Line
== RHS
->getLine() && Column
== RHS
->getColumn() &&
295 Scope
== RHS
->getRawScope() && InlinedAt
== RHS
->getRawInlinedAt() &&
296 ImplicitCode
== RHS
->isImplicitCode();
299 unsigned getHashValue() const {
300 return hash_combine(Line
, Column
, Scope
, InlinedAt
, ImplicitCode
);
304 /// DenseMapInfo for GenericDINode.
305 template <> struct MDNodeKeyImpl
<GenericDINode
> : MDNodeOpsKey
{
309 MDNodeKeyImpl(unsigned Tag
, MDString
*Header
, ArrayRef
<Metadata
*> DwarfOps
)
310 : MDNodeOpsKey(DwarfOps
), Tag(Tag
), Header(Header
) {}
311 MDNodeKeyImpl(const GenericDINode
*N
)
312 : MDNodeOpsKey(N
, 1), Tag(N
->getTag()), Header(N
->getRawHeader()) {}
314 bool isKeyOf(const GenericDINode
*RHS
) const {
315 return Tag
== RHS
->getTag() && Header
== RHS
->getRawHeader() &&
319 unsigned getHashValue() const { return hash_combine(getHash(), Tag
, Header
); }
321 static unsigned calculateHash(GenericDINode
*N
) {
322 return MDNodeOpsKey::calculateHash(N
, 1);
326 template <> struct MDNodeKeyImpl
<DISubrange
> {
330 MDNodeKeyImpl(Metadata
*CountNode
, int64_t LowerBound
)
331 : CountNode(CountNode
), LowerBound(LowerBound
) {}
332 MDNodeKeyImpl(const DISubrange
*N
)
333 : CountNode(N
->getRawCountNode()),
334 LowerBound(N
->getLowerBound()) {}
336 bool isKeyOf(const DISubrange
*RHS
) const {
337 if (LowerBound
!= RHS
->getLowerBound())
340 if (auto *RHSCount
= RHS
->getCount().dyn_cast
<ConstantInt
*>())
341 if (auto *MD
= dyn_cast
<ConstantAsMetadata
>(CountNode
))
342 if (RHSCount
->getSExtValue() ==
343 cast
<ConstantInt
>(MD
->getValue())->getSExtValue())
346 return CountNode
== RHS
->getRawCountNode();
349 unsigned getHashValue() const {
350 if (auto *MD
= dyn_cast
<ConstantAsMetadata
>(CountNode
))
351 return hash_combine(cast
<ConstantInt
>(MD
->getValue())->getSExtValue(),
353 return hash_combine(CountNode
, LowerBound
);
357 template <> struct MDNodeKeyImpl
<DIEnumerator
> {
362 MDNodeKeyImpl(int64_t Value
, bool IsUnsigned
, MDString
*Name
)
363 : Value(Value
), Name(Name
), IsUnsigned(IsUnsigned
) {}
364 MDNodeKeyImpl(const DIEnumerator
*N
)
365 : Value(N
->getValue()), Name(N
->getRawName()),
366 IsUnsigned(N
->isUnsigned()) {}
368 bool isKeyOf(const DIEnumerator
*RHS
) const {
369 return Value
== RHS
->getValue() && IsUnsigned
== RHS
->isUnsigned() &&
370 Name
== RHS
->getRawName();
373 unsigned getHashValue() const { return hash_combine(Value
, Name
); }
376 template <> struct MDNodeKeyImpl
<DIBasicType
> {
380 uint32_t AlignInBits
;
384 MDNodeKeyImpl(unsigned Tag
, MDString
*Name
, uint64_t SizeInBits
,
385 uint32_t AlignInBits
, unsigned Encoding
, unsigned Flags
)
386 : Tag(Tag
), Name(Name
), SizeInBits(SizeInBits
), AlignInBits(AlignInBits
),
387 Encoding(Encoding
), Flags(Flags
) {}
388 MDNodeKeyImpl(const DIBasicType
*N
)
389 : Tag(N
->getTag()), Name(N
->getRawName()), SizeInBits(N
->getSizeInBits()),
390 AlignInBits(N
->getAlignInBits()), Encoding(N
->getEncoding()), Flags(N
->getFlags()) {}
392 bool isKeyOf(const DIBasicType
*RHS
) const {
393 return Tag
== RHS
->getTag() && Name
== RHS
->getRawName() &&
394 SizeInBits
== RHS
->getSizeInBits() &&
395 AlignInBits
== RHS
->getAlignInBits() &&
396 Encoding
== RHS
->getEncoding() &&
397 Flags
== RHS
->getFlags();
400 unsigned getHashValue() const {
401 return hash_combine(Tag
, Name
, SizeInBits
, AlignInBits
, Encoding
);
405 template <> struct MDNodeKeyImpl
<DIDerivedType
> {
413 uint64_t OffsetInBits
;
414 uint32_t AlignInBits
;
415 Optional
<unsigned> DWARFAddressSpace
;
419 MDNodeKeyImpl(unsigned Tag
, MDString
*Name
, Metadata
*File
, unsigned Line
,
420 Metadata
*Scope
, Metadata
*BaseType
, uint64_t SizeInBits
,
421 uint32_t AlignInBits
, uint64_t OffsetInBits
,
422 Optional
<unsigned> DWARFAddressSpace
, unsigned Flags
,
424 : Tag(Tag
), Name(Name
), File(File
), Line(Line
), Scope(Scope
),
425 BaseType(BaseType
), SizeInBits(SizeInBits
), OffsetInBits(OffsetInBits
),
426 AlignInBits(AlignInBits
), DWARFAddressSpace(DWARFAddressSpace
),
427 Flags(Flags
), ExtraData(ExtraData
) {}
428 MDNodeKeyImpl(const DIDerivedType
*N
)
429 : Tag(N
->getTag()), Name(N
->getRawName()), File(N
->getRawFile()),
430 Line(N
->getLine()), Scope(N
->getRawScope()),
431 BaseType(N
->getRawBaseType()), SizeInBits(N
->getSizeInBits()),
432 OffsetInBits(N
->getOffsetInBits()), AlignInBits(N
->getAlignInBits()),
433 DWARFAddressSpace(N
->getDWARFAddressSpace()), Flags(N
->getFlags()),
434 ExtraData(N
->getRawExtraData()) {}
436 bool isKeyOf(const DIDerivedType
*RHS
) const {
437 return Tag
== RHS
->getTag() && Name
== RHS
->getRawName() &&
438 File
== RHS
->getRawFile() && Line
== RHS
->getLine() &&
439 Scope
== RHS
->getRawScope() && BaseType
== RHS
->getRawBaseType() &&
440 SizeInBits
== RHS
->getSizeInBits() &&
441 AlignInBits
== RHS
->getAlignInBits() &&
442 OffsetInBits
== RHS
->getOffsetInBits() &&
443 DWARFAddressSpace
== RHS
->getDWARFAddressSpace() &&
444 Flags
== RHS
->getFlags() &&
445 ExtraData
== RHS
->getRawExtraData();
448 unsigned getHashValue() const {
449 // If this is a member inside an ODR type, only hash the type and the name.
450 // Otherwise the hash will be stronger than
451 // MDNodeSubsetEqualImpl::isODRMember().
452 if (Tag
== dwarf::DW_TAG_member
&& Name
)
453 if (auto *CT
= dyn_cast_or_null
<DICompositeType
>(Scope
))
454 if (CT
->getRawIdentifier())
455 return hash_combine(Name
, Scope
);
457 // Intentionally computes the hash on a subset of the operands for
458 // performance reason. The subset has to be significant enough to avoid
459 // collision "most of the time". There is no correctness issue in case of
460 // collision because of the full check above.
461 return hash_combine(Tag
, Name
, File
, Line
, Scope
, BaseType
, Flags
);
465 template <> struct MDNodeSubsetEqualImpl
<DIDerivedType
> {
466 using KeyTy
= MDNodeKeyImpl
<DIDerivedType
>;
468 static bool isSubsetEqual(const KeyTy
&LHS
, const DIDerivedType
*RHS
) {
469 return isODRMember(LHS
.Tag
, LHS
.Scope
, LHS
.Name
, RHS
);
472 static bool isSubsetEqual(const DIDerivedType
*LHS
, const DIDerivedType
*RHS
) {
473 return isODRMember(LHS
->getTag(), LHS
->getRawScope(), LHS
->getRawName(),
477 /// Subprograms compare equal if they declare the same function in an ODR
479 static bool isODRMember(unsigned Tag
, const Metadata
*Scope
,
480 const MDString
*Name
, const DIDerivedType
*RHS
) {
481 // Check whether the LHS is eligible.
482 if (Tag
!= dwarf::DW_TAG_member
|| !Name
)
485 auto *CT
= dyn_cast_or_null
<DICompositeType
>(Scope
);
486 if (!CT
|| !CT
->getRawIdentifier())
489 // Compare to the RHS.
490 return Tag
== RHS
->getTag() && Name
== RHS
->getRawName() &&
491 Scope
== RHS
->getRawScope();
495 template <> struct MDNodeKeyImpl
<DICompositeType
> {
503 uint64_t OffsetInBits
;
504 uint32_t AlignInBits
;
507 unsigned RuntimeLang
;
508 Metadata
*VTableHolder
;
509 Metadata
*TemplateParams
;
510 MDString
*Identifier
;
511 Metadata
*Discriminator
;
513 MDNodeKeyImpl(unsigned Tag
, MDString
*Name
, Metadata
*File
, unsigned Line
,
514 Metadata
*Scope
, Metadata
*BaseType
, uint64_t SizeInBits
,
515 uint32_t AlignInBits
, uint64_t OffsetInBits
, unsigned Flags
,
516 Metadata
*Elements
, unsigned RuntimeLang
,
517 Metadata
*VTableHolder
, Metadata
*TemplateParams
,
518 MDString
*Identifier
, Metadata
*Discriminator
)
519 : Tag(Tag
), Name(Name
), File(File
), Line(Line
), Scope(Scope
),
520 BaseType(BaseType
), SizeInBits(SizeInBits
), OffsetInBits(OffsetInBits
),
521 AlignInBits(AlignInBits
), Flags(Flags
), Elements(Elements
),
522 RuntimeLang(RuntimeLang
), VTableHolder(VTableHolder
),
523 TemplateParams(TemplateParams
), Identifier(Identifier
),
524 Discriminator(Discriminator
) {}
525 MDNodeKeyImpl(const DICompositeType
*N
)
526 : Tag(N
->getTag()), Name(N
->getRawName()), File(N
->getRawFile()),
527 Line(N
->getLine()), Scope(N
->getRawScope()),
528 BaseType(N
->getRawBaseType()), SizeInBits(N
->getSizeInBits()),
529 OffsetInBits(N
->getOffsetInBits()), AlignInBits(N
->getAlignInBits()),
530 Flags(N
->getFlags()), Elements(N
->getRawElements()),
531 RuntimeLang(N
->getRuntimeLang()), VTableHolder(N
->getRawVTableHolder()),
532 TemplateParams(N
->getRawTemplateParams()),
533 Identifier(N
->getRawIdentifier()),
534 Discriminator(N
->getRawDiscriminator()) {}
536 bool isKeyOf(const DICompositeType
*RHS
) const {
537 return Tag
== RHS
->getTag() && Name
== RHS
->getRawName() &&
538 File
== RHS
->getRawFile() && Line
== RHS
->getLine() &&
539 Scope
== RHS
->getRawScope() && BaseType
== RHS
->getRawBaseType() &&
540 SizeInBits
== RHS
->getSizeInBits() &&
541 AlignInBits
== RHS
->getAlignInBits() &&
542 OffsetInBits
== RHS
->getOffsetInBits() && Flags
== RHS
->getFlags() &&
543 Elements
== RHS
->getRawElements() &&
544 RuntimeLang
== RHS
->getRuntimeLang() &&
545 VTableHolder
== RHS
->getRawVTableHolder() &&
546 TemplateParams
== RHS
->getRawTemplateParams() &&
547 Identifier
== RHS
->getRawIdentifier() &&
548 Discriminator
== RHS
->getRawDiscriminator();
551 unsigned getHashValue() const {
552 // Intentionally computes the hash on a subset of the operands for
553 // performance reason. The subset has to be significant enough to avoid
554 // collision "most of the time". There is no correctness issue in case of
555 // collision because of the full check above.
556 return hash_combine(Name
, File
, Line
, BaseType
, Scope
, Elements
,
561 template <> struct MDNodeKeyImpl
<DISubroutineType
> {
566 MDNodeKeyImpl(unsigned Flags
, uint8_t CC
, Metadata
*TypeArray
)
567 : Flags(Flags
), CC(CC
), TypeArray(TypeArray
) {}
568 MDNodeKeyImpl(const DISubroutineType
*N
)
569 : Flags(N
->getFlags()), CC(N
->getCC()), TypeArray(N
->getRawTypeArray()) {}
571 bool isKeyOf(const DISubroutineType
*RHS
) const {
572 return Flags
== RHS
->getFlags() && CC
== RHS
->getCC() &&
573 TypeArray
== RHS
->getRawTypeArray();
576 unsigned getHashValue() const { return hash_combine(Flags
, CC
, TypeArray
); }
579 template <> struct MDNodeKeyImpl
<DIFile
> {
582 Optional
<DIFile::ChecksumInfo
<MDString
*>> Checksum
;
583 Optional
<MDString
*> Source
;
585 MDNodeKeyImpl(MDString
*Filename
, MDString
*Directory
,
586 Optional
<DIFile::ChecksumInfo
<MDString
*>> Checksum
,
587 Optional
<MDString
*> Source
)
588 : Filename(Filename
), Directory(Directory
), Checksum(Checksum
),
590 MDNodeKeyImpl(const DIFile
*N
)
591 : Filename(N
->getRawFilename()), Directory(N
->getRawDirectory()),
592 Checksum(N
->getRawChecksum()), Source(N
->getRawSource()) {}
594 bool isKeyOf(const DIFile
*RHS
) const {
595 return Filename
== RHS
->getRawFilename() &&
596 Directory
== RHS
->getRawDirectory() &&
597 Checksum
== RHS
->getRawChecksum() &&
598 Source
== RHS
->getRawSource();
601 unsigned getHashValue() const {
603 Filename
, Directory
, Checksum
? Checksum
->Kind
: 0,
604 Checksum
? Checksum
->Value
: nullptr, Source
.getValueOr(nullptr));
608 template <> struct MDNodeKeyImpl
<DISubprogram
> {
611 MDString
*LinkageName
;
618 Metadata
*ContainingType
;
620 unsigned VirtualIndex
;
625 Metadata
*TemplateParams
;
626 Metadata
*Declaration
;
627 Metadata
*RetainedNodes
;
628 Metadata
*ThrownTypes
;
630 MDNodeKeyImpl(Metadata
*Scope
, MDString
*Name
, MDString
*LinkageName
,
631 Metadata
*File
, unsigned Line
, Metadata
*Type
,
632 bool IsLocalToUnit
, bool IsDefinition
, unsigned ScopeLine
,
633 Metadata
*ContainingType
, unsigned Virtuality
,
634 unsigned VirtualIndex
, int ThisAdjustment
, unsigned Flags
,
635 bool IsOptimized
, Metadata
*Unit
, Metadata
*TemplateParams
,
636 Metadata
*Declaration
, Metadata
*RetainedNodes
,
637 Metadata
*ThrownTypes
)
638 : Scope(Scope
), Name(Name
), LinkageName(LinkageName
), File(File
),
639 Line(Line
), Type(Type
), IsLocalToUnit(IsLocalToUnit
),
640 IsDefinition(IsDefinition
), ScopeLine(ScopeLine
),
641 ContainingType(ContainingType
), Virtuality(Virtuality
),
642 VirtualIndex(VirtualIndex
), ThisAdjustment(ThisAdjustment
),
643 Flags(Flags
), IsOptimized(IsOptimized
), Unit(Unit
),
644 TemplateParams(TemplateParams
), Declaration(Declaration
),
645 RetainedNodes(RetainedNodes
), ThrownTypes(ThrownTypes
) {}
646 MDNodeKeyImpl(const DISubprogram
*N
)
647 : Scope(N
->getRawScope()), Name(N
->getRawName()),
648 LinkageName(N
->getRawLinkageName()), File(N
->getRawFile()),
649 Line(N
->getLine()), Type(N
->getRawType()),
650 IsLocalToUnit(N
->isLocalToUnit()), IsDefinition(N
->isDefinition()),
651 ScopeLine(N
->getScopeLine()), ContainingType(N
->getRawContainingType()),
652 Virtuality(N
->getVirtuality()), VirtualIndex(N
->getVirtualIndex()),
653 ThisAdjustment(N
->getThisAdjustment()), Flags(N
->getFlags()),
654 IsOptimized(N
->isOptimized()), Unit(N
->getRawUnit()),
655 TemplateParams(N
->getRawTemplateParams()),
656 Declaration(N
->getRawDeclaration()), RetainedNodes(N
->getRawRetainedNodes()),
657 ThrownTypes(N
->getRawThrownTypes()) {}
659 bool isKeyOf(const DISubprogram
*RHS
) const {
660 return Scope
== RHS
->getRawScope() && Name
== RHS
->getRawName() &&
661 LinkageName
== RHS
->getRawLinkageName() &&
662 File
== RHS
->getRawFile() && Line
== RHS
->getLine() &&
663 Type
== RHS
->getRawType() && IsLocalToUnit
== RHS
->isLocalToUnit() &&
664 IsDefinition
== RHS
->isDefinition() &&
665 ScopeLine
== RHS
->getScopeLine() &&
666 ContainingType
== RHS
->getRawContainingType() &&
667 Virtuality
== RHS
->getVirtuality() &&
668 VirtualIndex
== RHS
->getVirtualIndex() &&
669 ThisAdjustment
== RHS
->getThisAdjustment() &&
670 Flags
== RHS
->getFlags() && IsOptimized
== RHS
->isOptimized() &&
671 Unit
== RHS
->getUnit() &&
672 TemplateParams
== RHS
->getRawTemplateParams() &&
673 Declaration
== RHS
->getRawDeclaration() &&
674 RetainedNodes
== RHS
->getRawRetainedNodes() &&
675 ThrownTypes
== RHS
->getRawThrownTypes();
678 unsigned getHashValue() const {
679 // If this is a declaration inside an ODR type, only hash the type and the
680 // name. Otherwise the hash will be stronger than
681 // MDNodeSubsetEqualImpl::isDeclarationOfODRMember().
682 if (!IsDefinition
&& LinkageName
)
683 if (auto *CT
= dyn_cast_or_null
<DICompositeType
>(Scope
))
684 if (CT
->getRawIdentifier())
685 return hash_combine(LinkageName
, Scope
);
687 // Intentionally computes the hash on a subset of the operands for
688 // performance reason. The subset has to be significant enough to avoid
689 // collision "most of the time". There is no correctness issue in case of
690 // collision because of the full check above.
691 return hash_combine(Name
, Scope
, File
, Type
, Line
);
695 template <> struct MDNodeSubsetEqualImpl
<DISubprogram
> {
696 using KeyTy
= MDNodeKeyImpl
<DISubprogram
>;
698 static bool isSubsetEqual(const KeyTy
&LHS
, const DISubprogram
*RHS
) {
699 return isDeclarationOfODRMember(LHS
.IsDefinition
, LHS
.Scope
,
700 LHS
.LinkageName
, LHS
.TemplateParams
, RHS
);
703 static bool isSubsetEqual(const DISubprogram
*LHS
, const DISubprogram
*RHS
) {
704 return isDeclarationOfODRMember(LHS
->isDefinition(), LHS
->getRawScope(),
705 LHS
->getRawLinkageName(),
706 LHS
->getRawTemplateParams(), RHS
);
709 /// Subprograms compare equal if they declare the same function in an ODR
711 static bool isDeclarationOfODRMember(bool IsDefinition
, const Metadata
*Scope
,
712 const MDString
*LinkageName
,
713 const Metadata
*TemplateParams
,
714 const DISubprogram
*RHS
) {
715 // Check whether the LHS is eligible.
716 if (IsDefinition
|| !Scope
|| !LinkageName
)
719 auto *CT
= dyn_cast_or_null
<DICompositeType
>(Scope
);
720 if (!CT
|| !CT
->getRawIdentifier())
723 // Compare to the RHS.
724 // FIXME: We need to compare template parameters here to avoid incorrect
725 // collisions in mapMetadata when RF_MoveDistinctMDs and a ODR-DISubprogram
726 // has a non-ODR template parameter (i.e., a DICompositeType that does not
727 // have an identifier). Eventually we should decouple ODR logic from
729 return IsDefinition
== RHS
->isDefinition() && Scope
== RHS
->getRawScope() &&
730 LinkageName
== RHS
->getRawLinkageName() &&
731 TemplateParams
== RHS
->getRawTemplateParams();
735 template <> struct MDNodeKeyImpl
<DILexicalBlock
> {
741 MDNodeKeyImpl(Metadata
*Scope
, Metadata
*File
, unsigned Line
, unsigned Column
)
742 : Scope(Scope
), File(File
), Line(Line
), Column(Column
) {}
743 MDNodeKeyImpl(const DILexicalBlock
*N
)
744 : Scope(N
->getRawScope()), File(N
->getRawFile()), Line(N
->getLine()),
745 Column(N
->getColumn()) {}
747 bool isKeyOf(const DILexicalBlock
*RHS
) const {
748 return Scope
== RHS
->getRawScope() && File
== RHS
->getRawFile() &&
749 Line
== RHS
->getLine() && Column
== RHS
->getColumn();
752 unsigned getHashValue() const {
753 return hash_combine(Scope
, File
, Line
, Column
);
757 template <> struct MDNodeKeyImpl
<DILexicalBlockFile
> {
760 unsigned Discriminator
;
762 MDNodeKeyImpl(Metadata
*Scope
, Metadata
*File
, unsigned Discriminator
)
763 : Scope(Scope
), File(File
), Discriminator(Discriminator
) {}
764 MDNodeKeyImpl(const DILexicalBlockFile
*N
)
765 : Scope(N
->getRawScope()), File(N
->getRawFile()),
766 Discriminator(N
->getDiscriminator()) {}
768 bool isKeyOf(const DILexicalBlockFile
*RHS
) const {
769 return Scope
== RHS
->getRawScope() && File
== RHS
->getRawFile() &&
770 Discriminator
== RHS
->getDiscriminator();
773 unsigned getHashValue() const {
774 return hash_combine(Scope
, File
, Discriminator
);
778 template <> struct MDNodeKeyImpl
<DINamespace
> {
783 MDNodeKeyImpl(Metadata
*Scope
, MDString
*Name
, bool ExportSymbols
)
784 : Scope(Scope
), Name(Name
), ExportSymbols(ExportSymbols
) {}
785 MDNodeKeyImpl(const DINamespace
*N
)
786 : Scope(N
->getRawScope()), Name(N
->getRawName()),
787 ExportSymbols(N
->getExportSymbols()) {}
789 bool isKeyOf(const DINamespace
*RHS
) const {
790 return Scope
== RHS
->getRawScope() && Name
== RHS
->getRawName() &&
791 ExportSymbols
== RHS
->getExportSymbols();
794 unsigned getHashValue() const {
795 return hash_combine(Scope
, Name
);
799 template <> struct MDNodeKeyImpl
<DIModule
> {
802 MDString
*ConfigurationMacros
;
803 MDString
*IncludePath
;
806 MDNodeKeyImpl(Metadata
*Scope
, MDString
*Name
, MDString
*ConfigurationMacros
,
807 MDString
*IncludePath
, MDString
*ISysRoot
)
808 : Scope(Scope
), Name(Name
), ConfigurationMacros(ConfigurationMacros
),
809 IncludePath(IncludePath
), ISysRoot(ISysRoot
) {}
810 MDNodeKeyImpl(const DIModule
*N
)
811 : Scope(N
->getRawScope()), Name(N
->getRawName()),
812 ConfigurationMacros(N
->getRawConfigurationMacros()),
813 IncludePath(N
->getRawIncludePath()), ISysRoot(N
->getRawISysRoot()) {}
815 bool isKeyOf(const DIModule
*RHS
) const {
816 return Scope
== RHS
->getRawScope() && Name
== RHS
->getRawName() &&
817 ConfigurationMacros
== RHS
->getRawConfigurationMacros() &&
818 IncludePath
== RHS
->getRawIncludePath() &&
819 ISysRoot
== RHS
->getRawISysRoot();
822 unsigned getHashValue() const {
823 return hash_combine(Scope
, Name
,
824 ConfigurationMacros
, IncludePath
, ISysRoot
);
828 template <> struct MDNodeKeyImpl
<DITemplateTypeParameter
> {
832 MDNodeKeyImpl(MDString
*Name
, Metadata
*Type
) : Name(Name
), Type(Type
) {}
833 MDNodeKeyImpl(const DITemplateTypeParameter
*N
)
834 : Name(N
->getRawName()), Type(N
->getRawType()) {}
836 bool isKeyOf(const DITemplateTypeParameter
*RHS
) const {
837 return Name
== RHS
->getRawName() && Type
== RHS
->getRawType();
840 unsigned getHashValue() const { return hash_combine(Name
, Type
); }
843 template <> struct MDNodeKeyImpl
<DITemplateValueParameter
> {
849 MDNodeKeyImpl(unsigned Tag
, MDString
*Name
, Metadata
*Type
, Metadata
*Value
)
850 : Tag(Tag
), Name(Name
), Type(Type
), Value(Value
) {}
851 MDNodeKeyImpl(const DITemplateValueParameter
*N
)
852 : Tag(N
->getTag()), Name(N
->getRawName()), Type(N
->getRawType()),
853 Value(N
->getValue()) {}
855 bool isKeyOf(const DITemplateValueParameter
*RHS
) const {
856 return Tag
== RHS
->getTag() && Name
== RHS
->getRawName() &&
857 Type
== RHS
->getRawType() && Value
== RHS
->getValue();
860 unsigned getHashValue() const { return hash_combine(Tag
, Name
, Type
, Value
); }
863 template <> struct MDNodeKeyImpl
<DIGlobalVariable
> {
866 MDString
*LinkageName
;
872 Metadata
*StaticDataMemberDeclaration
;
873 Metadata
*TemplateParams
;
874 uint32_t AlignInBits
;
876 MDNodeKeyImpl(Metadata
*Scope
, MDString
*Name
, MDString
*LinkageName
,
877 Metadata
*File
, unsigned Line
, Metadata
*Type
,
878 bool IsLocalToUnit
, bool IsDefinition
,
879 Metadata
*StaticDataMemberDeclaration
, Metadata
*TemplateParams
,
880 uint32_t AlignInBits
)
881 : Scope(Scope
), Name(Name
), LinkageName(LinkageName
), File(File
),
882 Line(Line
), Type(Type
), IsLocalToUnit(IsLocalToUnit
),
883 IsDefinition(IsDefinition
),
884 StaticDataMemberDeclaration(StaticDataMemberDeclaration
),
885 TemplateParams(TemplateParams
), AlignInBits(AlignInBits
) {}
886 MDNodeKeyImpl(const DIGlobalVariable
*N
)
887 : Scope(N
->getRawScope()), Name(N
->getRawName()),
888 LinkageName(N
->getRawLinkageName()), File(N
->getRawFile()),
889 Line(N
->getLine()), Type(N
->getRawType()),
890 IsLocalToUnit(N
->isLocalToUnit()), IsDefinition(N
->isDefinition()),
891 StaticDataMemberDeclaration(N
->getRawStaticDataMemberDeclaration()),
892 TemplateParams(N
->getRawTemplateParams()),
893 AlignInBits(N
->getAlignInBits()) {}
895 bool isKeyOf(const DIGlobalVariable
*RHS
) const {
896 return Scope
== RHS
->getRawScope() && Name
== RHS
->getRawName() &&
897 LinkageName
== RHS
->getRawLinkageName() &&
898 File
== RHS
->getRawFile() && Line
== RHS
->getLine() &&
899 Type
== RHS
->getRawType() && IsLocalToUnit
== RHS
->isLocalToUnit() &&
900 IsDefinition
== RHS
->isDefinition() &&
901 StaticDataMemberDeclaration
==
902 RHS
->getRawStaticDataMemberDeclaration() &&
903 TemplateParams
== RHS
->getRawTemplateParams() &&
904 AlignInBits
== RHS
->getAlignInBits();
907 unsigned getHashValue() const {
908 // We do not use AlignInBits in hashing function here on purpose:
909 // in most cases this param for local variable is zero (for function param
910 // it is always zero). This leads to lots of hash collisions and errors on
911 // cases with lots of similar variables.
912 // clang/test/CodeGen/debug-info-257-args.c is an example of this problem,
913 // generated IR is random for each run and test fails with Align included.
914 // TODO: make hashing work fine with such situations
915 return hash_combine(Scope
, Name
, LinkageName
, File
, Line
, Type
,
916 IsLocalToUnit
, IsDefinition
, /* AlignInBits, */
917 StaticDataMemberDeclaration
);
921 template <> struct MDNodeKeyImpl
<DILocalVariable
> {
929 uint32_t AlignInBits
;
931 MDNodeKeyImpl(Metadata
*Scope
, MDString
*Name
, Metadata
*File
, unsigned Line
,
932 Metadata
*Type
, unsigned Arg
, unsigned Flags
,
933 uint32_t AlignInBits
)
934 : Scope(Scope
), Name(Name
), File(File
), Line(Line
), Type(Type
), Arg(Arg
),
935 Flags(Flags
), AlignInBits(AlignInBits
) {}
936 MDNodeKeyImpl(const DILocalVariable
*N
)
937 : Scope(N
->getRawScope()), Name(N
->getRawName()), File(N
->getRawFile()),
938 Line(N
->getLine()), Type(N
->getRawType()), Arg(N
->getArg()),
939 Flags(N
->getFlags()), AlignInBits(N
->getAlignInBits()) {}
941 bool isKeyOf(const DILocalVariable
*RHS
) const {
942 return Scope
== RHS
->getRawScope() && Name
== RHS
->getRawName() &&
943 File
== RHS
->getRawFile() && Line
== RHS
->getLine() &&
944 Type
== RHS
->getRawType() && Arg
== RHS
->getArg() &&
945 Flags
== RHS
->getFlags() && AlignInBits
== RHS
->getAlignInBits();
948 unsigned getHashValue() const {
949 // We do not use AlignInBits in hashing function here on purpose:
950 // in most cases this param for local variable is zero (for function param
951 // it is always zero). This leads to lots of hash collisions and errors on
952 // cases with lots of similar variables.
953 // clang/test/CodeGen/debug-info-257-args.c is an example of this problem,
954 // generated IR is random for each run and test fails with Align included.
955 // TODO: make hashing work fine with such situations
956 return hash_combine(Scope
, Name
, File
, Line
, Type
, Arg
, Flags
);
960 template <> struct MDNodeKeyImpl
<DILabel
> {
966 MDNodeKeyImpl(Metadata
*Scope
, MDString
*Name
, Metadata
*File
, unsigned Line
)
967 : Scope(Scope
), Name(Name
), File(File
), Line(Line
) {}
968 MDNodeKeyImpl(const DILabel
*N
)
969 : Scope(N
->getRawScope()), Name(N
->getRawName()), File(N
->getRawFile()),
970 Line(N
->getLine()) {}
972 bool isKeyOf(const DILabel
*RHS
) const {
973 return Scope
== RHS
->getRawScope() && Name
== RHS
->getRawName() &&
974 File
== RHS
->getRawFile() && Line
== RHS
->getLine();
977 /// Using name and line to get hash value. It should already be mostly unique.
978 unsigned getHashValue() const {
979 return hash_combine(Scope
, Name
, Line
);
983 template <> struct MDNodeKeyImpl
<DIExpression
> {
984 ArrayRef
<uint64_t> Elements
;
986 MDNodeKeyImpl(ArrayRef
<uint64_t> Elements
) : Elements(Elements
) {}
987 MDNodeKeyImpl(const DIExpression
*N
) : Elements(N
->getElements()) {}
989 bool isKeyOf(const DIExpression
*RHS
) const {
990 return Elements
== RHS
->getElements();
993 unsigned getHashValue() const {
994 return hash_combine_range(Elements
.begin(), Elements
.end());
998 template <> struct MDNodeKeyImpl
<DIGlobalVariableExpression
> {
1000 Metadata
*Expression
;
1002 MDNodeKeyImpl(Metadata
*Variable
, Metadata
*Expression
)
1003 : Variable(Variable
), Expression(Expression
) {}
1004 MDNodeKeyImpl(const DIGlobalVariableExpression
*N
)
1005 : Variable(N
->getRawVariable()), Expression(N
->getRawExpression()) {}
1007 bool isKeyOf(const DIGlobalVariableExpression
*RHS
) const {
1008 return Variable
== RHS
->getRawVariable() &&
1009 Expression
== RHS
->getRawExpression();
1012 unsigned getHashValue() const { return hash_combine(Variable
, Expression
); }
1015 template <> struct MDNodeKeyImpl
<DIObjCProperty
> {
1019 MDString
*GetterName
;
1020 MDString
*SetterName
;
1021 unsigned Attributes
;
1024 MDNodeKeyImpl(MDString
*Name
, Metadata
*File
, unsigned Line
,
1025 MDString
*GetterName
, MDString
*SetterName
, unsigned Attributes
,
1027 : Name(Name
), File(File
), Line(Line
), GetterName(GetterName
),
1028 SetterName(SetterName
), Attributes(Attributes
), Type(Type
) {}
1029 MDNodeKeyImpl(const DIObjCProperty
*N
)
1030 : Name(N
->getRawName()), File(N
->getRawFile()), Line(N
->getLine()),
1031 GetterName(N
->getRawGetterName()), SetterName(N
->getRawSetterName()),
1032 Attributes(N
->getAttributes()), Type(N
->getRawType()) {}
1034 bool isKeyOf(const DIObjCProperty
*RHS
) const {
1035 return Name
== RHS
->getRawName() && File
== RHS
->getRawFile() &&
1036 Line
== RHS
->getLine() && GetterName
== RHS
->getRawGetterName() &&
1037 SetterName
== RHS
->getRawSetterName() &&
1038 Attributes
== RHS
->getAttributes() && Type
== RHS
->getRawType();
1041 unsigned getHashValue() const {
1042 return hash_combine(Name
, File
, Line
, GetterName
, SetterName
, Attributes
,
1047 template <> struct MDNodeKeyImpl
<DIImportedEntity
> {
1055 MDNodeKeyImpl(unsigned Tag
, Metadata
*Scope
, Metadata
*Entity
, Metadata
*File
,
1056 unsigned Line
, MDString
*Name
)
1057 : Tag(Tag
), Scope(Scope
), Entity(Entity
), File(File
), Line(Line
),
1059 MDNodeKeyImpl(const DIImportedEntity
*N
)
1060 : Tag(N
->getTag()), Scope(N
->getRawScope()), Entity(N
->getRawEntity()),
1061 File(N
->getRawFile()), Line(N
->getLine()), Name(N
->getRawName()) {}
1063 bool isKeyOf(const DIImportedEntity
*RHS
) const {
1064 return Tag
== RHS
->getTag() && Scope
== RHS
->getRawScope() &&
1065 Entity
== RHS
->getRawEntity() && File
== RHS
->getFile() &&
1066 Line
== RHS
->getLine() && Name
== RHS
->getRawName();
1069 unsigned getHashValue() const {
1070 return hash_combine(Tag
, Scope
, Entity
, File
, Line
, Name
);
1074 template <> struct MDNodeKeyImpl
<DIMacro
> {
1080 MDNodeKeyImpl(unsigned MIType
, unsigned Line
, MDString
*Name
, MDString
*Value
)
1081 : MIType(MIType
), Line(Line
), Name(Name
), Value(Value
) {}
1082 MDNodeKeyImpl(const DIMacro
*N
)
1083 : MIType(N
->getMacinfoType()), Line(N
->getLine()), Name(N
->getRawName()),
1084 Value(N
->getRawValue()) {}
1086 bool isKeyOf(const DIMacro
*RHS
) const {
1087 return MIType
== RHS
->getMacinfoType() && Line
== RHS
->getLine() &&
1088 Name
== RHS
->getRawName() && Value
== RHS
->getRawValue();
1091 unsigned getHashValue() const {
1092 return hash_combine(MIType
, Line
, Name
, Value
);
1096 template <> struct MDNodeKeyImpl
<DIMacroFile
> {
1102 MDNodeKeyImpl(unsigned MIType
, unsigned Line
, Metadata
*File
,
1104 : MIType(MIType
), Line(Line
), File(File
), Elements(Elements
) {}
1105 MDNodeKeyImpl(const DIMacroFile
*N
)
1106 : MIType(N
->getMacinfoType()), Line(N
->getLine()), File(N
->getRawFile()),
1107 Elements(N
->getRawElements()) {}
1109 bool isKeyOf(const DIMacroFile
*RHS
) const {
1110 return MIType
== RHS
->getMacinfoType() && Line
== RHS
->getLine() &&
1111 File
== RHS
->getRawFile() && Elements
== RHS
->getRawElements();
1114 unsigned getHashValue() const {
1115 return hash_combine(MIType
, Line
, File
, Elements
);
1119 /// DenseMapInfo for MDNode subclasses.
1120 template <class NodeTy
> struct MDNodeInfo
{
1121 using KeyTy
= MDNodeKeyImpl
<NodeTy
>;
1122 using SubsetEqualTy
= MDNodeSubsetEqualImpl
<NodeTy
>;
1124 static inline NodeTy
*getEmptyKey() {
1125 return DenseMapInfo
<NodeTy
*>::getEmptyKey();
1128 static inline NodeTy
*getTombstoneKey() {
1129 return DenseMapInfo
<NodeTy
*>::getTombstoneKey();
1132 static unsigned getHashValue(const KeyTy
&Key
) { return Key
.getHashValue(); }
1134 static unsigned getHashValue(const NodeTy
*N
) {
1135 return KeyTy(N
).getHashValue();
1138 static bool isEqual(const KeyTy
&LHS
, const NodeTy
*RHS
) {
1139 if (RHS
== getEmptyKey() || RHS
== getTombstoneKey())
1141 return SubsetEqualTy::isSubsetEqual(LHS
, RHS
) || LHS
.isKeyOf(RHS
);
1144 static bool isEqual(const NodeTy
*LHS
, const NodeTy
*RHS
) {
1147 if (RHS
== getEmptyKey() || RHS
== getTombstoneKey())
1149 return SubsetEqualTy::isSubsetEqual(LHS
, RHS
);
1153 #define HANDLE_MDNODE_LEAF(CLASS) using CLASS##Info = MDNodeInfo<CLASS>;
1154 #include "llvm/IR/Metadata.def"
1156 /// Map-like storage for metadata attachments.
1157 class MDAttachmentMap
{
1158 SmallVector
<std::pair
<unsigned, TrackingMDNodeRef
>, 2> Attachments
;
1161 bool empty() const { return Attachments
.empty(); }
1162 size_t size() const { return Attachments
.size(); }
1164 /// Get a particular attachment (if any).
1165 MDNode
*lookup(unsigned ID
) const;
1167 /// Set an attachment to a particular node.
1169 /// Set the \c ID attachment to \c MD, replacing the current attachment at \c
1171 void set(unsigned ID
, MDNode
&MD
);
1173 /// Remove an attachment.
1175 /// Remove the attachment at \c ID, if any.
1176 bool erase(unsigned ID
);
1178 /// Copy out all the attachments.
1180 /// Copies all the current attachments into \c Result, sorting by attachment
1181 /// ID. This function does \em not clear \c Result.
1182 void getAll(SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &Result
) const;
1184 /// Erase matching attachments.
1186 /// Erases all attachments matching the \c shouldRemove predicate.
1187 template <class PredTy
> void remove_if(PredTy shouldRemove
) {
1188 Attachments
.erase(llvm::remove_if(Attachments
, shouldRemove
),
1193 /// Multimap-like storage for metadata attachments for globals. This differs
1194 /// from MDAttachmentMap in that it allows multiple attachments per metadata
1196 class MDGlobalAttachmentMap
{
1199 TrackingMDNodeRef Node
;
1201 SmallVector
<Attachment
, 1> Attachments
;
1204 bool empty() const { return Attachments
.empty(); }
1206 /// Appends all attachments with the given ID to \c Result in insertion order.
1207 /// If the global has no attachments with the given ID, or if ID is invalid,
1208 /// leaves Result unchanged.
1209 void get(unsigned ID
, SmallVectorImpl
<MDNode
*> &Result
) const;
1211 /// Returns the first attachment with the given ID or nullptr if no such
1212 /// attachment exists.
1213 MDNode
*lookup(unsigned ID
) const;
1215 void insert(unsigned ID
, MDNode
&MD
);
1216 bool erase(unsigned ID
);
1218 /// Appends all attachments for the global to \c Result, sorting by attachment
1219 /// ID. Attachments with the same ID appear in insertion order. This function
1220 /// does \em not clear \c Result.
1221 void getAll(SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &Result
) const;
1224 class LLVMContextImpl
{
1226 /// OwnedModules - The set of modules instantiated in this context, and which
1227 /// will be automatically deleted if this context is deleted.
1228 SmallPtrSet
<Module
*, 4> OwnedModules
;
1230 LLVMContext::InlineAsmDiagHandlerTy InlineAsmDiagHandler
= nullptr;
1231 void *InlineAsmDiagContext
= nullptr;
1233 std::unique_ptr
<DiagnosticHandler
> DiagHandler
;
1234 bool RespectDiagnosticFilters
= false;
1235 bool DiagnosticsHotnessRequested
= false;
1236 uint64_t DiagnosticsHotnessThreshold
= 0;
1237 std::unique_ptr
<yaml::Output
> DiagnosticsOutputFile
;
1239 LLVMContext::YieldCallbackTy YieldCallback
= nullptr;
1240 void *YieldOpaqueHandle
= nullptr;
1243 DenseMap
<APInt
, std::unique_ptr
<ConstantInt
>, DenseMapAPIntKeyInfo
>;
1244 IntMapTy IntConstants
;
1247 DenseMap
<APFloat
, std::unique_ptr
<ConstantFP
>, DenseMapAPFloatKeyInfo
>;
1248 FPMapTy FPConstants
;
1250 FoldingSet
<AttributeImpl
> AttrsSet
;
1251 FoldingSet
<AttributeListImpl
> AttrsLists
;
1252 FoldingSet
<AttributeSetNode
> AttrsSetNodes
;
1254 StringMap
<MDString
, BumpPtrAllocator
> MDStringCache
;
1255 DenseMap
<Value
*, ValueAsMetadata
*> ValuesAsMetadata
;
1256 DenseMap
<Metadata
*, MetadataAsValue
*> MetadataAsValues
;
1258 DenseMap
<const Value
*, ValueName
*> ValueNames
;
1260 #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1261 DenseSet<CLASS *, CLASS##Info> CLASS##s;
1262 #include "llvm/IR/Metadata.def"
1264 // Optional map for looking up composite types by identifier.
1265 Optional
<DenseMap
<const MDString
*, DICompositeType
*>> DITypeMap
;
1267 // MDNodes may be uniqued or not uniqued. When they're not uniqued, they
1268 // aren't in the MDNodeSet, but they're still shared between objects, so no
1269 // one object can destroy them. Keep track of them here so we can delete
1270 // them on context teardown.
1271 std::vector
<MDNode
*> DistinctMDNodes
;
1273 DenseMap
<Type
*, std::unique_ptr
<ConstantAggregateZero
>> CAZConstants
;
1275 using ArrayConstantsTy
= ConstantUniqueMap
<ConstantArray
>;
1276 ArrayConstantsTy ArrayConstants
;
1278 using StructConstantsTy
= ConstantUniqueMap
<ConstantStruct
>;
1279 StructConstantsTy StructConstants
;
1281 using VectorConstantsTy
= ConstantUniqueMap
<ConstantVector
>;
1282 VectorConstantsTy VectorConstants
;
1284 DenseMap
<PointerType
*, std::unique_ptr
<ConstantPointerNull
>> CPNConstants
;
1286 DenseMap
<Type
*, std::unique_ptr
<UndefValue
>> UVConstants
;
1288 StringMap
<ConstantDataSequential
*> CDSConstants
;
1290 DenseMap
<std::pair
<const Function
*, const BasicBlock
*>, BlockAddress
*>
1292 ConstantUniqueMap
<ConstantExpr
> ExprConstants
;
1294 ConstantUniqueMap
<InlineAsm
> InlineAsms
;
1296 ConstantInt
*TheTrueVal
= nullptr;
1297 ConstantInt
*TheFalseVal
= nullptr;
1299 std::unique_ptr
<ConstantTokenNone
> TheNoneToken
;
1301 // Basic type instances.
1302 Type VoidTy
, LabelTy
, HalfTy
, FloatTy
, DoubleTy
, MetadataTy
, TokenTy
;
1303 Type X86_FP80Ty
, FP128Ty
, PPC_FP128Ty
, X86_MMXTy
;
1304 IntegerType Int1Ty
, Int8Ty
, Int16Ty
, Int32Ty
, Int64Ty
, Int128Ty
;
1306 /// TypeAllocator - All dynamically allocated types are allocated from this.
1307 /// They live forever until the context is torn down.
1308 BumpPtrAllocator TypeAllocator
;
1310 DenseMap
<unsigned, IntegerType
*> IntegerTypes
;
1312 using FunctionTypeSet
= DenseSet
<FunctionType
*, FunctionTypeKeyInfo
>;
1313 FunctionTypeSet FunctionTypes
;
1314 using StructTypeSet
= DenseSet
<StructType
*, AnonStructTypeKeyInfo
>;
1315 StructTypeSet AnonStructTypes
;
1316 StringMap
<StructType
*> NamedStructTypes
;
1317 unsigned NamedStructTypesUniqueID
= 0;
1319 DenseMap
<std::pair
<Type
*, uint64_t>, ArrayType
*> ArrayTypes
;
1320 DenseMap
<std::pair
<Type
*, unsigned>, VectorType
*> VectorTypes
;
1321 DenseMap
<Type
*, PointerType
*> PointerTypes
; // Pointers in AddrSpace = 0
1322 DenseMap
<std::pair
<Type
*, unsigned>, PointerType
*> ASPointerTypes
;
1324 /// ValueHandles - This map keeps track of all of the value handles that are
1325 /// watching a Value*. The Value::HasValueHandle bit is used to know
1326 /// whether or not a value has an entry in this map.
1327 using ValueHandlesTy
= DenseMap
<Value
*, ValueHandleBase
*>;
1328 ValueHandlesTy ValueHandles
;
1330 /// CustomMDKindNames - Map to hold the metadata string to ID mapping.
1331 StringMap
<unsigned> CustomMDKindNames
;
1333 /// Collection of per-instruction metadata used in this context.
1334 DenseMap
<const Instruction
*, MDAttachmentMap
> InstructionMetadata
;
1336 /// Collection of per-GlobalObject metadata used in this context.
1337 DenseMap
<const GlobalObject
*, MDGlobalAttachmentMap
> GlobalObjectMetadata
;
1339 /// Collection of per-GlobalObject sections used in this context.
1340 DenseMap
<const GlobalObject
*, StringRef
> GlobalObjectSections
;
1342 /// Stable collection of section strings.
1343 StringSet
<> SectionStrings
;
1345 /// DiscriminatorTable - This table maps file:line locations to an
1346 /// integer representing the next DWARF path discriminator to assign to
1347 /// instructions in different blocks at the same location.
1348 DenseMap
<std::pair
<const char *, unsigned>, unsigned> DiscriminatorTable
;
1350 int getOrAddScopeRecordIdxEntry(MDNode
*N
, int ExistingIdx
);
1351 int getOrAddScopeInlinedAtIdxEntry(MDNode
*Scope
, MDNode
*IA
,int ExistingIdx
);
1353 /// A set of interned tags for operand bundles. The StringMap maps
1354 /// bundle tags to their IDs.
1356 /// \see LLVMContext::getOperandBundleTagID
1357 StringMap
<uint32_t> BundleTagCache
;
1359 StringMapEntry
<uint32_t> *getOrInsertBundleTag(StringRef Tag
);
1360 void getOperandBundleTags(SmallVectorImpl
<StringRef
> &Tags
) const;
1361 uint32_t getOperandBundleTagID(StringRef Tag
) const;
1363 /// A set of interned synchronization scopes. The StringMap maps
1364 /// synchronization scope names to their respective synchronization scope IDs.
1365 StringMap
<SyncScope::ID
> SSC
;
1367 /// getOrInsertSyncScopeID - Maps synchronization scope name to
1368 /// synchronization scope ID. Every synchronization scope registered with
1369 /// LLVMContext has unique ID except pre-defined ones.
1370 SyncScope::ID
getOrInsertSyncScopeID(StringRef SSN
);
1372 /// getSyncScopeNames - Populates client supplied SmallVector with
1373 /// synchronization scope names registered with LLVMContext. Synchronization
1374 /// scope names are ordered by increasing synchronization scope IDs.
1375 void getSyncScopeNames(SmallVectorImpl
<StringRef
> &SSNs
) const;
1377 /// Maintain the GC name for each function.
1379 /// This saves allocating an additional word in Function for programs which
1380 /// do not use GC (i.e., most programs) at the cost of increased overhead for
1381 /// clients which do use GC.
1382 DenseMap
<const Function
*, std::string
> GCNames
;
1384 /// Flag to indicate if Value (other than GlobalValue) retains their name or
1386 bool DiscardValueNames
= false;
1388 LLVMContextImpl(LLVMContext
&C
);
1391 /// Destroy the ConstantArrays if they are not used.
1392 void dropTriviallyDeadConstantArrays();
1394 mutable OptPassGate
*OPG
= nullptr;
1396 /// Access the object which can disable optional passes and individual
1397 /// optimizations at compile time.
1398 OptPassGate
&getOptPassGate() const;
1400 /// Set the object which can disable optional passes and individual
1401 /// optimizations at compile time.
1403 /// The lifetime of the object must be guaranteed to extend as long as the
1404 /// LLVMContext is used by compilation.
1405 void setOptPassGate(OptPassGate
&);
1408 } // end namespace llvm
1410 #endif // LLVM_LIB_IR_LLVMCONTEXTIMPL_H