• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- llvm/IR/DebugInfoMetadata.h - Debug info metadata --------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Declarations for metadata specific to debug info.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_IR_DEBUGINFOMETADATA_H
14 #define LLVM_IR_DEBUGINFOMETADATA_H
15 
16 #include "llvm/ADT/ArrayRef.h"
17 #include "llvm/ADT/BitmaskEnum.h"
18 #include "llvm/ADT/None.h"
19 #include "llvm/ADT/Optional.h"
20 #include "llvm/ADT/PointerUnion.h"
21 #include "llvm/ADT/STLExtras.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/ADT/StringRef.h"
24 #include "llvm/ADT/iterator_range.h"
25 #include "llvm/BinaryFormat/Dwarf.h"
26 #include "llvm/IR/Constants.h"
27 #include "llvm/IR/Metadata.h"
28 #include "llvm/Support/Casting.h"
29 #include <cassert>
30 #include <climits>
31 #include <cstddef>
32 #include <cstdint>
33 #include <iterator>
34 #include <type_traits>
35 #include <vector>
36 
37 // Helper macros for defining get() overrides.
38 #define DEFINE_MDNODE_GET_UNPACK_IMPL(...) __VA_ARGS__
39 #define DEFINE_MDNODE_GET_UNPACK(ARGS) DEFINE_MDNODE_GET_UNPACK_IMPL ARGS
40 #define DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS)              \
41   static CLASS *getDistinct(LLVMContext &Context,                              \
42                             DEFINE_MDNODE_GET_UNPACK(FORMAL)) {                \
43     return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Distinct);         \
44   }                                                                            \
45   static Temp##CLASS getTemporary(LLVMContext &Context,                        \
46                                   DEFINE_MDNODE_GET_UNPACK(FORMAL)) {          \
47     return Temp##CLASS(                                                        \
48         getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Temporary));          \
49   }
50 #define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS)                                 \
51   static CLASS *get(LLVMContext &Context, DEFINE_MDNODE_GET_UNPACK(FORMAL)) {  \
52     return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued);          \
53   }                                                                            \
54   static CLASS *getIfExists(LLVMContext &Context,                              \
55                             DEFINE_MDNODE_GET_UNPACK(FORMAL)) {                \
56     return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued,           \
57                    /* ShouldCreate */ false);                                  \
58   }                                                                            \
59   DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS)
60 
61 namespace llvm {
62 
63 class DITypeRefArray {
64   const MDTuple *N = nullptr;
65 
66 public:
67   DITypeRefArray() = default;
DITypeRefArray(const MDTuple * N)68   DITypeRefArray(const MDTuple *N) : N(N) {}
69 
70   explicit operator bool() const { return get(); }
71   explicit operator MDTuple *() const { return get(); }
72 
get()73   MDTuple *get() const { return const_cast<MDTuple *>(N); }
74   MDTuple *operator->() const { return get(); }
75   MDTuple &operator*() const { return *get(); }
76 
77   // FIXME: Fix callers and remove condition on N.
size()78   unsigned size() const { return N ? N->getNumOperands() : 0u; }
79   DIType *operator[](unsigned I) const {
80     return cast_or_null<DIType>(N->getOperand(I));
81   }
82 
83   class iterator : std::iterator<std::input_iterator_tag, DIType *,
84                                  std::ptrdiff_t, void, DIType *> {
85     MDNode::op_iterator I = nullptr;
86 
87   public:
88     iterator() = default;
iterator(MDNode::op_iterator I)89     explicit iterator(MDNode::op_iterator I) : I(I) {}
90 
91     DIType *operator*() const { return cast_or_null<DIType>(*I); }
92 
93     iterator &operator++() {
94       ++I;
95       return *this;
96     }
97 
98     iterator operator++(int) {
99       iterator Temp(*this);
100       ++I;
101       return Temp;
102     }
103 
104     bool operator==(const iterator &X) const { return I == X.I; }
105     bool operator!=(const iterator &X) const { return I != X.I; }
106   };
107 
108   // FIXME: Fix callers and remove condition on N.
begin()109   iterator begin() const { return N ? iterator(N->op_begin()) : iterator(); }
end()110   iterator end() const { return N ? iterator(N->op_end()) : iterator(); }
111 };
112 
113 /// Tagged DWARF-like metadata node.
114 ///
115 /// A metadata node with a DWARF tag (i.e., a constant named \c DW_TAG_*,
116 /// defined in llvm/BinaryFormat/Dwarf.h).  Called \a DINode because it's
117 /// potentially used for non-DWARF output.
118 class DINode : public MDNode {
119   friend class LLVMContextImpl;
120   friend class MDNode;
121 
122 protected:
123   DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
124          ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = None)
MDNode(C,ID,Storage,Ops1,Ops2)125       : MDNode(C, ID, Storage, Ops1, Ops2) {
126     assert(Tag < 1u << 16);
127     SubclassData16 = Tag;
128   }
129   ~DINode() = default;
130 
getOperandAs(unsigned I)131   template <class Ty> Ty *getOperandAs(unsigned I) const {
132     return cast_or_null<Ty>(getOperand(I));
133   }
134 
getStringOperand(unsigned I)135   StringRef getStringOperand(unsigned I) const {
136     if (auto *S = getOperandAs<MDString>(I))
137       return S->getString();
138     return StringRef();
139   }
140 
getCanonicalMDString(LLVMContext & Context,StringRef S)141   static MDString *getCanonicalMDString(LLVMContext &Context, StringRef S) {
142     if (S.empty())
143       return nullptr;
144     return MDString::get(Context, S);
145   }
146 
147   /// Allow subclasses to mutate the tag.
setTag(unsigned Tag)148   void setTag(unsigned Tag) { SubclassData16 = Tag; }
149 
150 public:
getTag()151   unsigned getTag() const { return SubclassData16; }
152 
153   /// Debug info flags.
154   ///
155   /// The three accessibility flags are mutually exclusive and rolled together
156   /// in the first two bits.
157   enum DIFlags : uint32_t {
158 #define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID,
159 #define DI_FLAG_LARGEST_NEEDED
160 #include "llvm/IR/DebugInfoFlags.def"
161     FlagAccessibility = FlagPrivate | FlagProtected | FlagPublic,
162     FlagPtrToMemberRep = FlagSingleInheritance | FlagMultipleInheritance |
163                          FlagVirtualInheritance,
164     LLVM_MARK_AS_BITMASK_ENUM(FlagLargest)
165   };
166 
167   static DIFlags getFlag(StringRef Flag);
168   static StringRef getFlagString(DIFlags Flag);
169 
170   /// Split up a flags bitfield.
171   ///
172   /// Split \c Flags into \c SplitFlags, a vector of its components.  Returns
173   /// any remaining (unrecognized) bits.
174   static DIFlags splitFlags(DIFlags Flags,
175                             SmallVectorImpl<DIFlags> &SplitFlags);
176 
classof(const Metadata * MD)177   static bool classof(const Metadata *MD) {
178     switch (MD->getMetadataID()) {
179     default:
180       return false;
181     case GenericDINodeKind:
182     case DISubrangeKind:
183     case DIEnumeratorKind:
184     case DIBasicTypeKind:
185     case DIDerivedTypeKind:
186     case DICompositeTypeKind:
187     case DISubroutineTypeKind:
188     case DIFileKind:
189     case DICompileUnitKind:
190     case DISubprogramKind:
191     case DILexicalBlockKind:
192     case DILexicalBlockFileKind:
193     case DINamespaceKind:
194     case DICommonBlockKind:
195     case DITemplateTypeParameterKind:
196     case DITemplateValueParameterKind:
197     case DIGlobalVariableKind:
198     case DILocalVariableKind:
199     case DILabelKind:
200     case DIObjCPropertyKind:
201     case DIImportedEntityKind:
202     case DIModuleKind:
203       return true;
204     }
205   }
206 };
207 
208 /// Generic tagged DWARF-like metadata node.
209 ///
210 /// An un-specialized DWARF-like metadata node.  The first operand is a
211 /// (possibly empty) null-separated \a MDString header that contains arbitrary
212 /// fields.  The remaining operands are \a dwarf_operands(), and are pointers
213 /// to other metadata.
214 class GenericDINode : public DINode {
215   friend class LLVMContextImpl;
216   friend class MDNode;
217 
GenericDINode(LLVMContext & C,StorageType Storage,unsigned Hash,unsigned Tag,ArrayRef<Metadata * > Ops1,ArrayRef<Metadata * > Ops2)218   GenericDINode(LLVMContext &C, StorageType Storage, unsigned Hash,
219                 unsigned Tag, ArrayRef<Metadata *> Ops1,
220                 ArrayRef<Metadata *> Ops2)
221       : DINode(C, GenericDINodeKind, Storage, Tag, Ops1, Ops2) {
222     setHash(Hash);
223   }
~GenericDINode()224   ~GenericDINode() { dropAllReferences(); }
225 
setHash(unsigned Hash)226   void setHash(unsigned Hash) { SubclassData32 = Hash; }
227   void recalculateHash();
228 
229   static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag,
230                                 StringRef Header, ArrayRef<Metadata *> DwarfOps,
231                                 StorageType Storage, bool ShouldCreate = true) {
232     return getImpl(Context, Tag, getCanonicalMDString(Context, Header),
233                    DwarfOps, Storage, ShouldCreate);
234   }
235 
236   static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag,
237                                 MDString *Header, ArrayRef<Metadata *> DwarfOps,
238                                 StorageType Storage, bool ShouldCreate = true);
239 
cloneImpl()240   TempGenericDINode cloneImpl() const {
241     return getTemporary(
242         getContext(), getTag(), getHeader(),
243         SmallVector<Metadata *, 4>(dwarf_op_begin(), dwarf_op_end()));
244   }
245 
246 public:
getHash()247   unsigned getHash() const { return SubclassData32; }
248 
249   DEFINE_MDNODE_GET(GenericDINode, (unsigned Tag, StringRef Header,
250                                     ArrayRef<Metadata *> DwarfOps),
251                     (Tag, Header, DwarfOps))
252   DEFINE_MDNODE_GET(GenericDINode, (unsigned Tag, MDString *Header,
253                                     ArrayRef<Metadata *> DwarfOps),
254                     (Tag, Header, DwarfOps))
255 
256   /// Return a (temporary) clone of this.
clone()257   TempGenericDINode clone() const { return cloneImpl(); }
258 
getTag()259   unsigned getTag() const { return SubclassData16; }
getHeader()260   StringRef getHeader() const { return getStringOperand(0); }
getRawHeader()261   MDString *getRawHeader() const { return getOperandAs<MDString>(0); }
262 
dwarf_op_begin()263   op_iterator dwarf_op_begin() const { return op_begin() + 1; }
dwarf_op_end()264   op_iterator dwarf_op_end() const { return op_end(); }
dwarf_operands()265   op_range dwarf_operands() const {
266     return op_range(dwarf_op_begin(), dwarf_op_end());
267   }
268 
getNumDwarfOperands()269   unsigned getNumDwarfOperands() const { return getNumOperands() - 1; }
getDwarfOperand(unsigned I)270   const MDOperand &getDwarfOperand(unsigned I) const {
271     return getOperand(I + 1);
272   }
replaceDwarfOperandWith(unsigned I,Metadata * New)273   void replaceDwarfOperandWith(unsigned I, Metadata *New) {
274     replaceOperandWith(I + 1, New);
275   }
276 
classof(const Metadata * MD)277   static bool classof(const Metadata *MD) {
278     return MD->getMetadataID() == GenericDINodeKind;
279   }
280 };
281 
282 /// Array subrange.
283 ///
284 /// TODO: Merge into node for DW_TAG_array_type, which should have a custom
285 /// type.
286 class DISubrange : public DINode {
287   friend class LLVMContextImpl;
288   friend class MDNode;
289 
290   int64_t LowerBound;
291 
DISubrange(LLVMContext & C,StorageType Storage,Metadata * Node,int64_t LowerBound,ArrayRef<Metadata * > Ops)292   DISubrange(LLVMContext &C, StorageType Storage, Metadata *Node,
293              int64_t LowerBound, ArrayRef<Metadata *> Ops)
294       : DINode(C, DISubrangeKind, Storage, dwarf::DW_TAG_subrange_type, Ops),
295         LowerBound(LowerBound) {}
296 
297   ~DISubrange() = default;
298 
299   static DISubrange *getImpl(LLVMContext &Context, int64_t Count,
300                              int64_t LowerBound, StorageType Storage,
301                              bool ShouldCreate = true);
302 
303   static DISubrange *getImpl(LLVMContext &Context, Metadata *CountNode,
304                              int64_t LowerBound, StorageType Storage,
305                              bool ShouldCreate = true);
306 
cloneImpl()307   TempDISubrange cloneImpl() const {
308     return getTemporary(getContext(), getRawCountNode(), getLowerBound());
309   }
310 
311 public:
312   DEFINE_MDNODE_GET(DISubrange, (int64_t Count, int64_t LowerBound = 0),
313                     (Count, LowerBound))
314 
315   DEFINE_MDNODE_GET(DISubrange, (Metadata *CountNode, int64_t LowerBound = 0),
316                     (CountNode, LowerBound))
317 
clone()318   TempDISubrange clone() const { return cloneImpl(); }
319 
getLowerBound()320   int64_t getLowerBound() const { return LowerBound; }
321 
getRawCountNode()322   Metadata *getRawCountNode() const {
323     return getOperand(0).get();
324   }
325 
326   typedef PointerUnion<ConstantInt*, DIVariable*> CountType;
327 
getCount()328   CountType getCount() const {
329     if (auto *MD = dyn_cast<ConstantAsMetadata>(getRawCountNode()))
330       return CountType(cast<ConstantInt>(MD->getValue()));
331 
332     if (auto *DV = dyn_cast<DIVariable>(getRawCountNode()))
333       return CountType(DV);
334 
335     return CountType();
336   }
337 
classof(const Metadata * MD)338   static bool classof(const Metadata *MD) {
339     return MD->getMetadataID() == DISubrangeKind;
340   }
341 };
342 
343 /// Enumeration value.
344 ///
345 /// TODO: Add a pointer to the context (DW_TAG_enumeration_type) once that no
346 /// longer creates a type cycle.
347 class DIEnumerator : public DINode {
348   friend class LLVMContextImpl;
349   friend class MDNode;
350 
351   int64_t Value;
DIEnumerator(LLVMContext & C,StorageType Storage,int64_t Value,bool IsUnsigned,ArrayRef<Metadata * > Ops)352   DIEnumerator(LLVMContext &C, StorageType Storage, int64_t Value,
353                bool IsUnsigned, ArrayRef<Metadata *> Ops)
354       : DINode(C, DIEnumeratorKind, Storage, dwarf::DW_TAG_enumerator, Ops),
355         Value(Value) {
356     SubclassData32 = IsUnsigned;
357   }
358   ~DIEnumerator() = default;
359 
360   static DIEnumerator *getImpl(LLVMContext &Context, int64_t Value,
361                                bool IsUnsigned, StringRef Name,
362                                StorageType Storage, bool ShouldCreate = true) {
363     return getImpl(Context, Value, IsUnsigned,
364                    getCanonicalMDString(Context, Name), Storage, ShouldCreate);
365   }
366   static DIEnumerator *getImpl(LLVMContext &Context, int64_t Value,
367                                bool IsUnsigned, MDString *Name,
368                                StorageType Storage, bool ShouldCreate = true);
369 
cloneImpl()370   TempDIEnumerator cloneImpl() const {
371     return getTemporary(getContext(), getValue(), isUnsigned(), getName());
372   }
373 
374 public:
375   DEFINE_MDNODE_GET(DIEnumerator, (int64_t Value, bool IsUnsigned, StringRef Name),
376                     (Value, IsUnsigned, Name))
377   DEFINE_MDNODE_GET(DIEnumerator, (int64_t Value, bool IsUnsigned, MDString *Name),
378                     (Value, IsUnsigned, Name))
379 
clone()380   TempDIEnumerator clone() const { return cloneImpl(); }
381 
getValue()382   int64_t getValue() const { return Value; }
isUnsigned()383   bool isUnsigned() const { return SubclassData32; }
getName()384   StringRef getName() const { return getStringOperand(0); }
385 
getRawName()386   MDString *getRawName() const { return getOperandAs<MDString>(0); }
387 
classof(const Metadata * MD)388   static bool classof(const Metadata *MD) {
389     return MD->getMetadataID() == DIEnumeratorKind;
390   }
391 };
392 
393 /// Base class for scope-like contexts.
394 ///
395 /// Base class for lexical scopes and types (which are also declaration
396 /// contexts).
397 ///
398 /// TODO: Separate the concepts of declaration contexts and lexical scopes.
399 class DIScope : public DINode {
400 protected:
DIScope(LLVMContext & C,unsigned ID,StorageType Storage,unsigned Tag,ArrayRef<Metadata * > Ops)401   DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
402           ArrayRef<Metadata *> Ops)
403       : DINode(C, ID, Storage, Tag, Ops) {}
404   ~DIScope() = default;
405 
406 public:
getFile()407   DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
408 
409   inline StringRef getFilename() const;
410   inline StringRef getDirectory() const;
411   inline Optional<StringRef> getSource() const;
412 
413   StringRef getName() const;
414   DIScope *getScope() const;
415 
416   /// Return the raw underlying file.
417   ///
418   /// A \a DIFile is a \a DIScope, but it doesn't point at a separate file (it
419   /// \em is the file).  If \c this is an \a DIFile, we need to return \c this.
420   /// Otherwise, return the first operand, which is where all other subclasses
421   /// store their file pointer.
getRawFile()422   Metadata *getRawFile() const {
423     return isa<DIFile>(this) ? const_cast<DIScope *>(this)
424                              : static_cast<Metadata *>(getOperand(0));
425   }
426 
classof(const Metadata * MD)427   static bool classof(const Metadata *MD) {
428     switch (MD->getMetadataID()) {
429     default:
430       return false;
431     case DIBasicTypeKind:
432     case DIDerivedTypeKind:
433     case DICompositeTypeKind:
434     case DISubroutineTypeKind:
435     case DIFileKind:
436     case DICompileUnitKind:
437     case DISubprogramKind:
438     case DILexicalBlockKind:
439     case DILexicalBlockFileKind:
440     case DINamespaceKind:
441     case DICommonBlockKind:
442     case DIModuleKind:
443       return true;
444     }
445   }
446 };
447 
448 /// File.
449 ///
450 /// TODO: Merge with directory/file node (including users).
451 /// TODO: Canonicalize paths on creation.
452 class DIFile : public DIScope {
453   friend class LLVMContextImpl;
454   friend class MDNode;
455 
456 public:
457   /// Which algorithm (e.g. MD5) a checksum was generated with.
458   ///
459   /// The encoding is explicit because it is used directly in Bitcode. The
460   /// value 0 is reserved to indicate the absence of a checksum in Bitcode.
461   enum ChecksumKind {
462     // The first variant was originally CSK_None, encoded as 0. The new
463     // internal representation removes the need for this by wrapping the
464     // ChecksumInfo in an Optional, but to preserve Bitcode compatibility the 0
465     // encoding is reserved.
466     CSK_MD5 = 1,
467     CSK_SHA1 = 2,
468     CSK_Last = CSK_SHA1 // Should be last enumeration.
469   };
470 
471   /// A single checksum, represented by a \a Kind and a \a Value (a string).
472   template <typename T>
473   struct ChecksumInfo {
474     /// The kind of checksum which \a Value encodes.
475     ChecksumKind Kind;
476     /// The string value of the checksum.
477     T Value;
478 
ChecksumInfoChecksumInfo479     ChecksumInfo(ChecksumKind Kind, T Value) : Kind(Kind), Value(Value) { }
480     ~ChecksumInfo() = default;
481     bool operator==(const ChecksumInfo<T> &X) const {
482       return Kind == X.Kind && Value == X.Value;
483     }
484     bool operator!=(const ChecksumInfo<T> &X) const { return !(*this == X); }
getKindAsStringChecksumInfo485     StringRef getKindAsString() const { return getChecksumKindAsString(Kind); }
486   };
487 
488 private:
489   Optional<ChecksumInfo<MDString *>> Checksum;
490   Optional<MDString *> Source;
491 
DIFile(LLVMContext & C,StorageType Storage,Optional<ChecksumInfo<MDString * >> CS,Optional<MDString * > Src,ArrayRef<Metadata * > Ops)492   DIFile(LLVMContext &C, StorageType Storage,
493          Optional<ChecksumInfo<MDString *>> CS, Optional<MDString *> Src,
494          ArrayRef<Metadata *> Ops)
495       : DIScope(C, DIFileKind, Storage, dwarf::DW_TAG_file_type, Ops),
496         Checksum(CS), Source(Src) {}
497   ~DIFile() = default;
498 
499   static DIFile *getImpl(LLVMContext &Context, StringRef Filename,
500                          StringRef Directory,
501                          Optional<ChecksumInfo<StringRef>> CS,
502                          Optional<StringRef> Source,
503                          StorageType Storage, bool ShouldCreate = true) {
504     Optional<ChecksumInfo<MDString *>> MDChecksum;
505     if (CS)
506       MDChecksum.emplace(CS->Kind, getCanonicalMDString(Context, CS->Value));
507     return getImpl(Context, getCanonicalMDString(Context, Filename),
508                    getCanonicalMDString(Context, Directory), MDChecksum,
509                    Source ? Optional<MDString *>(getCanonicalMDString(Context, *Source)) : None,
510                    Storage, ShouldCreate);
511   }
512   static DIFile *getImpl(LLVMContext &Context, MDString *Filename,
513                          MDString *Directory,
514                          Optional<ChecksumInfo<MDString *>> CS,
515                          Optional<MDString *> Source, StorageType Storage,
516                          bool ShouldCreate = true);
517 
cloneImpl()518   TempDIFile cloneImpl() const {
519     return getTemporary(getContext(), getFilename(), getDirectory(),
520                         getChecksum(), getSource());
521   }
522 
523 public:
524   DEFINE_MDNODE_GET(DIFile, (StringRef Filename, StringRef Directory,
525                              Optional<ChecksumInfo<StringRef>> CS = None,
526                              Optional<StringRef> Source = None),
527                     (Filename, Directory, CS, Source))
528   DEFINE_MDNODE_GET(DIFile, (MDString * Filename, MDString *Directory,
529                              Optional<ChecksumInfo<MDString *>> CS = None,
530                              Optional<MDString *> Source = None),
531                     (Filename, Directory, CS, Source))
532 
clone()533   TempDIFile clone() const { return cloneImpl(); }
534 
getFilename()535   StringRef getFilename() const { return getStringOperand(0); }
getDirectory()536   StringRef getDirectory() const { return getStringOperand(1); }
getChecksum()537   Optional<ChecksumInfo<StringRef>> getChecksum() const {
538     Optional<ChecksumInfo<StringRef>> StringRefChecksum;
539     if (Checksum)
540       StringRefChecksum.emplace(Checksum->Kind, Checksum->Value->getString());
541     return StringRefChecksum;
542   }
getSource()543   Optional<StringRef> getSource() const {
544     return Source ? Optional<StringRef>((*Source)->getString()) : None;
545   }
546 
getRawFilename()547   MDString *getRawFilename() const { return getOperandAs<MDString>(0); }
getRawDirectory()548   MDString *getRawDirectory() const { return getOperandAs<MDString>(1); }
getRawChecksum()549   Optional<ChecksumInfo<MDString *>> getRawChecksum() const { return Checksum; }
getRawSource()550   Optional<MDString *> getRawSource() const { return Source; }
551 
552   static StringRef getChecksumKindAsString(ChecksumKind CSKind);
553   static Optional<ChecksumKind> getChecksumKind(StringRef CSKindStr);
554 
classof(const Metadata * MD)555   static bool classof(const Metadata *MD) {
556     return MD->getMetadataID() == DIFileKind;
557   }
558 };
559 
getFilename()560 StringRef DIScope::getFilename() const {
561   if (auto *F = getFile())
562     return F->getFilename();
563   return "";
564 }
565 
getDirectory()566 StringRef DIScope::getDirectory() const {
567   if (auto *F = getFile())
568     return F->getDirectory();
569   return "";
570 }
571 
getSource()572 Optional<StringRef> DIScope::getSource() const {
573   if (auto *F = getFile())
574     return F->getSource();
575   return None;
576 }
577 
578 /// Base class for types.
579 ///
580 /// TODO: Remove the hardcoded name and context, since many types don't use
581 /// them.
582 /// TODO: Split up flags.
583 class DIType : public DIScope {
584   unsigned Line;
585   DIFlags Flags;
586   uint64_t SizeInBits;
587   uint64_t OffsetInBits;
588   uint32_t AlignInBits;
589 
590 protected:
DIType(LLVMContext & C,unsigned ID,StorageType Storage,unsigned Tag,unsigned Line,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DIFlags Flags,ArrayRef<Metadata * > Ops)591   DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
592          unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
593          uint64_t OffsetInBits, DIFlags Flags, ArrayRef<Metadata *> Ops)
594       : DIScope(C, ID, Storage, Tag, Ops) {
595     init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
596   }
597   ~DIType() = default;
598 
init(unsigned Line,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DIFlags Flags)599   void init(unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
600             uint64_t OffsetInBits, DIFlags Flags) {
601     this->Line = Line;
602     this->Flags = Flags;
603     this->SizeInBits = SizeInBits;
604     this->AlignInBits = AlignInBits;
605     this->OffsetInBits = OffsetInBits;
606   }
607 
608   /// Change fields in place.
mutate(unsigned Tag,unsigned Line,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DIFlags Flags)609   void mutate(unsigned Tag, unsigned Line, uint64_t SizeInBits,
610               uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags) {
611     assert(isDistinct() && "Only distinct nodes can mutate");
612     setTag(Tag);
613     init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
614   }
615 
616 public:
clone()617   TempDIType clone() const {
618     return TempDIType(cast<DIType>(MDNode::clone().release()));
619   }
620 
getLine()621   unsigned getLine() const { return Line; }
getSizeInBits()622   uint64_t getSizeInBits() const { return SizeInBits; }
getAlignInBits()623   uint32_t getAlignInBits() const { return AlignInBits; }
getAlignInBytes()624   uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
getOffsetInBits()625   uint64_t getOffsetInBits() const { return OffsetInBits; }
getFlags()626   DIFlags getFlags() const { return Flags; }
627 
getScope()628   DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
getName()629   StringRef getName() const { return getStringOperand(2); }
630 
631 
getRawScope()632   Metadata *getRawScope() const { return getOperand(1); }
getRawName()633   MDString *getRawName() const { return getOperandAs<MDString>(2); }
634 
635   /// Returns a new temporary DIType with updated Flags
cloneWithFlags(DIFlags NewFlags)636   TempDIType cloneWithFlags(DIFlags NewFlags) const {
637     auto NewTy = clone();
638     NewTy->Flags = NewFlags;
639     return NewTy;
640   }
641 
isPrivate()642   bool isPrivate() const {
643     return (getFlags() & FlagAccessibility) == FlagPrivate;
644   }
isProtected()645   bool isProtected() const {
646     return (getFlags() & FlagAccessibility) == FlagProtected;
647   }
isPublic()648   bool isPublic() const {
649     return (getFlags() & FlagAccessibility) == FlagPublic;
650   }
isForwardDecl()651   bool isForwardDecl() const { return getFlags() & FlagFwdDecl; }
isAppleBlockExtension()652   bool isAppleBlockExtension() const { return getFlags() & FlagAppleBlock; }
isVirtual()653   bool isVirtual() const { return getFlags() & FlagVirtual; }
isArtificial()654   bool isArtificial() const { return getFlags() & FlagArtificial; }
isObjectPointer()655   bool isObjectPointer() const { return getFlags() & FlagObjectPointer; }
isObjcClassComplete()656   bool isObjcClassComplete() const {
657     return getFlags() & FlagObjcClassComplete;
658   }
isVector()659   bool isVector() const { return getFlags() & FlagVector; }
isBitField()660   bool isBitField() const { return getFlags() & FlagBitField; }
isStaticMember()661   bool isStaticMember() const { return getFlags() & FlagStaticMember; }
isLValueReference()662   bool isLValueReference() const { return getFlags() & FlagLValueReference; }
isRValueReference()663   bool isRValueReference() const { return getFlags() & FlagRValueReference; }
isTypePassByValue()664   bool isTypePassByValue() const { return getFlags() & FlagTypePassByValue; }
isTypePassByReference()665   bool isTypePassByReference() const {
666     return getFlags() & FlagTypePassByReference;
667   }
isBigEndian()668   bool isBigEndian() const { return getFlags() & FlagBigEndian; }
isLittleEndian()669   bool isLittleEndian() const { return getFlags() & FlagLittleEndian; }
getExportSymbols()670   bool getExportSymbols() const { return getFlags() & FlagExportSymbols; }
671 
classof(const Metadata * MD)672   static bool classof(const Metadata *MD) {
673     switch (MD->getMetadataID()) {
674     default:
675       return false;
676     case DIBasicTypeKind:
677     case DIDerivedTypeKind:
678     case DICompositeTypeKind:
679     case DISubroutineTypeKind:
680       return true;
681     }
682   }
683 };
684 
685 /// Basic type, like 'int' or 'float'.
686 ///
687 /// TODO: Split out DW_TAG_unspecified_type.
688 /// TODO: Drop unused accessors.
689 class DIBasicType : public DIType {
690   friend class LLVMContextImpl;
691   friend class MDNode;
692 
693   unsigned Encoding;
694 
DIBasicType(LLVMContext & C,StorageType Storage,unsigned Tag,uint64_t SizeInBits,uint32_t AlignInBits,unsigned Encoding,DIFlags Flags,ArrayRef<Metadata * > Ops)695   DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag,
696               uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
697               DIFlags Flags, ArrayRef<Metadata *> Ops)
698       : DIType(C, DIBasicTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0,
699                Flags, Ops),
700         Encoding(Encoding) {}
701   ~DIBasicType() = default;
702 
703   static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
704                               StringRef Name, uint64_t SizeInBits,
705                               uint32_t AlignInBits, unsigned Encoding,
706                               DIFlags Flags, StorageType Storage,
707                               bool ShouldCreate = true) {
708     return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
709                    SizeInBits, AlignInBits, Encoding, Flags, Storage,
710                    ShouldCreate);
711   }
712   static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
713                               MDString *Name, uint64_t SizeInBits,
714                               uint32_t AlignInBits, unsigned Encoding,
715                               DIFlags Flags, StorageType Storage,
716                               bool ShouldCreate = true);
717 
cloneImpl()718   TempDIBasicType cloneImpl() const {
719     return getTemporary(getContext(), getTag(), getName(), getSizeInBits(),
720                         getAlignInBits(), getEncoding(), getFlags());
721   }
722 
723 public:
724   DEFINE_MDNODE_GET(DIBasicType, (unsigned Tag, StringRef Name),
725                     (Tag, Name, 0, 0, 0, FlagZero))
726   DEFINE_MDNODE_GET(DIBasicType,
727                     (unsigned Tag, StringRef Name, uint64_t SizeInBits,
728                      uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
729                     (Tag, Name, SizeInBits, AlignInBits, Encoding, Flags))
730   DEFINE_MDNODE_GET(DIBasicType,
731                     (unsigned Tag, MDString *Name, uint64_t SizeInBits,
732                      uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
733                     (Tag, Name, SizeInBits, AlignInBits, Encoding, Flags))
734 
clone()735   TempDIBasicType clone() const { return cloneImpl(); }
736 
getEncoding()737   unsigned getEncoding() const { return Encoding; }
738 
739   enum class Signedness { Signed, Unsigned };
740 
741   /// Return the signedness of this type, or None if this type is neither
742   /// signed nor unsigned.
743   Optional<Signedness> getSignedness() const;
744 
classof(const Metadata * MD)745   static bool classof(const Metadata *MD) {
746     return MD->getMetadataID() == DIBasicTypeKind;
747   }
748 };
749 
750 /// Derived types.
751 ///
752 /// This includes qualified types, pointers, references, friends, typedefs, and
753 /// class members.
754 ///
755 /// TODO: Split out members (inheritance, fields, methods, etc.).
756 class DIDerivedType : public DIType {
757   friend class LLVMContextImpl;
758   friend class MDNode;
759 
760   /// The DWARF address space of the memory pointed to or referenced by a
761   /// pointer or reference type respectively.
762   Optional<unsigned> DWARFAddressSpace;
763 
DIDerivedType(LLVMContext & C,StorageType Storage,unsigned Tag,unsigned Line,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,Optional<unsigned> DWARFAddressSpace,DIFlags Flags,ArrayRef<Metadata * > Ops)764   DIDerivedType(LLVMContext &C, StorageType Storage, unsigned Tag,
765                 unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
766                 uint64_t OffsetInBits, Optional<unsigned> DWARFAddressSpace,
767                 DIFlags Flags, ArrayRef<Metadata *> Ops)
768       : DIType(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits,
769                AlignInBits, OffsetInBits, Flags, Ops),
770         DWARFAddressSpace(DWARFAddressSpace) {}
771   ~DIDerivedType() = default;
772 
773   static DIDerivedType *
774   getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
775           unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
776           uint32_t AlignInBits, uint64_t OffsetInBits,
777           Optional<unsigned> DWARFAddressSpace, DIFlags Flags,
778           Metadata *ExtraData, StorageType Storage, bool ShouldCreate = true) {
779     return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
780                    Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits,
781                    DWARFAddressSpace, Flags, ExtraData, Storage, ShouldCreate);
782   }
783   static DIDerivedType *getImpl(LLVMContext &Context, unsigned Tag,
784                                 MDString *Name, Metadata *File, unsigned Line,
785                                 Metadata *Scope, Metadata *BaseType,
786                                 uint64_t SizeInBits, uint32_t AlignInBits,
787                                 uint64_t OffsetInBits,
788                                 Optional<unsigned> DWARFAddressSpace,
789                                 DIFlags Flags, Metadata *ExtraData,
790                                 StorageType Storage, bool ShouldCreate = true);
791 
cloneImpl()792   TempDIDerivedType cloneImpl() const {
793     return getTemporary(getContext(), getTag(), getName(), getFile(), getLine(),
794                         getScope(), getBaseType(), getSizeInBits(),
795                         getAlignInBits(), getOffsetInBits(),
796                         getDWARFAddressSpace(), getFlags(), getExtraData());
797   }
798 
799 public:
800   DEFINE_MDNODE_GET(DIDerivedType,
801                     (unsigned Tag, MDString *Name, Metadata *File,
802                      unsigned Line, Metadata *Scope, Metadata *BaseType,
803                      uint64_t SizeInBits, uint32_t AlignInBits,
804                      uint64_t OffsetInBits,
805                      Optional<unsigned> DWARFAddressSpace, DIFlags Flags,
806                      Metadata *ExtraData = nullptr),
807                     (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
808                      AlignInBits, OffsetInBits, DWARFAddressSpace, Flags,
809                      ExtraData))
810   DEFINE_MDNODE_GET(DIDerivedType,
811                     (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
812                      DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
813                      uint32_t AlignInBits, uint64_t OffsetInBits,
814                      Optional<unsigned> DWARFAddressSpace, DIFlags Flags,
815                      Metadata *ExtraData = nullptr),
816                     (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
817                      AlignInBits, OffsetInBits, DWARFAddressSpace, Flags,
818                      ExtraData))
819 
clone()820   TempDIDerivedType clone() const { return cloneImpl(); }
821 
822   /// Get the base type this is derived from.
getBaseType()823   DIType *getBaseType() const { return cast_or_null<DIType>(getRawBaseType()); }
getRawBaseType()824   Metadata *getRawBaseType() const { return getOperand(3); }
825 
826   /// \returns The DWARF address space of the memory pointed to or referenced by
827   /// a pointer or reference type respectively.
getDWARFAddressSpace()828   Optional<unsigned> getDWARFAddressSpace() const { return DWARFAddressSpace; }
829 
830   /// Get extra data associated with this derived type.
831   ///
832   /// Class type for pointer-to-members, objective-c property node for ivars,
833   /// global constant wrapper for static members, or virtual base pointer offset
834   /// for inheritance.
835   ///
836   /// TODO: Separate out types that need this extra operand: pointer-to-member
837   /// types and member fields (static members and ivars).
getExtraData()838   Metadata *getExtraData() const { return getRawExtraData(); }
getRawExtraData()839   Metadata *getRawExtraData() const { return getOperand(4); }
840 
841   /// Get casted version of extra data.
842   /// @{
getClassType()843   DIType *getClassType() const {
844     assert(getTag() == dwarf::DW_TAG_ptr_to_member_type);
845     return cast_or_null<DIType>(getExtraData());
846   }
847 
getObjCProperty()848   DIObjCProperty *getObjCProperty() const {
849     return dyn_cast_or_null<DIObjCProperty>(getExtraData());
850   }
851 
getVBPtrOffset()852   uint32_t getVBPtrOffset() const {
853     assert(getTag() == dwarf::DW_TAG_inheritance);
854     if (auto *CM = cast_or_null<ConstantAsMetadata>(getExtraData()))
855       if (auto *CI = dyn_cast_or_null<ConstantInt>(CM->getValue()))
856         return static_cast<uint32_t>(CI->getZExtValue());
857     return 0;
858   }
859 
getStorageOffsetInBits()860   Constant *getStorageOffsetInBits() const {
861     assert(getTag() == dwarf::DW_TAG_member && isBitField());
862     if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData()))
863       return C->getValue();
864     return nullptr;
865   }
866 
getConstant()867   Constant *getConstant() const {
868     assert(getTag() == dwarf::DW_TAG_member && isStaticMember());
869     if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData()))
870       return C->getValue();
871     return nullptr;
872   }
getDiscriminantValue()873   Constant *getDiscriminantValue() const {
874     assert(getTag() == dwarf::DW_TAG_member && !isStaticMember());
875     if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData()))
876       return C->getValue();
877     return nullptr;
878   }
879   /// @}
880 
classof(const Metadata * MD)881   static bool classof(const Metadata *MD) {
882     return MD->getMetadataID() == DIDerivedTypeKind;
883   }
884 };
885 
886 /// Composite types.
887 ///
888 /// TODO: Detach from DerivedTypeBase (split out MDEnumType?).
889 /// TODO: Create a custom, unrelated node for DW_TAG_array_type.
890 class DICompositeType : public DIType {
891   friend class LLVMContextImpl;
892   friend class MDNode;
893 
894   unsigned RuntimeLang;
895 
DICompositeType(LLVMContext & C,StorageType Storage,unsigned Tag,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DIFlags Flags,ArrayRef<Metadata * > Ops)896   DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag,
897                   unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits,
898                   uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
899                   ArrayRef<Metadata *> Ops)
900       : DIType(C, DICompositeTypeKind, Storage, Tag, Line, SizeInBits,
901                AlignInBits, OffsetInBits, Flags, Ops),
902         RuntimeLang(RuntimeLang) {}
903   ~DICompositeType() = default;
904 
905   /// Change fields in place.
mutate(unsigned Tag,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DIFlags Flags)906   void mutate(unsigned Tag, unsigned Line, unsigned RuntimeLang,
907               uint64_t SizeInBits, uint32_t AlignInBits,
908               uint64_t OffsetInBits, DIFlags Flags) {
909     assert(isDistinct() && "Only distinct nodes can mutate");
910     assert(getRawIdentifier() && "Only ODR-uniqued nodes should mutate");
911     this->RuntimeLang = RuntimeLang;
912     DIType::mutate(Tag, Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
913   }
914 
915   static DICompositeType *
916   getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
917           unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
918           uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
919           DINodeArray Elements, unsigned RuntimeLang, DIType *VTableHolder,
920           DITemplateParameterArray TemplateParams, StringRef Identifier,
921           DIDerivedType *Discriminator, StorageType Storage,
922           bool ShouldCreate = true) {
923     return getImpl(
924         Context, Tag, getCanonicalMDString(Context, Name), File, Line, Scope,
925         BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, Elements.get(),
926         RuntimeLang, VTableHolder, TemplateParams.get(),
927         getCanonicalMDString(Context, Identifier), Discriminator, Storage, ShouldCreate);
928   }
929   static DICompositeType *
930   getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
931           unsigned Line, Metadata *Scope, Metadata *BaseType,
932           uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
933           DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
934           Metadata *VTableHolder, Metadata *TemplateParams,
935           MDString *Identifier, Metadata *Discriminator,
936           StorageType Storage, bool ShouldCreate = true);
937 
cloneImpl()938   TempDICompositeType cloneImpl() const {
939     return getTemporary(getContext(), getTag(), getName(), getFile(), getLine(),
940                         getScope(), getBaseType(), getSizeInBits(),
941                         getAlignInBits(), getOffsetInBits(), getFlags(),
942                         getElements(), getRuntimeLang(), getVTableHolder(),
943                         getTemplateParams(), getIdentifier(), getDiscriminator());
944   }
945 
946 public:
947   DEFINE_MDNODE_GET(DICompositeType,
948                     (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
949                      DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
950                      uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
951                      DINodeArray Elements, unsigned RuntimeLang,
952                      DIType *VTableHolder,
953                      DITemplateParameterArray TemplateParams = nullptr,
954                      StringRef Identifier = "",
955                      DIDerivedType *Discriminator = nullptr),
956                     (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
957                      AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
958                      VTableHolder, TemplateParams, Identifier, Discriminator))
959   DEFINE_MDNODE_GET(DICompositeType,
960                     (unsigned Tag, MDString *Name, Metadata *File,
961                      unsigned Line, Metadata *Scope, Metadata *BaseType,
962                      uint64_t SizeInBits, uint32_t AlignInBits,
963                      uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
964                      unsigned RuntimeLang, Metadata *VTableHolder,
965                      Metadata *TemplateParams = nullptr,
966                      MDString *Identifier = nullptr,
967                      Metadata *Discriminator = nullptr),
968                     (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
969                      AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
970                      VTableHolder, TemplateParams, Identifier, Discriminator))
971 
clone()972   TempDICompositeType clone() const { return cloneImpl(); }
973 
974   /// Get a DICompositeType with the given ODR identifier.
975   ///
976   /// If \a LLVMContext::isODRUniquingDebugTypes(), gets the mapped
977   /// DICompositeType for the given ODR \c Identifier.  If none exists, creates
978   /// a new node.
979   ///
980   /// Else, returns \c nullptr.
981   static DICompositeType *
982   getODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
983              MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
984              Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
985              uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
986              unsigned RuntimeLang, Metadata *VTableHolder,
987              Metadata *TemplateParams, Metadata *Discriminator);
988   static DICompositeType *getODRTypeIfExists(LLVMContext &Context,
989                                              MDString &Identifier);
990 
991   /// Build a DICompositeType with the given ODR identifier.
992   ///
993   /// Looks up the mapped DICompositeType for the given ODR \c Identifier.  If
994   /// it doesn't exist, creates a new one.  If it does exist and \a
995   /// isForwardDecl(), and the new arguments would be a definition, mutates the
996   /// the type in place.  In either case, returns the type.
997   ///
998   /// If not \a LLVMContext::isODRUniquingDebugTypes(), this function returns
999   /// nullptr.
1000   static DICompositeType *
1001   buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1002                MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1003                Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
1004                uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
1005                unsigned RuntimeLang, Metadata *VTableHolder,
1006                Metadata *TemplateParams, Metadata *Discriminator);
1007 
getBaseType()1008   DIType *getBaseType() const { return cast_or_null<DIType>(getRawBaseType()); }
getElements()1009   DINodeArray getElements() const {
1010     return cast_or_null<MDTuple>(getRawElements());
1011   }
getVTableHolder()1012   DIType *getVTableHolder() const {
1013     return cast_or_null<DIType>(getRawVTableHolder());
1014   }
getTemplateParams()1015   DITemplateParameterArray getTemplateParams() const {
1016     return cast_or_null<MDTuple>(getRawTemplateParams());
1017   }
getIdentifier()1018   StringRef getIdentifier() const { return getStringOperand(7); }
getRuntimeLang()1019   unsigned getRuntimeLang() const { return RuntimeLang; }
1020 
getRawBaseType()1021   Metadata *getRawBaseType() const { return getOperand(3); }
getRawElements()1022   Metadata *getRawElements() const { return getOperand(4); }
getRawVTableHolder()1023   Metadata *getRawVTableHolder() const { return getOperand(5); }
getRawTemplateParams()1024   Metadata *getRawTemplateParams() const { return getOperand(6); }
getRawIdentifier()1025   MDString *getRawIdentifier() const { return getOperandAs<MDString>(7); }
getRawDiscriminator()1026   Metadata *getRawDiscriminator() const { return getOperand(8); }
getDiscriminator()1027   DIDerivedType *getDiscriminator() const { return getOperandAs<DIDerivedType>(8); }
1028 
1029   /// Replace operands.
1030   ///
1031   /// If this \a isUniqued() and not \a isResolved(), on a uniquing collision
1032   /// this will be RAUW'ed and deleted.  Use a \a TrackingMDRef to keep track
1033   /// of its movement if necessary.
1034   /// @{
replaceElements(DINodeArray Elements)1035   void replaceElements(DINodeArray Elements) {
1036 #ifndef NDEBUG
1037     for (DINode *Op : getElements())
1038       assert(is_contained(Elements->operands(), Op) &&
1039              "Lost a member during member list replacement");
1040 #endif
1041     replaceOperandWith(4, Elements.get());
1042   }
1043 
replaceVTableHolder(DIType * VTableHolder)1044   void replaceVTableHolder(DIType *VTableHolder) {
1045     replaceOperandWith(5, VTableHolder);
1046   }
1047 
replaceTemplateParams(DITemplateParameterArray TemplateParams)1048   void replaceTemplateParams(DITemplateParameterArray TemplateParams) {
1049     replaceOperandWith(6, TemplateParams.get());
1050   }
1051   /// @}
1052 
classof(const Metadata * MD)1053   static bool classof(const Metadata *MD) {
1054     return MD->getMetadataID() == DICompositeTypeKind;
1055   }
1056 };
1057 
1058 /// Type array for a subprogram.
1059 ///
1060 /// TODO: Fold the array of types in directly as operands.
1061 class DISubroutineType : public DIType {
1062   friend class LLVMContextImpl;
1063   friend class MDNode;
1064 
1065   /// The calling convention used with DW_AT_calling_convention. Actually of
1066   /// type dwarf::CallingConvention.
1067   uint8_t CC;
1068 
DISubroutineType(LLVMContext & C,StorageType Storage,DIFlags Flags,uint8_t CC,ArrayRef<Metadata * > Ops)1069   DISubroutineType(LLVMContext &C, StorageType Storage, DIFlags Flags,
1070                    uint8_t CC, ArrayRef<Metadata *> Ops)
1071       : DIType(C, DISubroutineTypeKind, Storage, dwarf::DW_TAG_subroutine_type,
1072                0, 0, 0, 0, Flags, Ops),
1073         CC(CC) {}
1074   ~DISubroutineType() = default;
1075 
1076   static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
1077                                    uint8_t CC, DITypeRefArray TypeArray,
1078                                    StorageType Storage,
1079                                    bool ShouldCreate = true) {
1080     return getImpl(Context, Flags, CC, TypeArray.get(), Storage, ShouldCreate);
1081   }
1082   static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
1083                                    uint8_t CC, Metadata *TypeArray,
1084                                    StorageType Storage,
1085                                    bool ShouldCreate = true);
1086 
cloneImpl()1087   TempDISubroutineType cloneImpl() const {
1088     return getTemporary(getContext(), getFlags(), getCC(), getTypeArray());
1089   }
1090 
1091 public:
1092   DEFINE_MDNODE_GET(DISubroutineType,
1093                     (DIFlags Flags, uint8_t CC, DITypeRefArray TypeArray),
1094                     (Flags, CC, TypeArray))
1095   DEFINE_MDNODE_GET(DISubroutineType,
1096                     (DIFlags Flags, uint8_t CC, Metadata *TypeArray),
1097                     (Flags, CC, TypeArray))
1098 
clone()1099   TempDISubroutineType clone() const { return cloneImpl(); }
1100 
getCC()1101   uint8_t getCC() const { return CC; }
1102 
getTypeArray()1103   DITypeRefArray getTypeArray() const {
1104     return cast_or_null<MDTuple>(getRawTypeArray());
1105   }
1106 
getRawTypeArray()1107   Metadata *getRawTypeArray() const { return getOperand(3); }
1108 
classof(const Metadata * MD)1109   static bool classof(const Metadata *MD) {
1110     return MD->getMetadataID() == DISubroutineTypeKind;
1111   }
1112 };
1113 
1114 /// Compile unit.
1115 class DICompileUnit : public DIScope {
1116   friend class LLVMContextImpl;
1117   friend class MDNode;
1118 
1119 public:
1120   enum DebugEmissionKind : unsigned {
1121     NoDebug = 0,
1122     FullDebug,
1123     LineTablesOnly,
1124     DebugDirectivesOnly,
1125     LastEmissionKind = DebugDirectivesOnly
1126   };
1127 
1128   enum class DebugNameTableKind : unsigned {
1129     Default = 0,
1130     GNU = 1,
1131     None = 2,
1132     LastDebugNameTableKind = None
1133   };
1134 
1135   static Optional<DebugEmissionKind> getEmissionKind(StringRef Str);
1136   static const char *emissionKindString(DebugEmissionKind EK);
1137   static Optional<DebugNameTableKind> getNameTableKind(StringRef Str);
1138   static const char *nameTableKindString(DebugNameTableKind PK);
1139 
1140 private:
1141   unsigned SourceLanguage;
1142   bool IsOptimized;
1143   unsigned RuntimeVersion;
1144   unsigned EmissionKind;
1145   uint64_t DWOId;
1146   bool SplitDebugInlining;
1147   bool DebugInfoForProfiling;
1148   unsigned NameTableKind;
1149   bool RangesBaseAddress;
1150 
DICompileUnit(LLVMContext & C,StorageType Storage,unsigned SourceLanguage,bool IsOptimized,unsigned RuntimeVersion,unsigned EmissionKind,uint64_t DWOId,bool SplitDebugInlining,bool DebugInfoForProfiling,unsigned NameTableKind,bool RangesBaseAddress,ArrayRef<Metadata * > Ops)1151   DICompileUnit(LLVMContext &C, StorageType Storage, unsigned SourceLanguage,
1152                 bool IsOptimized, unsigned RuntimeVersion,
1153                 unsigned EmissionKind, uint64_t DWOId, bool SplitDebugInlining,
1154                 bool DebugInfoForProfiling, unsigned NameTableKind,
1155                 bool RangesBaseAddress, ArrayRef<Metadata *> Ops)
1156       : DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops),
1157         SourceLanguage(SourceLanguage), IsOptimized(IsOptimized),
1158         RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind),
1159         DWOId(DWOId), SplitDebugInlining(SplitDebugInlining),
1160         DebugInfoForProfiling(DebugInfoForProfiling),
1161         NameTableKind(NameTableKind), RangesBaseAddress(RangesBaseAddress) {
1162     assert(Storage != Uniqued);
1163   }
1164   ~DICompileUnit() = default;
1165 
1166   static DICompileUnit *
1167   getImpl(LLVMContext &Context, unsigned SourceLanguage, DIFile *File,
1168           StringRef Producer, bool IsOptimized, StringRef Flags,
1169           unsigned RuntimeVersion, StringRef SplitDebugFilename,
1170           unsigned EmissionKind, DICompositeTypeArray EnumTypes,
1171           DIScopeArray RetainedTypes,
1172           DIGlobalVariableExpressionArray GlobalVariables,
1173           DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
1174           uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling,
1175           unsigned NameTableKind, bool RangesBaseAddress, StorageType Storage,
1176           bool ShouldCreate = true) {
1177     return getImpl(Context, SourceLanguage, File,
1178                    getCanonicalMDString(Context, Producer), IsOptimized,
1179                    getCanonicalMDString(Context, Flags), RuntimeVersion,
1180                    getCanonicalMDString(Context, SplitDebugFilename),
1181                    EmissionKind, EnumTypes.get(), RetainedTypes.get(),
1182                    GlobalVariables.get(), ImportedEntities.get(), Macros.get(),
1183                    DWOId, SplitDebugInlining, DebugInfoForProfiling,
1184                    NameTableKind, RangesBaseAddress, Storage, ShouldCreate);
1185   }
1186   static DICompileUnit *
1187   getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File,
1188           MDString *Producer, bool IsOptimized, MDString *Flags,
1189           unsigned RuntimeVersion, MDString *SplitDebugFilename,
1190           unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
1191           Metadata *GlobalVariables, Metadata *ImportedEntities,
1192           Metadata *Macros, uint64_t DWOId, bool SplitDebugInlining,
1193           bool DebugInfoForProfiling, unsigned NameTableKind,
1194           bool RangesBaseAddress, StorageType Storage, bool ShouldCreate = true);
1195 
cloneImpl()1196   TempDICompileUnit cloneImpl() const {
1197     return getTemporary(
1198         getContext(), getSourceLanguage(), getFile(), getProducer(),
1199         isOptimized(), getFlags(), getRuntimeVersion(), getSplitDebugFilename(),
1200         getEmissionKind(), getEnumTypes(), getRetainedTypes(),
1201         getGlobalVariables(), getImportedEntities(), getMacros(), DWOId,
1202         getSplitDebugInlining(), getDebugInfoForProfiling(), getNameTableKind(),
1203         getRangesBaseAddress());
1204   }
1205 
1206 public:
1207   static void get() = delete;
1208   static void getIfExists() = delete;
1209 
1210   DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(
1211       DICompileUnit,
1212       (unsigned SourceLanguage, DIFile *File, StringRef Producer,
1213        bool IsOptimized, StringRef Flags, unsigned RuntimeVersion,
1214        StringRef SplitDebugFilename, DebugEmissionKind EmissionKind,
1215        DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes,
1216        DIGlobalVariableExpressionArray GlobalVariables,
1217        DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
1218        uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling,
1219        DebugNameTableKind NameTableKind, bool RangesBaseAddress),
1220       (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
1221        SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
1222        GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining,
1223        DebugInfoForProfiling, (unsigned)NameTableKind, RangesBaseAddress))
1224   DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(
1225       DICompileUnit,
1226       (unsigned SourceLanguage, Metadata *File, MDString *Producer,
1227        bool IsOptimized, MDString *Flags, unsigned RuntimeVersion,
1228        MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes,
1229        Metadata *RetainedTypes, Metadata *GlobalVariables,
1230        Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId,
1231        bool SplitDebugInlining, bool DebugInfoForProfiling,
1232        unsigned NameTableKind, bool RangesBaseAddress),
1233       (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
1234        SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
1235        GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining,
1236        DebugInfoForProfiling, NameTableKind, RangesBaseAddress))
1237 
clone()1238   TempDICompileUnit clone() const { return cloneImpl(); }
1239 
getSourceLanguage()1240   unsigned getSourceLanguage() const { return SourceLanguage; }
isOptimized()1241   bool isOptimized() const { return IsOptimized; }
getRuntimeVersion()1242   unsigned getRuntimeVersion() const { return RuntimeVersion; }
getEmissionKind()1243   DebugEmissionKind getEmissionKind() const {
1244     return (DebugEmissionKind)EmissionKind;
1245   }
isDebugDirectivesOnly()1246   bool isDebugDirectivesOnly() const {
1247     return EmissionKind == DebugDirectivesOnly;
1248   }
getDebugInfoForProfiling()1249   bool getDebugInfoForProfiling() const { return DebugInfoForProfiling; }
getNameTableKind()1250   DebugNameTableKind getNameTableKind() const {
1251     return (DebugNameTableKind)NameTableKind;
1252   }
getRangesBaseAddress()1253   bool getRangesBaseAddress() const {
1254     return RangesBaseAddress; }
getProducer()1255   StringRef getProducer() const {
1256     return getStringOperand(1); }
getFlags()1257   StringRef getFlags() const {
1258     return getStringOperand(2); }
getSplitDebugFilename()1259   StringRef getSplitDebugFilename() const {
1260     return getStringOperand(3); }
getEnumTypes()1261   DICompositeTypeArray getEnumTypes() const {
1262     return cast_or_null<MDTuple>(getRawEnumTypes());
1263   }
getRetainedTypes()1264   DIScopeArray getRetainedTypes() const {
1265     return cast_or_null<MDTuple>(getRawRetainedTypes());
1266   }
getGlobalVariables()1267   DIGlobalVariableExpressionArray getGlobalVariables() const {
1268     return cast_or_null<MDTuple>(getRawGlobalVariables());
1269   }
getImportedEntities()1270   DIImportedEntityArray getImportedEntities() const {
1271     return cast_or_null<MDTuple>(getRawImportedEntities());
1272   }
getMacros()1273   DIMacroNodeArray getMacros() const {
1274     return cast_or_null<MDTuple>(getRawMacros());
1275   }
getDWOId()1276   uint64_t getDWOId() const { return DWOId; }
setDWOId(uint64_t DwoId)1277   void setDWOId(uint64_t DwoId) { DWOId = DwoId; }
getSplitDebugInlining()1278   bool getSplitDebugInlining() const { return SplitDebugInlining; }
setSplitDebugInlining(bool SplitDebugInlining)1279   void setSplitDebugInlining(bool SplitDebugInlining) {
1280     this->SplitDebugInlining = SplitDebugInlining;
1281   }
1282 
getRawProducer()1283   MDString *getRawProducer() const { return getOperandAs<MDString>(1); }
getRawFlags()1284   MDString *getRawFlags() const { return getOperandAs<MDString>(2); }
getRawSplitDebugFilename()1285   MDString *getRawSplitDebugFilename() const {
1286     return getOperandAs<MDString>(3);
1287   }
getRawEnumTypes()1288   Metadata *getRawEnumTypes() const { return getOperand(4); }
getRawRetainedTypes()1289   Metadata *getRawRetainedTypes() const { return getOperand(5); }
getRawGlobalVariables()1290   Metadata *getRawGlobalVariables() const { return getOperand(6); }
getRawImportedEntities()1291   Metadata *getRawImportedEntities() const { return getOperand(7); }
getRawMacros()1292   Metadata *getRawMacros() const { return getOperand(8); }
1293 
1294   /// Replace arrays.
1295   ///
1296   /// If this \a isUniqued() and not \a isResolved(), it will be RAUW'ed and
1297   /// deleted on a uniquing collision.  In practice, uniquing collisions on \a
1298   /// DICompileUnit should be fairly rare.
1299   /// @{
replaceEnumTypes(DICompositeTypeArray N)1300   void replaceEnumTypes(DICompositeTypeArray N) {
1301     replaceOperandWith(4, N.get());
1302   }
replaceRetainedTypes(DITypeArray N)1303   void replaceRetainedTypes(DITypeArray N) {
1304     replaceOperandWith(5, N.get());
1305   }
replaceGlobalVariables(DIGlobalVariableExpressionArray N)1306   void replaceGlobalVariables(DIGlobalVariableExpressionArray N) {
1307     replaceOperandWith(6, N.get());
1308   }
replaceImportedEntities(DIImportedEntityArray N)1309   void replaceImportedEntities(DIImportedEntityArray N) {
1310     replaceOperandWith(7, N.get());
1311   }
replaceMacros(DIMacroNodeArray N)1312   void replaceMacros(DIMacroNodeArray N) { replaceOperandWith(8, N.get()); }
1313   /// @}
1314 
classof(const Metadata * MD)1315   static bool classof(const Metadata *MD) {
1316     return MD->getMetadataID() == DICompileUnitKind;
1317   }
1318 };
1319 
1320 /// A scope for locals.
1321 ///
1322 /// A legal scope for lexical blocks, local variables, and debug info
1323 /// locations.  Subclasses are \a DISubprogram, \a DILexicalBlock, and \a
1324 /// DILexicalBlockFile.
1325 class DILocalScope : public DIScope {
1326 protected:
DILocalScope(LLVMContext & C,unsigned ID,StorageType Storage,unsigned Tag,ArrayRef<Metadata * > Ops)1327   DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
1328                ArrayRef<Metadata *> Ops)
1329       : DIScope(C, ID, Storage, Tag, Ops) {}
1330   ~DILocalScope() = default;
1331 
1332 public:
1333   /// Get the subprogram for this scope.
1334   ///
1335   /// Return this if it's an \a DISubprogram; otherwise, look up the scope
1336   /// chain.
1337   DISubprogram *getSubprogram() const;
1338 
1339   /// Get the first non DILexicalBlockFile scope of this scope.
1340   ///
1341   /// Return this if it's not a \a DILexicalBlockFIle; otherwise, look up the
1342   /// scope chain.
1343   DILocalScope *getNonLexicalBlockFileScope() const;
1344 
classof(const Metadata * MD)1345   static bool classof(const Metadata *MD) {
1346     return MD->getMetadataID() == DISubprogramKind ||
1347            MD->getMetadataID() == DILexicalBlockKind ||
1348            MD->getMetadataID() == DILexicalBlockFileKind;
1349   }
1350 };
1351 
1352 /// Debug location.
1353 ///
1354 /// A debug location in source code, used for debug info and otherwise.
1355 class DILocation : public MDNode {
1356   friend class LLVMContextImpl;
1357   friend class MDNode;
1358 
1359   DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
1360              unsigned Column, ArrayRef<Metadata *> MDs, bool ImplicitCode);
~DILocation()1361   ~DILocation() { dropAllReferences(); }
1362 
1363   static DILocation *getImpl(LLVMContext &Context, unsigned Line,
1364                              unsigned Column, Metadata *Scope,
1365                              Metadata *InlinedAt, bool ImplicitCode,
1366                              StorageType Storage, bool ShouldCreate = true);
1367   static DILocation *getImpl(LLVMContext &Context, unsigned Line,
1368                              unsigned Column, DILocalScope *Scope,
1369                              DILocation *InlinedAt, bool ImplicitCode,
1370                              StorageType Storage, bool ShouldCreate = true) {
1371     return getImpl(Context, Line, Column, static_cast<Metadata *>(Scope),
1372                    static_cast<Metadata *>(InlinedAt), ImplicitCode, Storage,
1373                    ShouldCreate);
1374   }
1375 
1376   /// With a given unsigned int \p U, use up to 13 bits to represent it.
1377   /// old_bit 1~5  --> new_bit 1~5
1378   /// old_bit 6~12 --> new_bit 7~13
1379   /// new_bit_6 is 0 if higher bits (7~13) are all 0
getPrefixEncodingFromUnsigned(unsigned U)1380   static unsigned getPrefixEncodingFromUnsigned(unsigned U) {
1381     U &= 0xfff;
1382     return U > 0x1f ? (((U & 0xfe0) << 1) | (U & 0x1f) | 0x20) : U;
1383   }
1384 
1385   /// Reverse transformation as getPrefixEncodingFromUnsigned.
getUnsignedFromPrefixEncoding(unsigned U)1386   static unsigned getUnsignedFromPrefixEncoding(unsigned U) {
1387     if (U & 1)
1388       return 0;
1389     U >>= 1;
1390     return (U & 0x20) ? (((U >> 1) & 0xfe0) | (U & 0x1f)) : (U & 0x1f);
1391   }
1392 
1393   /// Returns the next component stored in discriminator.
getNextComponentInDiscriminator(unsigned D)1394   static unsigned getNextComponentInDiscriminator(unsigned D) {
1395     if ((D & 1) == 0)
1396       return D >> ((D & 0x40) ? 14 : 7);
1397     else
1398       return D >> 1;
1399   }
1400 
cloneImpl()1401   TempDILocation cloneImpl() const {
1402     // Get the raw scope/inlinedAt since it is possible to invoke this on
1403     // a DILocation containing temporary metadata.
1404     return getTemporary(getContext(), getLine(), getColumn(), getRawScope(),
1405                         getRawInlinedAt(), isImplicitCode());
1406   }
1407 
encodeComponent(unsigned C)1408   static unsigned encodeComponent(unsigned C) {
1409     return (C == 0) ? 1U : (getPrefixEncodingFromUnsigned(C) << 1);
1410   }
1411 
encodingBits(unsigned C)1412   static unsigned encodingBits(unsigned C) {
1413     return (C == 0) ? 1 : (C > 0x1f ? 14 : 7);
1414   }
1415 
1416 public:
1417   // Disallow replacing operands.
1418   void replaceOperandWith(unsigned I, Metadata *New) = delete;
1419 
1420   DEFINE_MDNODE_GET(DILocation,
1421                     (unsigned Line, unsigned Column, Metadata *Scope,
1422                      Metadata *InlinedAt = nullptr, bool ImplicitCode = false),
1423                     (Line, Column, Scope, InlinedAt, ImplicitCode))
1424   DEFINE_MDNODE_GET(DILocation,
1425                     (unsigned Line, unsigned Column, DILocalScope *Scope,
1426                      DILocation *InlinedAt = nullptr,
1427                      bool ImplicitCode = false),
1428                     (Line, Column, Scope, InlinedAt, ImplicitCode))
1429 
1430   /// Return a (temporary) clone of this.
clone()1431   TempDILocation clone() const { return cloneImpl(); }
1432 
getLine()1433   unsigned getLine() const { return SubclassData32; }
getColumn()1434   unsigned getColumn() const { return SubclassData16; }
getScope()1435   DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); }
1436 
getInlinedAt()1437   DILocation *getInlinedAt() const {
1438     return cast_or_null<DILocation>(getRawInlinedAt());
1439   }
1440 
1441   /// Check if the location corresponds to an implicit code.
1442   /// When the ImplicitCode flag is true, it means that the Instruction
1443   /// with this DILocation has been added by the front-end but it hasn't been
1444   /// written explicitly by the user (e.g. cleanup stuff in C++ put on a closing
1445   /// bracket). It's useful for code coverage to not show a counter on "empty"
1446   /// lines.
isImplicitCode()1447   bool isImplicitCode() const { return ImplicitCode; }
setImplicitCode(bool ImplicitCode)1448   void setImplicitCode(bool ImplicitCode) { this->ImplicitCode = ImplicitCode; }
1449 
getFile()1450   DIFile *getFile() const { return getScope()->getFile(); }
getFilename()1451   StringRef getFilename() const { return getScope()->getFilename(); }
getDirectory()1452   StringRef getDirectory() const { return getScope()->getDirectory(); }
getSource()1453   Optional<StringRef> getSource() const { return getScope()->getSource(); }
1454 
1455   /// Get the scope where this is inlined.
1456   ///
1457   /// Walk through \a getInlinedAt() and return \a getScope() from the deepest
1458   /// location.
getInlinedAtScope()1459   DILocalScope *getInlinedAtScope() const {
1460     if (auto *IA = getInlinedAt())
1461       return IA->getInlinedAtScope();
1462     return getScope();
1463   }
1464 
1465   /// Get the DWARF discriminator.
1466   ///
1467   /// DWARF discriminators distinguish identical file locations between
1468   /// instructions that are on different basic blocks.
1469   ///
1470   /// There are 3 components stored in discriminator, from lower bits:
1471   ///
1472   /// Base discriminator: assigned by AddDiscriminators pass to identify IRs
1473   ///                     that are defined by the same source line, but
1474   ///                     different basic blocks.
1475   /// Duplication factor: assigned by optimizations that will scale down
1476   ///                     the execution frequency of the original IR.
1477   /// Copy Identifier: assigned by optimizations that clones the IR.
1478   ///                  Each copy of the IR will be assigned an identifier.
1479   ///
1480   /// Encoding:
1481   ///
1482   /// The above 3 components are encoded into a 32bit unsigned integer in
1483   /// order. If the lowest bit is 1, the current component is empty, and the
1484   /// next component will start in the next bit. Otherwise, the current
1485   /// component is non-empty, and its content starts in the next bit. The
1486   /// value of each components is either 5 bit or 12 bit: if the 7th bit
1487   /// is 0, the bit 2~6 (5 bits) are used to represent the component; if the
1488   /// 7th bit is 1, the bit 2~6 (5 bits) and 8~14 (7 bits) are combined to
1489   /// represent the component. Thus, the number of bits used for a component
1490   /// is either 0 (if it and all the next components are empty); 1 - if it is
1491   /// empty; 7 - if its value is up to and including 0x1f (lsb and msb are both
1492   /// 0); or 14, if its value is up to and including 0x1ff. Note that the last
1493   /// component is also capped at 0x1ff, even in the case when both first
1494   /// components are 0, and we'd technically have 29 bits available.
1495   ///
1496   /// For precise control over the data being encoded in the discriminator,
1497   /// use encodeDiscriminator/decodeDiscriminator.
1498 
1499   inline unsigned getDiscriminator() const;
1500 
1501   /// Returns a new DILocation with updated \p Discriminator.
1502   inline const DILocation *cloneWithDiscriminator(unsigned Discriminator) const;
1503 
1504   /// Returns a new DILocation with updated base discriminator \p BD. Only the
1505   /// base discriminator is set in the new DILocation, the other encoded values
1506   /// are elided.
1507   /// If the discriminator cannot be encoded, the function returns None.
1508   inline Optional<const DILocation *> cloneWithBaseDiscriminator(unsigned BD) const;
1509 
1510   /// Returns the duplication factor stored in the discriminator, or 1 if no
1511   /// duplication factor (or 0) is encoded.
1512   inline unsigned getDuplicationFactor() const;
1513 
1514   /// Returns the copy identifier stored in the discriminator.
1515   inline unsigned getCopyIdentifier() const;
1516 
1517   /// Returns the base discriminator stored in the discriminator.
1518   inline unsigned getBaseDiscriminator() const;
1519 
1520   /// Returns a new DILocation with duplication factor \p DF * current
1521   /// duplication factor encoded in the discriminator. The current duplication
1522   /// factor is as defined by getDuplicationFactor().
1523   /// Returns None if encoding failed.
1524   inline Optional<const DILocation *> cloneByMultiplyingDuplicationFactor(unsigned DF) const;
1525 
1526   /// When two instructions are combined into a single instruction we also
1527   /// need to combine the original locations into a single location.
1528   ///
1529   /// When the locations are the same we can use either location. When they
1530   /// differ, we need a third location which is distinct from either. If they
1531   /// have the same file/line but have a different discriminator we could
1532   /// create a location with a new discriminator. If they are from different
1533   /// files/lines the location is ambiguous and can't be represented in a line
1534   /// entry. In this case, if \p GenerateLocation is true, we will set the
1535   /// merged debug location as line 0 of the nearest common scope where the two
1536   /// locations are inlined from.
1537   ///
1538   /// \p GenerateLocation: Whether the merged location can be generated when
1539   /// \p LocA and \p LocB differ.
1540   static const DILocation *getMergedLocation(const DILocation *LocA,
1541                                              const DILocation *LocB);
1542 
1543   /// Returns the base discriminator for a given encoded discriminator \p D.
getBaseDiscriminatorFromDiscriminator(unsigned D)1544   static unsigned getBaseDiscriminatorFromDiscriminator(unsigned D) {
1545     return getUnsignedFromPrefixEncoding(D);
1546   }
1547 
1548   /// Raw encoding of the discriminator. APIs such as cloneWithDuplicationFactor
1549   /// have certain special case behavior (e.g. treating empty duplication factor
1550   /// as the value '1').
1551   /// This API, in conjunction with cloneWithDiscriminator, may be used to encode
1552   /// the raw values provided. \p BD: base discriminator \p DF: duplication factor
1553   /// \p CI: copy index
1554   /// The return is None if the values cannot be encoded in 32 bits - for
1555   /// example, values for BD or DF larger than 12 bits. Otherwise, the return
1556   /// is the encoded value.
1557   static Optional<unsigned> encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI);
1558 
1559   /// Raw decoder for values in an encoded discriminator D.
1560   static void decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF,
1561                                   unsigned &CI);
1562 
1563   /// Returns the duplication factor for a given encoded discriminator \p D, or
1564   /// 1 if no value or 0 is encoded.
getDuplicationFactorFromDiscriminator(unsigned D)1565   static unsigned getDuplicationFactorFromDiscriminator(unsigned D) {
1566     D = getNextComponentInDiscriminator(D);
1567     unsigned Ret = getUnsignedFromPrefixEncoding(D);
1568     if (Ret == 0)
1569       return 1;
1570     return Ret;
1571   }
1572 
1573   /// Returns the copy identifier for a given encoded discriminator \p D.
getCopyIdentifierFromDiscriminator(unsigned D)1574   static unsigned getCopyIdentifierFromDiscriminator(unsigned D) {
1575     return getUnsignedFromPrefixEncoding(getNextComponentInDiscriminator(
1576         getNextComponentInDiscriminator(D)));
1577   }
1578 
1579 
getRawScope()1580   Metadata *getRawScope() const { return getOperand(0); }
getRawInlinedAt()1581   Metadata *getRawInlinedAt() const {
1582     if (getNumOperands() == 2)
1583       return getOperand(1);
1584     return nullptr;
1585   }
1586 
classof(const Metadata * MD)1587   static bool classof(const Metadata *MD) {
1588     return MD->getMetadataID() == DILocationKind;
1589   }
1590 };
1591 
1592 /// Subprogram description.
1593 class DISubprogram : public DILocalScope {
1594   friend class LLVMContextImpl;
1595   friend class MDNode;
1596 
1597   unsigned Line;
1598   unsigned ScopeLine;
1599   unsigned VirtualIndex;
1600 
1601   /// In the MS ABI, the implicit 'this' parameter is adjusted in the prologue
1602   /// of method overrides from secondary bases by this amount. It may be
1603   /// negative.
1604   int ThisAdjustment;
1605 
1606 public:
1607   /// Debug info subprogram flags.
1608   enum DISPFlags : uint32_t {
1609 #define HANDLE_DISP_FLAG(ID, NAME) SPFlag##NAME = ID,
1610 #define DISP_FLAG_LARGEST_NEEDED
1611 #include "llvm/IR/DebugInfoFlags.def"
1612     SPFlagNonvirtual = SPFlagZero,
1613     SPFlagVirtuality = SPFlagVirtual | SPFlagPureVirtual,
1614     LLVM_MARK_AS_BITMASK_ENUM(SPFlagLargest)
1615   };
1616 
1617   static DISPFlags getFlag(StringRef Flag);
1618   static StringRef getFlagString(DISPFlags Flag);
1619 
1620   /// Split up a flags bitfield for easier printing.
1621   ///
1622   /// Split \c Flags into \c SplitFlags, a vector of its components.  Returns
1623   /// any remaining (unrecognized) bits.
1624   static DISPFlags splitFlags(DISPFlags Flags,
1625                               SmallVectorImpl<DISPFlags> &SplitFlags);
1626 
1627   // Helper for converting old bitfields to new flags word.
1628   static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition,
1629                              bool IsOptimized,
1630                              unsigned Virtuality = SPFlagNonvirtual,
1631                              bool IsMainSubprogram = false) {
1632     // We're assuming virtuality is the low-order field.
1633     static_assert(
1634         int(SPFlagVirtual) == int(dwarf::DW_VIRTUALITY_virtual) &&
1635             int(SPFlagPureVirtual) == int(dwarf::DW_VIRTUALITY_pure_virtual),
1636         "Virtuality constant mismatch");
1637     return static_cast<DISPFlags>(
1638         (Virtuality & SPFlagVirtuality) |
1639         (IsLocalToUnit ? SPFlagLocalToUnit : SPFlagZero) |
1640         (IsDefinition ? SPFlagDefinition : SPFlagZero) |
1641         (IsOptimized ? SPFlagOptimized : SPFlagZero) |
1642         (IsMainSubprogram ? SPFlagMainSubprogram : SPFlagZero));
1643   }
1644 
1645 private:
1646   DIFlags Flags;
1647   DISPFlags SPFlags;
1648 
DISubprogram(LLVMContext & C,StorageType Storage,unsigned Line,unsigned ScopeLine,unsigned VirtualIndex,int ThisAdjustment,DIFlags Flags,DISPFlags SPFlags,ArrayRef<Metadata * > Ops)1649   DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
1650                unsigned ScopeLine, unsigned VirtualIndex, int ThisAdjustment,
1651                DIFlags Flags, DISPFlags SPFlags, ArrayRef<Metadata *> Ops)
1652       : DILocalScope(C, DISubprogramKind, Storage, dwarf::DW_TAG_subprogram,
1653                      Ops),
1654         Line(Line), ScopeLine(ScopeLine), VirtualIndex(VirtualIndex),
1655         ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags) {
1656     static_assert(dwarf::DW_VIRTUALITY_max < 4, "Virtuality out of range");
1657   }
1658   ~DISubprogram() = default;
1659 
1660   static DISubprogram *
1661   getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
1662           StringRef LinkageName, DIFile *File, unsigned Line,
1663           DISubroutineType *Type, unsigned ScopeLine, DIType *ContainingType,
1664           unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags,
1665           DISPFlags SPFlags, DICompileUnit *Unit,
1666           DITemplateParameterArray TemplateParams, DISubprogram *Declaration,
1667           DINodeArray RetainedNodes, DITypeArray ThrownTypes,
1668           StorageType Storage, bool ShouldCreate = true) {
1669     return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
1670                    getCanonicalMDString(Context, LinkageName), File, Line, Type,
1671                    ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
1672                    Flags, SPFlags, Unit, TemplateParams.get(), Declaration,
1673                    RetainedNodes.get(), ThrownTypes.get(), Storage,
1674                    ShouldCreate);
1675   }
1676   static DISubprogram *getImpl(LLVMContext &Context, Metadata *Scope,
1677                                MDString *Name, MDString *LinkageName,
1678                                Metadata *File, unsigned Line, Metadata *Type,
1679                                unsigned ScopeLine, Metadata *ContainingType,
1680                                unsigned VirtualIndex, int ThisAdjustment,
1681                                DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1682                                Metadata *TemplateParams, Metadata *Declaration,
1683                                Metadata *RetainedNodes, Metadata *ThrownTypes,
1684                                StorageType Storage, bool ShouldCreate = true);
1685 
cloneImpl()1686   TempDISubprogram cloneImpl() const {
1687     return getTemporary(getContext(), getScope(), getName(), getLinkageName(),
1688                         getFile(), getLine(), getType(), getScopeLine(),
1689                         getContainingType(), getVirtualIndex(),
1690                         getThisAdjustment(), getFlags(), getSPFlags(),
1691                         getUnit(), getTemplateParams(), getDeclaration(),
1692                         getRetainedNodes(), getThrownTypes());
1693   }
1694 
1695 public:
1696   DEFINE_MDNODE_GET(
1697       DISubprogram,
1698       (DIScope * Scope, StringRef Name, StringRef LinkageName, DIFile *File,
1699        unsigned Line, DISubroutineType *Type, unsigned ScopeLine,
1700        DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
1701        DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit,
1702        DITemplateParameterArray TemplateParams = nullptr,
1703        DISubprogram *Declaration = nullptr, DINodeArray RetainedNodes = nullptr,
1704        DITypeArray ThrownTypes = nullptr),
1705       (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
1706        VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
1707        Declaration, RetainedNodes, ThrownTypes))
1708 
1709   DEFINE_MDNODE_GET(
1710       DISubprogram,
1711       (Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File,
1712        unsigned Line, Metadata *Type, unsigned ScopeLine,
1713        Metadata *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
1714        DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1715        Metadata *TemplateParams = nullptr, Metadata *Declaration = nullptr,
1716        Metadata *RetainedNodes = nullptr, Metadata *ThrownTypes = nullptr),
1717       (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
1718        VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
1719        Declaration, RetainedNodes, ThrownTypes))
1720 
clone()1721   TempDISubprogram clone() const { return cloneImpl(); }
1722 
1723   /// Returns a new temporary DISubprogram with updated Flags
cloneWithFlags(DIFlags NewFlags)1724   TempDISubprogram cloneWithFlags(DIFlags NewFlags) const {
1725     auto NewSP = clone();
1726     NewSP->Flags = NewFlags;
1727     return NewSP;
1728   }
1729 
1730 public:
getLine()1731   unsigned getLine() const { return Line; }
getVirtuality()1732   unsigned getVirtuality() const { return getSPFlags() & SPFlagVirtuality; }
getVirtualIndex()1733   unsigned getVirtualIndex() const { return VirtualIndex; }
getThisAdjustment()1734   int getThisAdjustment() const { return ThisAdjustment; }
getScopeLine()1735   unsigned getScopeLine() const { return ScopeLine; }
getFlags()1736   DIFlags getFlags() const { return Flags; }
getSPFlags()1737   DISPFlags getSPFlags() const { return SPFlags; }
isLocalToUnit()1738   bool isLocalToUnit() const { return getSPFlags() & SPFlagLocalToUnit; }
isDefinition()1739   bool isDefinition() const { return getSPFlags() & SPFlagDefinition; }
isOptimized()1740   bool isOptimized() const { return getSPFlags() & SPFlagOptimized; }
isMainSubprogram()1741   bool isMainSubprogram() const { return getSPFlags() & SPFlagMainSubprogram; }
1742 
isArtificial()1743   bool isArtificial() const { return getFlags() & FlagArtificial; }
isPrivate()1744   bool isPrivate() const {
1745     return (getFlags() & FlagAccessibility) == FlagPrivate;
1746   }
isProtected()1747   bool isProtected() const {
1748     return (getFlags() & FlagAccessibility) == FlagProtected;
1749   }
isPublic()1750   bool isPublic() const {
1751     return (getFlags() & FlagAccessibility) == FlagPublic;
1752   }
isExplicit()1753   bool isExplicit() const { return getFlags() & FlagExplicit; }
isPrototyped()1754   bool isPrototyped() const { return getFlags() & FlagPrototyped; }
areAllCallsDescribed()1755   bool areAllCallsDescribed() const {
1756     return getFlags() & FlagAllCallsDescribed;
1757   }
isPure()1758   bool isPure() const { return getSPFlags() & SPFlagPure; }
isElemental()1759   bool isElemental() const { return getSPFlags() & SPFlagElemental; }
isRecursive()1760   bool isRecursive() const { return getSPFlags() & SPFlagRecursive; }
isObjCDirect()1761   bool isObjCDirect() const { return getSPFlags() & SPFlagObjCDirect; }
1762 
1763   /// Check if this is deleted member function.
1764   ///
1765   /// Return true if this subprogram is a C++11 special
1766   /// member function declared deleted.
isDeleted()1767   bool isDeleted() const { return getSPFlags() & SPFlagDeleted; }
1768 
1769   /// Check if this is reference-qualified.
1770   ///
1771   /// Return true if this subprogram is a C++11 reference-qualified non-static
1772   /// member function (void foo() &).
isLValueReference()1773   bool isLValueReference() const { return getFlags() & FlagLValueReference; }
1774 
1775   /// Check if this is rvalue-reference-qualified.
1776   ///
1777   /// Return true if this subprogram is a C++11 rvalue-reference-qualified
1778   /// non-static member function (void foo() &&).
isRValueReference()1779   bool isRValueReference() const { return getFlags() & FlagRValueReference; }
1780 
1781   /// Check if this is marked as noreturn.
1782   ///
1783   /// Return true if this subprogram is C++11 noreturn or C11 _Noreturn
isNoReturn()1784   bool isNoReturn() const { return getFlags() & FlagNoReturn; }
1785 
1786   // Check if this routine is a compiler-generated thunk.
1787   //
1788   // Returns true if this subprogram is a thunk generated by the compiler.
isThunk()1789   bool isThunk() const { return getFlags() & FlagThunk; }
1790 
getScope()1791   DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
1792 
getName()1793   StringRef getName() const { return getStringOperand(2); }
getLinkageName()1794   StringRef getLinkageName() const { return getStringOperand(3); }
1795 
getType()1796   DISubroutineType *getType() const {
1797     return cast_or_null<DISubroutineType>(getRawType());
1798   }
getContainingType()1799   DIType *getContainingType() const {
1800     return cast_or_null<DIType>(getRawContainingType());
1801   }
1802 
getUnit()1803   DICompileUnit *getUnit() const {
1804     return cast_or_null<DICompileUnit>(getRawUnit());
1805   }
replaceUnit(DICompileUnit * CU)1806   void replaceUnit(DICompileUnit *CU) { replaceOperandWith(5, CU); }
getTemplateParams()1807   DITemplateParameterArray getTemplateParams() const {
1808     return cast_or_null<MDTuple>(getRawTemplateParams());
1809   }
getDeclaration()1810   DISubprogram *getDeclaration() const {
1811     return cast_or_null<DISubprogram>(getRawDeclaration());
1812   }
getRetainedNodes()1813   DINodeArray getRetainedNodes() const {
1814     return cast_or_null<MDTuple>(getRawRetainedNodes());
1815   }
getThrownTypes()1816   DITypeArray getThrownTypes() const {
1817     return cast_or_null<MDTuple>(getRawThrownTypes());
1818   }
1819 
getRawScope()1820   Metadata *getRawScope() const { return getOperand(1); }
getRawName()1821   MDString *getRawName() const { return getOperandAs<MDString>(2); }
getRawLinkageName()1822   MDString *getRawLinkageName() const { return getOperandAs<MDString>(3); }
getRawType()1823   Metadata *getRawType() const { return getOperand(4); }
getRawUnit()1824   Metadata *getRawUnit() const { return getOperand(5); }
getRawDeclaration()1825   Metadata *getRawDeclaration() const { return getOperand(6); }
getRawRetainedNodes()1826   Metadata *getRawRetainedNodes() const { return getOperand(7); }
getRawContainingType()1827   Metadata *getRawContainingType() const {
1828     return getNumOperands() > 8 ? getOperandAs<Metadata>(8) : nullptr;
1829   }
getRawTemplateParams()1830   Metadata *getRawTemplateParams() const {
1831     return getNumOperands() > 9 ? getOperandAs<Metadata>(9) : nullptr;
1832   }
getRawThrownTypes()1833   Metadata *getRawThrownTypes() const {
1834     return getNumOperands() > 10 ? getOperandAs<Metadata>(10) : nullptr;
1835   }
1836 
1837   /// Check if this subprogram describes the given function.
1838   ///
1839   /// FIXME: Should this be looking through bitcasts?
1840   bool describes(const Function *F) const;
1841 
classof(const Metadata * MD)1842   static bool classof(const Metadata *MD) {
1843     return MD->getMetadataID() == DISubprogramKind;
1844   }
1845 };
1846 
1847 class DILexicalBlockBase : public DILocalScope {
1848 protected:
DILexicalBlockBase(LLVMContext & C,unsigned ID,StorageType Storage,ArrayRef<Metadata * > Ops)1849   DILexicalBlockBase(LLVMContext &C, unsigned ID, StorageType Storage,
1850                      ArrayRef<Metadata *> Ops)
1851       : DILocalScope(C, ID, Storage, dwarf::DW_TAG_lexical_block, Ops) {}
1852   ~DILexicalBlockBase() = default;
1853 
1854 public:
getScope()1855   DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); }
1856 
getRawScope()1857   Metadata *getRawScope() const { return getOperand(1); }
1858 
classof(const Metadata * MD)1859   static bool classof(const Metadata *MD) {
1860     return MD->getMetadataID() == DILexicalBlockKind ||
1861            MD->getMetadataID() == DILexicalBlockFileKind;
1862   }
1863 };
1864 
1865 class DILexicalBlock : public DILexicalBlockBase {
1866   friend class LLVMContextImpl;
1867   friend class MDNode;
1868 
1869   unsigned Line;
1870   uint16_t Column;
1871 
DILexicalBlock(LLVMContext & C,StorageType Storage,unsigned Line,unsigned Column,ArrayRef<Metadata * > Ops)1872   DILexicalBlock(LLVMContext &C, StorageType Storage, unsigned Line,
1873                  unsigned Column, ArrayRef<Metadata *> Ops)
1874       : DILexicalBlockBase(C, DILexicalBlockKind, Storage, Ops), Line(Line),
1875         Column(Column) {
1876     assert(Column < (1u << 16) && "Expected 16-bit column");
1877   }
1878   ~DILexicalBlock() = default;
1879 
1880   static DILexicalBlock *getImpl(LLVMContext &Context, DILocalScope *Scope,
1881                                  DIFile *File, unsigned Line, unsigned Column,
1882                                  StorageType Storage,
1883                                  bool ShouldCreate = true) {
1884     return getImpl(Context, static_cast<Metadata *>(Scope),
1885                    static_cast<Metadata *>(File), Line, Column, Storage,
1886                    ShouldCreate);
1887   }
1888 
1889   static DILexicalBlock *getImpl(LLVMContext &Context, Metadata *Scope,
1890                                  Metadata *File, unsigned Line, unsigned Column,
1891                                  StorageType Storage, bool ShouldCreate = true);
1892 
cloneImpl()1893   TempDILexicalBlock cloneImpl() const {
1894     return getTemporary(getContext(), getScope(), getFile(), getLine(),
1895                         getColumn());
1896   }
1897 
1898 public:
1899   DEFINE_MDNODE_GET(DILexicalBlock, (DILocalScope * Scope, DIFile *File,
1900                                      unsigned Line, unsigned Column),
1901                     (Scope, File, Line, Column))
1902   DEFINE_MDNODE_GET(DILexicalBlock, (Metadata * Scope, Metadata *File,
1903                                      unsigned Line, unsigned Column),
1904                     (Scope, File, Line, Column))
1905 
clone()1906   TempDILexicalBlock clone() const { return cloneImpl(); }
1907 
getLine()1908   unsigned getLine() const { return Line; }
getColumn()1909   unsigned getColumn() const { return Column; }
1910 
classof(const Metadata * MD)1911   static bool classof(const Metadata *MD) {
1912     return MD->getMetadataID() == DILexicalBlockKind;
1913   }
1914 };
1915 
1916 class DILexicalBlockFile : public DILexicalBlockBase {
1917   friend class LLVMContextImpl;
1918   friend class MDNode;
1919 
1920   unsigned Discriminator;
1921 
DILexicalBlockFile(LLVMContext & C,StorageType Storage,unsigned Discriminator,ArrayRef<Metadata * > Ops)1922   DILexicalBlockFile(LLVMContext &C, StorageType Storage,
1923                      unsigned Discriminator, ArrayRef<Metadata *> Ops)
1924       : DILexicalBlockBase(C, DILexicalBlockFileKind, Storage, Ops),
1925         Discriminator(Discriminator) {}
1926   ~DILexicalBlockFile() = default;
1927 
1928   static DILexicalBlockFile *getImpl(LLVMContext &Context, DILocalScope *Scope,
1929                                      DIFile *File, unsigned Discriminator,
1930                                      StorageType Storage,
1931                                      bool ShouldCreate = true) {
1932     return getImpl(Context, static_cast<Metadata *>(Scope),
1933                    static_cast<Metadata *>(File), Discriminator, Storage,
1934                    ShouldCreate);
1935   }
1936 
1937   static DILexicalBlockFile *getImpl(LLVMContext &Context, Metadata *Scope,
1938                                      Metadata *File, unsigned Discriminator,
1939                                      StorageType Storage,
1940                                      bool ShouldCreate = true);
1941 
cloneImpl()1942   TempDILexicalBlockFile cloneImpl() const {
1943     return getTemporary(getContext(), getScope(), getFile(),
1944                         getDiscriminator());
1945   }
1946 
1947 public:
1948   DEFINE_MDNODE_GET(DILexicalBlockFile, (DILocalScope * Scope, DIFile *File,
1949                                          unsigned Discriminator),
1950                     (Scope, File, Discriminator))
1951   DEFINE_MDNODE_GET(DILexicalBlockFile,
1952                     (Metadata * Scope, Metadata *File, unsigned Discriminator),
1953                     (Scope, File, Discriminator))
1954 
clone()1955   TempDILexicalBlockFile clone() const { return cloneImpl(); }
1956 
1957   // TODO: Remove these once they're gone from DILexicalBlockBase.
1958   unsigned getLine() const = delete;
1959   unsigned getColumn() const = delete;
1960 
getDiscriminator()1961   unsigned getDiscriminator() const { return Discriminator; }
1962 
classof(const Metadata * MD)1963   static bool classof(const Metadata *MD) {
1964     return MD->getMetadataID() == DILexicalBlockFileKind;
1965   }
1966 };
1967 
getDiscriminator()1968 unsigned DILocation::getDiscriminator() const {
1969   if (auto *F = dyn_cast<DILexicalBlockFile>(getScope()))
1970     return F->getDiscriminator();
1971   return 0;
1972 }
1973 
1974 const DILocation *
cloneWithDiscriminator(unsigned Discriminator)1975 DILocation::cloneWithDiscriminator(unsigned Discriminator) const {
1976   DIScope *Scope = getScope();
1977   // Skip all parent DILexicalBlockFile that already have a discriminator
1978   // assigned. We do not want to have nested DILexicalBlockFiles that have
1979   // mutliple discriminators because only the leaf DILexicalBlockFile's
1980   // dominator will be used.
1981   for (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope);
1982        LBF && LBF->getDiscriminator() != 0;
1983        LBF = dyn_cast<DILexicalBlockFile>(Scope))
1984     Scope = LBF->getScope();
1985   DILexicalBlockFile *NewScope =
1986       DILexicalBlockFile::get(getContext(), Scope, getFile(), Discriminator);
1987   return DILocation::get(getContext(), getLine(), getColumn(), NewScope,
1988                          getInlinedAt());
1989 }
1990 
getBaseDiscriminator()1991 unsigned DILocation::getBaseDiscriminator() const {
1992   return getBaseDiscriminatorFromDiscriminator(getDiscriminator());
1993 }
1994 
getDuplicationFactor()1995 unsigned DILocation::getDuplicationFactor() const {
1996   return getDuplicationFactorFromDiscriminator(getDiscriminator());
1997 }
1998 
getCopyIdentifier()1999 unsigned DILocation::getCopyIdentifier() const {
2000   return getCopyIdentifierFromDiscriminator(getDiscriminator());
2001 }
2002 
cloneWithBaseDiscriminator(unsigned D)2003 Optional<const DILocation *> DILocation::cloneWithBaseDiscriminator(unsigned D) const {
2004   unsigned BD, DF, CI;
2005   decodeDiscriminator(getDiscriminator(), BD, DF, CI);
2006   if (D == BD)
2007     return this;
2008   if (Optional<unsigned> Encoded = encodeDiscriminator(D, DF, CI))
2009     return cloneWithDiscriminator(*Encoded);
2010   return None;
2011 }
2012 
cloneByMultiplyingDuplicationFactor(unsigned DF)2013 Optional<const DILocation *> DILocation::cloneByMultiplyingDuplicationFactor(unsigned DF) const {
2014   DF *= getDuplicationFactor();
2015   if (DF <= 1)
2016     return this;
2017 
2018   unsigned BD = getBaseDiscriminator();
2019   unsigned CI = getCopyIdentifier();
2020   if (Optional<unsigned> D = encodeDiscriminator(BD, DF, CI))
2021     return cloneWithDiscriminator(*D);
2022   return None;
2023 }
2024 
2025 class DINamespace : public DIScope {
2026   friend class LLVMContextImpl;
2027   friend class MDNode;
2028 
2029   unsigned ExportSymbols : 1;
2030 
DINamespace(LLVMContext & Context,StorageType Storage,bool ExportSymbols,ArrayRef<Metadata * > Ops)2031   DINamespace(LLVMContext &Context, StorageType Storage, bool ExportSymbols,
2032               ArrayRef<Metadata *> Ops)
2033       : DIScope(Context, DINamespaceKind, Storage, dwarf::DW_TAG_namespace,
2034                 Ops),
2035         ExportSymbols(ExportSymbols) {}
2036   ~DINamespace() = default;
2037 
2038   static DINamespace *getImpl(LLVMContext &Context, DIScope *Scope,
2039                               StringRef Name, bool ExportSymbols,
2040                               StorageType Storage, bool ShouldCreate = true) {
2041     return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
2042                    ExportSymbols, Storage, ShouldCreate);
2043   }
2044   static DINamespace *getImpl(LLVMContext &Context, Metadata *Scope,
2045                               MDString *Name, bool ExportSymbols,
2046                               StorageType Storage, bool ShouldCreate = true);
2047 
cloneImpl()2048   TempDINamespace cloneImpl() const {
2049     return getTemporary(getContext(), getScope(), getName(),
2050                         getExportSymbols());
2051   }
2052 
2053 public:
2054   DEFINE_MDNODE_GET(DINamespace,
2055                     (DIScope *Scope, StringRef Name, bool ExportSymbols),
2056                     (Scope, Name, ExportSymbols))
2057   DEFINE_MDNODE_GET(DINamespace,
2058                     (Metadata *Scope, MDString *Name, bool ExportSymbols),
2059                     (Scope, Name, ExportSymbols))
2060 
clone()2061   TempDINamespace clone() const { return cloneImpl(); }
2062 
getExportSymbols()2063   bool getExportSymbols() const { return ExportSymbols; }
getScope()2064   DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
getName()2065   StringRef getName() const { return getStringOperand(2); }
2066 
getRawScope()2067   Metadata *getRawScope() const { return getOperand(1); }
getRawName()2068   MDString *getRawName() const { return getOperandAs<MDString>(2); }
2069 
classof(const Metadata * MD)2070   static bool classof(const Metadata *MD) {
2071     return MD->getMetadataID() == DINamespaceKind;
2072   }
2073 };
2074 
2075 /// A (clang) module that has been imported by the compile unit.
2076 ///
2077 class DIModule : public DIScope {
2078   friend class LLVMContextImpl;
2079   friend class MDNode;
2080 
DIModule(LLVMContext & Context,StorageType Storage,ArrayRef<Metadata * > Ops)2081   DIModule(LLVMContext &Context, StorageType Storage, ArrayRef<Metadata *> Ops)
2082       : DIScope(Context, DIModuleKind, Storage, dwarf::DW_TAG_module, Ops) {}
2083   ~DIModule() = default;
2084 
2085   static DIModule *getImpl(LLVMContext &Context, DIScope *Scope,
2086                            StringRef Name, StringRef ConfigurationMacros,
2087                            StringRef IncludePath, StringRef SysRoot,
2088                            StorageType Storage, bool ShouldCreate = true) {
2089     return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
2090                    getCanonicalMDString(Context, ConfigurationMacros),
2091                    getCanonicalMDString(Context, IncludePath),
2092                    getCanonicalMDString(Context, SysRoot),
2093                    Storage, ShouldCreate);
2094   }
2095   static DIModule *getImpl(LLVMContext &Context, Metadata *Scope,
2096                            MDString *Name, MDString *ConfigurationMacros,
2097                            MDString *IncludePath, MDString *SysRoot,
2098                            StorageType Storage, bool ShouldCreate = true);
2099 
cloneImpl()2100   TempDIModule cloneImpl() const {
2101     return getTemporary(getContext(), getScope(), getName(),
2102                         getConfigurationMacros(), getIncludePath(),
2103                         getSysRoot());
2104   }
2105 
2106 public:
2107   DEFINE_MDNODE_GET(DIModule, (DIScope *Scope, StringRef Name,
2108                                StringRef ConfigurationMacros, StringRef IncludePath,
2109                                StringRef SysRoot),
2110                     (Scope, Name, ConfigurationMacros, IncludePath, SysRoot))
2111   DEFINE_MDNODE_GET(DIModule,
2112                     (Metadata *Scope, MDString *Name, MDString *ConfigurationMacros,
2113                      MDString *IncludePath, MDString *SysRoot),
2114                     (Scope, Name, ConfigurationMacros, IncludePath, SysRoot))
2115 
clone()2116   TempDIModule clone() const { return cloneImpl(); }
2117 
getScope()2118   DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
getName()2119   StringRef getName() const { return getStringOperand(1); }
getConfigurationMacros()2120   StringRef getConfigurationMacros() const { return getStringOperand(2); }
getIncludePath()2121   StringRef getIncludePath() const { return getStringOperand(3); }
getSysRoot()2122   StringRef getSysRoot() const { return getStringOperand(4); }
2123 
getRawScope()2124   Metadata *getRawScope() const { return getOperand(0); }
getRawName()2125   MDString *getRawName() const { return getOperandAs<MDString>(1); }
getRawConfigurationMacros()2126   MDString *getRawConfigurationMacros() const { return getOperandAs<MDString>(2); }
getRawIncludePath()2127   MDString *getRawIncludePath() const { return getOperandAs<MDString>(3); }
getRawSysRoot()2128   MDString *getRawSysRoot() const { return getOperandAs<MDString>(4); }
2129 
classof(const Metadata * MD)2130   static bool classof(const Metadata *MD) {
2131     return MD->getMetadataID() == DIModuleKind;
2132   }
2133 };
2134 
2135 /// Base class for template parameters.
2136 class DITemplateParameter : public DINode {
2137 protected:
DITemplateParameter(LLVMContext & Context,unsigned ID,StorageType Storage,unsigned Tag,ArrayRef<Metadata * > Ops)2138   DITemplateParameter(LLVMContext &Context, unsigned ID, StorageType Storage,
2139                       unsigned Tag, ArrayRef<Metadata *> Ops)
2140       : DINode(Context, ID, Storage, Tag, Ops) {}
2141   ~DITemplateParameter() = default;
2142 
2143 public:
getName()2144   StringRef getName() const { return getStringOperand(0); }
getType()2145   DIType *getType() const { return cast_or_null<DIType>(getRawType()); }
2146 
getRawName()2147   MDString *getRawName() const { return getOperandAs<MDString>(0); }
getRawType()2148   Metadata *getRawType() const { return getOperand(1); }
2149 
classof(const Metadata * MD)2150   static bool classof(const Metadata *MD) {
2151     return MD->getMetadataID() == DITemplateTypeParameterKind ||
2152            MD->getMetadataID() == DITemplateValueParameterKind;
2153   }
2154 };
2155 
2156 class DITemplateTypeParameter : public DITemplateParameter {
2157   friend class LLVMContextImpl;
2158   friend class MDNode;
2159 
DITemplateTypeParameter(LLVMContext & Context,StorageType Storage,ArrayRef<Metadata * > Ops)2160   DITemplateTypeParameter(LLVMContext &Context, StorageType Storage,
2161                           ArrayRef<Metadata *> Ops)
2162       : DITemplateParameter(Context, DITemplateTypeParameterKind, Storage,
2163                             dwarf::DW_TAG_template_type_parameter, Ops) {}
2164   ~DITemplateTypeParameter() = default;
2165 
2166   static DITemplateTypeParameter *getImpl(LLVMContext &Context, StringRef Name,
2167                                           DIType *Type, StorageType Storage,
2168                                           bool ShouldCreate = true) {
2169     return getImpl(Context, getCanonicalMDString(Context, Name), Type, Storage,
2170                    ShouldCreate);
2171   }
2172   static DITemplateTypeParameter *getImpl(LLVMContext &Context, MDString *Name,
2173                                           Metadata *Type, StorageType Storage,
2174                                           bool ShouldCreate = true);
2175 
cloneImpl()2176   TempDITemplateTypeParameter cloneImpl() const {
2177     return getTemporary(getContext(), getName(), getType());
2178   }
2179 
2180 public:
2181   DEFINE_MDNODE_GET(DITemplateTypeParameter, (StringRef Name, DIType *Type),
2182                     (Name, Type))
2183   DEFINE_MDNODE_GET(DITemplateTypeParameter, (MDString * Name, Metadata *Type),
2184                     (Name, Type))
2185 
clone()2186   TempDITemplateTypeParameter clone() const { return cloneImpl(); }
2187 
classof(const Metadata * MD)2188   static bool classof(const Metadata *MD) {
2189     return MD->getMetadataID() == DITemplateTypeParameterKind;
2190   }
2191 };
2192 
2193 class DITemplateValueParameter : public DITemplateParameter {
2194   friend class LLVMContextImpl;
2195   friend class MDNode;
2196 
DITemplateValueParameter(LLVMContext & Context,StorageType Storage,unsigned Tag,ArrayRef<Metadata * > Ops)2197   DITemplateValueParameter(LLVMContext &Context, StorageType Storage,
2198                            unsigned Tag, ArrayRef<Metadata *> Ops)
2199       : DITemplateParameter(Context, DITemplateValueParameterKind, Storage, Tag,
2200                             Ops) {}
2201   ~DITemplateValueParameter() = default;
2202 
2203   static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag,
2204                                            StringRef Name, DIType *Type,
2205                                            Metadata *Value, StorageType Storage,
2206                                            bool ShouldCreate = true) {
2207     return getImpl(Context, Tag, getCanonicalMDString(Context, Name), Type,
2208                    Value, Storage, ShouldCreate);
2209   }
2210   static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag,
2211                                            MDString *Name, Metadata *Type,
2212                                            Metadata *Value, StorageType Storage,
2213                                            bool ShouldCreate = true);
2214 
cloneImpl()2215   TempDITemplateValueParameter cloneImpl() const {
2216     return getTemporary(getContext(), getTag(), getName(), getType(),
2217                         getValue());
2218   }
2219 
2220 public:
2221   DEFINE_MDNODE_GET(DITemplateValueParameter,
2222                     (unsigned Tag, StringRef Name, DIType *Type,
2223                      Metadata *Value),
2224                     (Tag, Name, Type, Value))
2225   DEFINE_MDNODE_GET(DITemplateValueParameter, (unsigned Tag, MDString *Name,
2226                                                Metadata *Type, Metadata *Value),
2227                     (Tag, Name, Type, Value))
2228 
clone()2229   TempDITemplateValueParameter clone() const { return cloneImpl(); }
2230 
getValue()2231   Metadata *getValue() const { return getOperand(2); }
2232 
classof(const Metadata * MD)2233   static bool classof(const Metadata *MD) {
2234     return MD->getMetadataID() == DITemplateValueParameterKind;
2235   }
2236 };
2237 
2238 /// Base class for variables.
2239 class DIVariable : public DINode {
2240   unsigned Line;
2241   uint32_t AlignInBits;
2242 
2243 protected:
2244   DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Line,
2245              ArrayRef<Metadata *> Ops, uint32_t AlignInBits = 0)
DINode(C,ID,Storage,dwarf::DW_TAG_variable,Ops)2246       : DINode(C, ID, Storage, dwarf::DW_TAG_variable, Ops), Line(Line),
2247         AlignInBits(AlignInBits) {}
2248   ~DIVariable() = default;
2249 
2250 public:
getLine()2251   unsigned getLine() const { return Line; }
getScope()2252   DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
getName()2253   StringRef getName() const { return getStringOperand(1); }
getFile()2254   DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
getType()2255   DIType *getType() const { return cast_or_null<DIType>(getRawType()); }
getAlignInBits()2256   uint32_t getAlignInBits() const { return AlignInBits; }
getAlignInBytes()2257   uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
2258   /// Determines the size of the variable's type.
2259   Optional<uint64_t> getSizeInBits() const;
2260 
2261   /// Return the signedness of this variable's type, or None if this type is
2262   /// neither signed nor unsigned.
getSignedness()2263   Optional<DIBasicType::Signedness> getSignedness() const {
2264     if (auto *BT = dyn_cast<DIBasicType>(getType()))
2265       return BT->getSignedness();
2266     return None;
2267   }
2268 
getFilename()2269   StringRef getFilename() const {
2270     if (auto *F = getFile())
2271       return F->getFilename();
2272     return "";
2273   }
2274 
getDirectory()2275   StringRef getDirectory() const {
2276     if (auto *F = getFile())
2277       return F->getDirectory();
2278     return "";
2279   }
2280 
getSource()2281   Optional<StringRef> getSource() const {
2282     if (auto *F = getFile())
2283       return F->getSource();
2284     return None;
2285   }
2286 
getRawScope()2287   Metadata *getRawScope() const { return getOperand(0); }
getRawName()2288   MDString *getRawName() const { return getOperandAs<MDString>(1); }
getRawFile()2289   Metadata *getRawFile() const { return getOperand(2); }
getRawType()2290   Metadata *getRawType() const { return getOperand(3); }
2291 
classof(const Metadata * MD)2292   static bool classof(const Metadata *MD) {
2293     return MD->getMetadataID() == DILocalVariableKind ||
2294            MD->getMetadataID() == DIGlobalVariableKind;
2295   }
2296 };
2297 
2298 /// DWARF expression.
2299 ///
2300 /// This is (almost) a DWARF expression that modifies the location of a
2301 /// variable, or the location of a single piece of a variable, or (when using
2302 /// DW_OP_stack_value) is the constant variable value.
2303 ///
2304 /// TODO: Co-allocate the expression elements.
2305 /// TODO: Separate from MDNode, or otherwise drop Distinct and Temporary
2306 /// storage types.
2307 class DIExpression : public MDNode {
2308   friend class LLVMContextImpl;
2309   friend class MDNode;
2310 
2311   std::vector<uint64_t> Elements;
2312 
DIExpression(LLVMContext & C,StorageType Storage,ArrayRef<uint64_t> Elements)2313   DIExpression(LLVMContext &C, StorageType Storage, ArrayRef<uint64_t> Elements)
2314       : MDNode(C, DIExpressionKind, Storage, None),
2315         Elements(Elements.begin(), Elements.end()) {}
2316   ~DIExpression() = default;
2317 
2318   static DIExpression *getImpl(LLVMContext &Context,
2319                                ArrayRef<uint64_t> Elements, StorageType Storage,
2320                                bool ShouldCreate = true);
2321 
cloneImpl()2322   TempDIExpression cloneImpl() const {
2323     return getTemporary(getContext(), getElements());
2324   }
2325 
2326 public:
2327   DEFINE_MDNODE_GET(DIExpression, (ArrayRef<uint64_t> Elements), (Elements))
2328 
clone()2329   TempDIExpression clone() const { return cloneImpl(); }
2330 
getElements()2331   ArrayRef<uint64_t> getElements() const { return Elements; }
2332 
getNumElements()2333   unsigned getNumElements() const { return Elements.size(); }
2334 
getElement(unsigned I)2335   uint64_t getElement(unsigned I) const {
2336     assert(I < Elements.size() && "Index out of range");
2337     return Elements[I];
2338   }
2339 
2340   /// Determine whether this represents a standalone constant value.
2341   bool isConstant() const;
2342 
2343   using element_iterator = ArrayRef<uint64_t>::iterator;
2344 
elements_begin()2345   element_iterator elements_begin() const { return getElements().begin(); }
elements_end()2346   element_iterator elements_end() const { return getElements().end(); }
2347 
2348   /// A lightweight wrapper around an expression operand.
2349   ///
2350   /// TODO: Store arguments directly and change \a DIExpression to store a
2351   /// range of these.
2352   class ExprOperand {
2353     const uint64_t *Op = nullptr;
2354 
2355   public:
2356     ExprOperand() = default;
ExprOperand(const uint64_t * Op)2357     explicit ExprOperand(const uint64_t *Op) : Op(Op) {}
2358 
get()2359     const uint64_t *get() const { return Op; }
2360 
2361     /// Get the operand code.
getOp()2362     uint64_t getOp() const { return *Op; }
2363 
2364     /// Get an argument to the operand.
2365     ///
2366     /// Never returns the operand itself.
getArg(unsigned I)2367     uint64_t getArg(unsigned I) const { return Op[I + 1]; }
2368 
getNumArgs()2369     unsigned getNumArgs() const { return getSize() - 1; }
2370 
2371     /// Return the size of the operand.
2372     ///
2373     /// Return the number of elements in the operand (1 + args).
2374     unsigned getSize() const;
2375 
2376     /// Append the elements of this operand to \p V.
appendToVector(SmallVectorImpl<uint64_t> & V)2377     void appendToVector(SmallVectorImpl<uint64_t> &V) const {
2378       V.append(get(), get() + getSize());
2379     }
2380   };
2381 
2382   /// An iterator for expression operands.
2383   class expr_op_iterator
2384       : public std::iterator<std::input_iterator_tag, ExprOperand> {
2385     ExprOperand Op;
2386 
2387   public:
2388     expr_op_iterator() = default;
expr_op_iterator(element_iterator I)2389     explicit expr_op_iterator(element_iterator I) : Op(I) {}
2390 
getBase()2391     element_iterator getBase() const { return Op.get(); }
2392     const ExprOperand &operator*() const { return Op; }
2393     const ExprOperand *operator->() const { return &Op; }
2394 
2395     expr_op_iterator &operator++() {
2396       increment();
2397       return *this;
2398     }
2399     expr_op_iterator operator++(int) {
2400       expr_op_iterator T(*this);
2401       increment();
2402       return T;
2403     }
2404 
2405     /// Get the next iterator.
2406     ///
2407     /// \a std::next() doesn't work because this is technically an
2408     /// input_iterator, but it's a perfectly valid operation.  This is an
2409     /// accessor to provide the same functionality.
getNext()2410     expr_op_iterator getNext() const { return ++expr_op_iterator(*this); }
2411 
2412     bool operator==(const expr_op_iterator &X) const {
2413       return getBase() == X.getBase();
2414     }
2415     bool operator!=(const expr_op_iterator &X) const {
2416       return getBase() != X.getBase();
2417     }
2418 
2419   private:
increment()2420     void increment() { Op = ExprOperand(getBase() + Op.getSize()); }
2421   };
2422 
2423   /// Visit the elements via ExprOperand wrappers.
2424   ///
2425   /// These range iterators visit elements through \a ExprOperand wrappers.
2426   /// This is not guaranteed to be a valid range unless \a isValid() gives \c
2427   /// true.
2428   ///
2429   /// \pre \a isValid() gives \c true.
2430   /// @{
expr_op_begin()2431   expr_op_iterator expr_op_begin() const {
2432     return expr_op_iterator(elements_begin());
2433   }
expr_op_end()2434   expr_op_iterator expr_op_end() const {
2435     return expr_op_iterator(elements_end());
2436   }
expr_ops()2437   iterator_range<expr_op_iterator> expr_ops() const {
2438     return {expr_op_begin(), expr_op_end()};
2439   }
2440   /// @}
2441 
2442   bool isValid() const;
2443 
classof(const Metadata * MD)2444   static bool classof(const Metadata *MD) {
2445     return MD->getMetadataID() == DIExpressionKind;
2446   }
2447 
2448   /// Return whether the first element a DW_OP_deref.
startsWithDeref()2449   bool startsWithDeref() const {
2450     return getNumElements() > 0 && getElement(0) == dwarf::DW_OP_deref;
2451   }
2452 
2453   /// Holds the characteristics of one fragment of a larger variable.
2454   struct FragmentInfo {
2455     uint64_t SizeInBits;
2456     uint64_t OffsetInBits;
2457   };
2458 
2459   /// Retrieve the details of this fragment expression.
2460   static Optional<FragmentInfo> getFragmentInfo(expr_op_iterator Start,
2461                                                 expr_op_iterator End);
2462 
2463   /// Retrieve the details of this fragment expression.
getFragmentInfo()2464   Optional<FragmentInfo> getFragmentInfo() const {
2465     return getFragmentInfo(expr_op_begin(), expr_op_end());
2466   }
2467 
2468   /// Return whether this is a piece of an aggregate variable.
isFragment()2469   bool isFragment() const { return getFragmentInfo().hasValue(); }
2470 
2471   /// Return whether this is an implicit location description.
2472   bool isImplicit() const;
2473 
2474   /// Return whether the location is computed on the expression stack, meaning
2475   /// it cannot be a simple register location.
2476   bool isComplex() const;
2477 
2478   /// Append \p Ops with operations to apply the \p Offset.
2479   static void appendOffset(SmallVectorImpl<uint64_t> &Ops, int64_t Offset);
2480 
2481   /// If this is a constant offset, extract it. If there is no expression,
2482   /// return true with an offset of zero.
2483   bool extractIfOffset(int64_t &Offset) const;
2484 
2485   /// Checks if the last 4 elements of the expression are DW_OP_constu <DWARF
2486   /// Address Space> DW_OP_swap DW_OP_xderef and extracts the <DWARF Address
2487   /// Space>.
2488   static const DIExpression *extractAddressClass(const DIExpression *Expr,
2489                                                  unsigned &AddrClass);
2490 
2491   /// Used for DIExpression::prepend.
2492   enum PrependOps : uint8_t {
2493     ApplyOffset = 0,
2494     DerefBefore = 1 << 0,
2495     DerefAfter = 1 << 1,
2496     StackValue = 1 << 2,
2497     EntryValue = 1 << 3
2498   };
2499 
2500   /// Prepend \p DIExpr with a deref and offset operation and optionally turn it
2501   /// into a stack value or/and an entry value.
2502   static DIExpression *prepend(const DIExpression *Expr, uint8_t Flags,
2503                                int64_t Offset = 0);
2504 
2505   /// Prepend \p DIExpr with the given opcodes and optionally turn it into a
2506   /// stack value.
2507   static DIExpression *prependOpcodes(const DIExpression *Expr,
2508                                       SmallVectorImpl<uint64_t> &Ops,
2509                                       bool StackValue = false,
2510                                       bool EntryValue = false);
2511 
2512   /// Append the opcodes \p Ops to \p DIExpr. Unlike \ref appendToStack, the
2513   /// returned expression is a stack value only if \p DIExpr is a stack value.
2514   /// If \p DIExpr describes a fragment, the returned expression will describe
2515   /// the same fragment.
2516   static DIExpression *append(const DIExpression *Expr, ArrayRef<uint64_t> Ops);
2517 
2518   /// Convert \p DIExpr into a stack value if it isn't one already by appending
2519   /// DW_OP_deref if needed, and appending \p Ops to the resulting expression.
2520   /// If \p DIExpr describes a fragment, the returned expression will describe
2521   /// the same fragment.
2522   static DIExpression *appendToStack(const DIExpression *Expr,
2523                                      ArrayRef<uint64_t> Ops);
2524 
2525   /// Create a DIExpression to describe one part of an aggregate variable that
2526   /// is fragmented across multiple Values. The DW_OP_LLVM_fragment operation
2527   /// will be appended to the elements of \c Expr. If \c Expr already contains
2528   /// a \c DW_OP_LLVM_fragment \c OffsetInBits is interpreted as an offset
2529   /// into the existing fragment.
2530   ///
2531   /// \param OffsetInBits Offset of the piece in bits.
2532   /// \param SizeInBits   Size of the piece in bits.
2533   /// \return             Creating a fragment expression may fail if \c Expr
2534   ///                     contains arithmetic operations that would be truncated.
2535   static Optional<DIExpression *>
2536   createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits,
2537                            unsigned SizeInBits);
2538 
2539   /// Determine the relative position of the fragments passed in.
2540   /// Returns -1 if this is entirely before Other, 0 if this and Other overlap,
2541   /// 1 if this is entirely after Other.
fragmentCmp(const FragmentInfo & A,const FragmentInfo & B)2542   static int fragmentCmp(const FragmentInfo &A, const FragmentInfo &B) {
2543     uint64_t l1 = A.OffsetInBits;
2544     uint64_t l2 = B.OffsetInBits;
2545     uint64_t r1 = l1 + A.SizeInBits;
2546     uint64_t r2 = l2 + B.SizeInBits;
2547     if (r1 <= l2)
2548       return -1;
2549     else if (r2 <= l1)
2550       return 1;
2551     else
2552       return 0;
2553   }
2554 
2555   using ExtOps = std::array<uint64_t, 6>;
2556 
2557   /// Returns the ops for a zero- or sign-extension in a DIExpression.
2558   static ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed);
2559 
2560   /// Append a zero- or sign-extension to \p Expr. Converts the expression to a
2561   /// stack value if it isn't one already.
2562   static DIExpression *appendExt(const DIExpression *Expr, unsigned FromSize,
2563                                  unsigned ToSize, bool Signed);
2564 
2565   /// Check if fragments overlap between a pair of FragmentInfos.
fragmentsOverlap(const FragmentInfo & A,const FragmentInfo & B)2566   static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B) {
2567     return fragmentCmp(A, B) == 0;
2568   }
2569 
2570   /// Determine the relative position of the fragments described by this
2571   /// DIExpression and \p Other. Calls static fragmentCmp implementation.
fragmentCmp(const DIExpression * Other)2572   int fragmentCmp(const DIExpression *Other) const {
2573     auto Fragment1 = *getFragmentInfo();
2574     auto Fragment2 = *Other->getFragmentInfo();
2575     return fragmentCmp(Fragment1, Fragment2);
2576   }
2577 
2578   /// Check if fragments overlap between this DIExpression and \p Other.
fragmentsOverlap(const DIExpression * Other)2579   bool fragmentsOverlap(const DIExpression *Other) const {
2580     if (!isFragment() || !Other->isFragment())
2581       return true;
2582     return fragmentCmp(Other) == 0;
2583   }
2584 
2585   /// Check if the expression consists of exactly one entry value operand.
2586   /// (This is the only configuration of entry values that is supported.)
isEntryValue()2587   bool isEntryValue() const {
2588     return getNumElements() > 0 &&
2589            getElement(0) == dwarf::DW_OP_LLVM_entry_value;
2590   }
2591 };
2592 
2593 inline bool operator==(const DIExpression::FragmentInfo &A,
2594                        const DIExpression::FragmentInfo &B) {
2595   return std::tie(A.SizeInBits, A.OffsetInBits) ==
2596          std::tie(B.SizeInBits, B.OffsetInBits);
2597 }
2598 
2599 inline bool operator<(const DIExpression::FragmentInfo &A,
2600                       const DIExpression::FragmentInfo &B) {
2601   return std::tie(A.SizeInBits, A.OffsetInBits) <
2602          std::tie(B.SizeInBits, B.OffsetInBits);
2603 }
2604 
2605 template <> struct DenseMapInfo<DIExpression::FragmentInfo> {
2606   using FragInfo = DIExpression::FragmentInfo;
2607   static const uint64_t MaxVal = std::numeric_limits<uint64_t>::max();
2608 
2609   static inline FragInfo getEmptyKey() { return {MaxVal, MaxVal}; }
2610 
2611   static inline FragInfo getTombstoneKey() { return {MaxVal - 1, MaxVal - 1}; }
2612 
2613   static unsigned getHashValue(const FragInfo &Frag) {
2614     return (Frag.SizeInBits & 0xffff) << 16 | (Frag.OffsetInBits & 0xffff);
2615   }
2616 
2617   static bool isEqual(const FragInfo &A, const FragInfo &B) { return A == B; }
2618 };
2619 
2620 /// Global variables.
2621 ///
2622 /// TODO: Remove DisplayName.  It's always equal to Name.
2623 class DIGlobalVariable : public DIVariable {
2624   friend class LLVMContextImpl;
2625   friend class MDNode;
2626 
2627   bool IsLocalToUnit;
2628   bool IsDefinition;
2629 
2630   DIGlobalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
2631                    bool IsLocalToUnit, bool IsDefinition, uint32_t AlignInBits,
2632                    ArrayRef<Metadata *> Ops)
2633       : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops, AlignInBits),
2634         IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
2635   ~DIGlobalVariable() = default;
2636 
2637   static DIGlobalVariable *
2638   getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
2639           StringRef LinkageName, DIFile *File, unsigned Line, DIType *Type,
2640           bool IsLocalToUnit, bool IsDefinition,
2641           DIDerivedType *StaticDataMemberDeclaration, MDTuple *TemplateParams,
2642           uint32_t AlignInBits, StorageType Storage, bool ShouldCreate = true) {
2643     return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
2644                    getCanonicalMDString(Context, LinkageName), File, Line, Type,
2645                    IsLocalToUnit, IsDefinition, StaticDataMemberDeclaration,
2646                    cast_or_null<Metadata>(TemplateParams), AlignInBits, Storage,
2647                    ShouldCreate);
2648   }
2649   static DIGlobalVariable *
2650   getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
2651           MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
2652           bool IsLocalToUnit, bool IsDefinition,
2653           Metadata *StaticDataMemberDeclaration, Metadata *TemplateParams,
2654           uint32_t AlignInBits, StorageType Storage, bool ShouldCreate = true);
2655 
2656   TempDIGlobalVariable cloneImpl() const {
2657     return getTemporary(getContext(), getScope(), getName(), getLinkageName(),
2658                         getFile(), getLine(), getType(), isLocalToUnit(),
2659                         isDefinition(), getStaticDataMemberDeclaration(),
2660                         getTemplateParams(), getAlignInBits());
2661   }
2662 
2663 public:
2664   DEFINE_MDNODE_GET(DIGlobalVariable,
2665                     (DIScope * Scope, StringRef Name, StringRef LinkageName,
2666                      DIFile *File, unsigned Line, DIType *Type,
2667                      bool IsLocalToUnit, bool IsDefinition,
2668                      DIDerivedType *StaticDataMemberDeclaration,
2669                      MDTuple *TemplateParams, uint32_t AlignInBits),
2670                     (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
2671                      IsDefinition, StaticDataMemberDeclaration, TemplateParams,
2672                      AlignInBits))
2673   DEFINE_MDNODE_GET(DIGlobalVariable,
2674                     (Metadata * Scope, MDString *Name, MDString *LinkageName,
2675                      Metadata *File, unsigned Line, Metadata *Type,
2676                      bool IsLocalToUnit, bool IsDefinition,
2677                      Metadata *StaticDataMemberDeclaration,
2678                      Metadata *TemplateParams, uint32_t AlignInBits),
2679                     (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
2680                      IsDefinition, StaticDataMemberDeclaration, TemplateParams,
2681                      AlignInBits))
2682 
2683   TempDIGlobalVariable clone() const { return cloneImpl(); }
2684 
2685   bool isLocalToUnit() const { return IsLocalToUnit; }
2686   bool isDefinition() const { return IsDefinition; }
2687   StringRef getDisplayName() const { return getStringOperand(4); }
2688   StringRef getLinkageName() const { return getStringOperand(5); }
2689   DIDerivedType *getStaticDataMemberDeclaration() const {
2690     return cast_or_null<DIDerivedType>(getRawStaticDataMemberDeclaration());
2691   }
2692 
2693   MDString *getRawLinkageName() const { return getOperandAs<MDString>(5); }
2694   Metadata *getRawStaticDataMemberDeclaration() const { return getOperand(6); }
2695   Metadata *getRawTemplateParams() const { return getOperand(7); }
2696   MDTuple *getTemplateParams() const { return getOperandAs<MDTuple>(7); }
2697 
2698   static bool classof(const Metadata *MD) {
2699     return MD->getMetadataID() == DIGlobalVariableKind;
2700   }
2701 };
2702 
2703 class DICommonBlock : public DIScope {
2704   unsigned LineNo;
2705 
2706   friend class LLVMContextImpl;
2707   friend class MDNode;
2708 
2709   DICommonBlock(LLVMContext &Context, StorageType Storage, unsigned LineNo,
2710                 ArrayRef<Metadata *> Ops)
2711       : DIScope(Context, DICommonBlockKind, Storage, dwarf::DW_TAG_common_block,
2712                 Ops), LineNo(LineNo) {}
2713 
2714   static DICommonBlock *getImpl(LLVMContext &Context, DIScope *Scope,
2715                                 DIGlobalVariable *Decl, StringRef Name,
2716                                 DIFile *File, unsigned LineNo,
2717                                 StorageType Storage,
2718                                 bool ShouldCreate = true) {
2719     return getImpl(Context, Scope, Decl, getCanonicalMDString(Context, Name),
2720                    File, LineNo, Storage, ShouldCreate);
2721   }
2722   static DICommonBlock *getImpl(LLVMContext &Context, Metadata *Scope,
2723                                 Metadata *Decl, MDString *Name, Metadata *File,
2724                                 unsigned LineNo,
2725                                 StorageType Storage, bool ShouldCreate = true);
2726 
2727   TempDICommonBlock cloneImpl() const {
2728     return getTemporary(getContext(), getScope(), getDecl(), getName(),
2729                         getFile(), getLineNo());
2730   }
2731 
2732 public:
2733   DEFINE_MDNODE_GET(DICommonBlock,
2734                     (DIScope *Scope, DIGlobalVariable *Decl, StringRef Name,
2735                      DIFile *File, unsigned LineNo),
2736                     (Scope, Decl, Name, File, LineNo))
2737   DEFINE_MDNODE_GET(DICommonBlock,
2738                     (Metadata *Scope, Metadata *Decl, MDString *Name,
2739                      Metadata *File, unsigned LineNo),
2740                     (Scope, Decl, Name, File, LineNo))
2741 
2742   TempDICommonBlock clone() const { return cloneImpl(); }
2743 
2744   DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
2745   DIGlobalVariable *getDecl() const {
2746     return cast_or_null<DIGlobalVariable>(getRawDecl());
2747   }
2748   StringRef getName() const { return getStringOperand(2); }
2749   DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
2750   unsigned getLineNo() const { return LineNo; }
2751 
2752   Metadata *getRawScope() const { return getOperand(0); }
2753   Metadata *getRawDecl() const { return getOperand(1); }
2754   MDString *getRawName() const { return getOperandAs<MDString>(2); }
2755   Metadata *getRawFile() const { return getOperand(3); }
2756 
2757   static bool classof(const Metadata *MD) {
2758     return MD->getMetadataID() == DICommonBlockKind;
2759   }
2760 };
2761 
2762 /// Local variable.
2763 ///
2764 /// TODO: Split up flags.
2765 class DILocalVariable : public DIVariable {
2766   friend class LLVMContextImpl;
2767   friend class MDNode;
2768 
2769   unsigned Arg : 16;
2770   DIFlags Flags;
2771 
2772   DILocalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
2773                   unsigned Arg, DIFlags Flags, uint32_t AlignInBits,
2774                   ArrayRef<Metadata *> Ops)
2775       : DIVariable(C, DILocalVariableKind, Storage, Line, Ops, AlignInBits),
2776         Arg(Arg), Flags(Flags) {
2777     assert(Arg < (1 << 16) && "DILocalVariable: Arg out of range");
2778   }
2779   ~DILocalVariable() = default;
2780 
2781   static DILocalVariable *getImpl(LLVMContext &Context, DIScope *Scope,
2782                                   StringRef Name, DIFile *File, unsigned Line,
2783                                   DIType *Type, unsigned Arg, DIFlags Flags,
2784                                   uint32_t AlignInBits, StorageType Storage,
2785                                   bool ShouldCreate = true) {
2786     return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
2787                    Line, Type, Arg, Flags, AlignInBits, Storage, ShouldCreate);
2788   }
2789   static DILocalVariable *getImpl(LLVMContext &Context, Metadata *Scope,
2790                                   MDString *Name, Metadata *File, unsigned Line,
2791                                   Metadata *Type, unsigned Arg, DIFlags Flags,
2792                                   uint32_t AlignInBits, StorageType Storage,
2793                                   bool ShouldCreate = true);
2794 
2795   TempDILocalVariable cloneImpl() const {
2796     return getTemporary(getContext(), getScope(), getName(), getFile(),
2797                         getLine(), getType(), getArg(), getFlags(),
2798                         getAlignInBits());
2799   }
2800 
2801 public:
2802   DEFINE_MDNODE_GET(DILocalVariable,
2803                     (DILocalScope * Scope, StringRef Name, DIFile *File,
2804                      unsigned Line, DIType *Type, unsigned Arg, DIFlags Flags,
2805                      uint32_t AlignInBits),
2806                     (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits))
2807   DEFINE_MDNODE_GET(DILocalVariable,
2808                     (Metadata * Scope, MDString *Name, Metadata *File,
2809                      unsigned Line, Metadata *Type, unsigned Arg,
2810                      DIFlags Flags, uint32_t AlignInBits),
2811                     (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits))
2812 
2813   TempDILocalVariable clone() const { return cloneImpl(); }
2814 
2815   /// Get the local scope for this variable.
2816   ///
2817   /// Variables must be defined in a local scope.
2818   DILocalScope *getScope() const {
2819     return cast<DILocalScope>(DIVariable::getScope());
2820   }
2821 
2822   bool isParameter() const { return Arg; }
2823   unsigned getArg() const { return Arg; }
2824   DIFlags getFlags() const { return Flags; }
2825 
2826   bool isArtificial() const { return getFlags() & FlagArtificial; }
2827   bool isObjectPointer() const { return getFlags() & FlagObjectPointer; }
2828 
2829   /// Check that a location is valid for this variable.
2830   ///
2831   /// Check that \c DL exists, is in the same subprogram, and has the same
2832   /// inlined-at location as \c this.  (Otherwise, it's not a valid attachment
2833   /// to a \a DbgInfoIntrinsic.)
2834   bool isValidLocationForIntrinsic(const DILocation *DL) const {
2835     return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram();
2836   }
2837 
2838   static bool classof(const Metadata *MD) {
2839     return MD->getMetadataID() == DILocalVariableKind;
2840   }
2841 };
2842 
2843 /// Label.
2844 ///
2845 class DILabel : public DINode {
2846   friend class LLVMContextImpl;
2847   friend class MDNode;
2848 
2849   unsigned Line;
2850 
2851   DILabel(LLVMContext &C, StorageType Storage, unsigned Line,
2852           ArrayRef<Metadata *> Ops)
2853       : DINode(C, DILabelKind, Storage, dwarf::DW_TAG_label, Ops), Line(Line) {}
2854   ~DILabel() = default;
2855 
2856   static DILabel *getImpl(LLVMContext &Context, DIScope *Scope,
2857                           StringRef Name, DIFile *File, unsigned Line,
2858                           StorageType Storage,
2859                           bool ShouldCreate = true) {
2860     return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
2861                    Line, Storage, ShouldCreate);
2862   }
2863   static DILabel *getImpl(LLVMContext &Context, Metadata *Scope,
2864                           MDString *Name, Metadata *File, unsigned Line,
2865                           StorageType Storage,
2866                           bool ShouldCreate = true);
2867 
2868   TempDILabel cloneImpl() const {
2869     return getTemporary(getContext(), getScope(), getName(), getFile(),
2870                         getLine());
2871   }
2872 
2873 public:
2874   DEFINE_MDNODE_GET(DILabel,
2875                     (DILocalScope * Scope, StringRef Name, DIFile *File,
2876                      unsigned Line),
2877                     (Scope, Name, File, Line))
2878   DEFINE_MDNODE_GET(DILabel,
2879                     (Metadata * Scope, MDString *Name, Metadata *File,
2880                      unsigned Line),
2881                     (Scope, Name, File, Line))
2882 
2883   TempDILabel clone() const { return cloneImpl(); }
2884 
2885   /// Get the local scope for this label.
2886   ///
2887   /// Labels must be defined in a local scope.
2888   DILocalScope *getScope() const {
2889     return cast_or_null<DILocalScope>(getRawScope());
2890   }
2891   unsigned getLine() const { return Line; }
2892   StringRef getName() const { return getStringOperand(1); }
2893   DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
2894 
2895   Metadata *getRawScope() const { return getOperand(0); }
2896   MDString *getRawName() const { return getOperandAs<MDString>(1); }
2897   Metadata *getRawFile() const { return getOperand(2); }
2898 
2899   /// Check that a location is valid for this label.
2900   ///
2901   /// Check that \c DL exists, is in the same subprogram, and has the same
2902   /// inlined-at location as \c this.  (Otherwise, it's not a valid attachment
2903   /// to a \a DbgInfoIntrinsic.)
2904   bool isValidLocationForIntrinsic(const DILocation *DL) const {
2905     return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram();
2906   }
2907 
2908   static bool classof(const Metadata *MD) {
2909     return MD->getMetadataID() == DILabelKind;
2910   }
2911 };
2912 
2913 class DIObjCProperty : public DINode {
2914   friend class LLVMContextImpl;
2915   friend class MDNode;
2916 
2917   unsigned Line;
2918   unsigned Attributes;
2919 
2920   DIObjCProperty(LLVMContext &C, StorageType Storage, unsigned Line,
2921                  unsigned Attributes, ArrayRef<Metadata *> Ops)
2922       : DINode(C, DIObjCPropertyKind, Storage, dwarf::DW_TAG_APPLE_property,
2923                Ops),
2924         Line(Line), Attributes(Attributes) {}
2925   ~DIObjCProperty() = default;
2926 
2927   static DIObjCProperty *
2928   getImpl(LLVMContext &Context, StringRef Name, DIFile *File, unsigned Line,
2929           StringRef GetterName, StringRef SetterName, unsigned Attributes,
2930           DIType *Type, StorageType Storage, bool ShouldCreate = true) {
2931     return getImpl(Context, getCanonicalMDString(Context, Name), File, Line,
2932                    getCanonicalMDString(Context, GetterName),
2933                    getCanonicalMDString(Context, SetterName), Attributes, Type,
2934                    Storage, ShouldCreate);
2935   }
2936   static DIObjCProperty *getImpl(LLVMContext &Context, MDString *Name,
2937                                  Metadata *File, unsigned Line,
2938                                  MDString *GetterName, MDString *SetterName,
2939                                  unsigned Attributes, Metadata *Type,
2940                                  StorageType Storage, bool ShouldCreate = true);
2941 
2942   TempDIObjCProperty cloneImpl() const {
2943     return getTemporary(getContext(), getName(), getFile(), getLine(),
2944                         getGetterName(), getSetterName(), getAttributes(),
2945                         getType());
2946   }
2947 
2948 public:
2949   DEFINE_MDNODE_GET(DIObjCProperty,
2950                     (StringRef Name, DIFile *File, unsigned Line,
2951                      StringRef GetterName, StringRef SetterName,
2952                      unsigned Attributes, DIType *Type),
2953                     (Name, File, Line, GetterName, SetterName, Attributes,
2954                      Type))
2955   DEFINE_MDNODE_GET(DIObjCProperty,
2956                     (MDString * Name, Metadata *File, unsigned Line,
2957                      MDString *GetterName, MDString *SetterName,
2958                      unsigned Attributes, Metadata *Type),
2959                     (Name, File, Line, GetterName, SetterName, Attributes,
2960                      Type))
2961 
2962   TempDIObjCProperty clone() const { return cloneImpl(); }
2963 
2964   unsigned getLine() const { return Line; }
2965   unsigned getAttributes() const { return Attributes; }
2966   StringRef getName() const { return getStringOperand(0); }
2967   DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
2968   StringRef getGetterName() const { return getStringOperand(2); }
2969   StringRef getSetterName() const { return getStringOperand(3); }
2970   DIType *getType() const { return cast_or_null<DIType>(getRawType()); }
2971 
2972   StringRef getFilename() const {
2973     if (auto *F = getFile())
2974       return F->getFilename();
2975     return "";
2976   }
2977 
2978   StringRef getDirectory() const {
2979     if (auto *F = getFile())
2980       return F->getDirectory();
2981     return "";
2982   }
2983 
2984   Optional<StringRef> getSource() const {
2985     if (auto *F = getFile())
2986       return F->getSource();
2987     return None;
2988   }
2989 
2990   MDString *getRawName() const { return getOperandAs<MDString>(0); }
2991   Metadata *getRawFile() const { return getOperand(1); }
2992   MDString *getRawGetterName() const { return getOperandAs<MDString>(2); }
2993   MDString *getRawSetterName() const { return getOperandAs<MDString>(3); }
2994   Metadata *getRawType() const { return getOperand(4); }
2995 
2996   static bool classof(const Metadata *MD) {
2997     return MD->getMetadataID() == DIObjCPropertyKind;
2998   }
2999 };
3000 
3001 /// An imported module (C++ using directive or similar).
3002 class DIImportedEntity : public DINode {
3003   friend class LLVMContextImpl;
3004   friend class MDNode;
3005 
3006   unsigned Line;
3007 
3008   DIImportedEntity(LLVMContext &C, StorageType Storage, unsigned Tag,
3009                    unsigned Line, ArrayRef<Metadata *> Ops)
3010       : DINode(C, DIImportedEntityKind, Storage, Tag, Ops), Line(Line) {}
3011   ~DIImportedEntity() = default;
3012 
3013   static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag,
3014                                    DIScope *Scope, DINode *Entity, DIFile *File,
3015                                    unsigned Line, StringRef Name,
3016                                    StorageType Storage,
3017                                    bool ShouldCreate = true) {
3018     return getImpl(Context, Tag, Scope, Entity, File, Line,
3019                    getCanonicalMDString(Context, Name), Storage, ShouldCreate);
3020   }
3021   static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag,
3022                                    Metadata *Scope, Metadata *Entity,
3023                                    Metadata *File, unsigned Line,
3024                                    MDString *Name, StorageType Storage,
3025                                    bool ShouldCreate = true);
3026 
3027   TempDIImportedEntity cloneImpl() const {
3028     return getTemporary(getContext(), getTag(), getScope(), getEntity(),
3029                         getFile(), getLine(), getName());
3030   }
3031 
3032 public:
3033   DEFINE_MDNODE_GET(DIImportedEntity,
3034                     (unsigned Tag, DIScope *Scope, DINode *Entity, DIFile *File,
3035                      unsigned Line, StringRef Name = ""),
3036                     (Tag, Scope, Entity, File, Line, Name))
3037   DEFINE_MDNODE_GET(DIImportedEntity,
3038                     (unsigned Tag, Metadata *Scope, Metadata *Entity,
3039                      Metadata *File, unsigned Line, MDString *Name),
3040                     (Tag, Scope, Entity, File, Line, Name))
3041 
3042   TempDIImportedEntity clone() const { return cloneImpl(); }
3043 
3044   unsigned getLine() const { return Line; }
3045   DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
3046   DINode *getEntity() const { return cast_or_null<DINode>(getRawEntity()); }
3047   StringRef getName() const { return getStringOperand(2); }
3048   DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
3049 
3050   Metadata *getRawScope() const { return getOperand(0); }
3051   Metadata *getRawEntity() const { return getOperand(1); }
3052   MDString *getRawName() const { return getOperandAs<MDString>(2); }
3053   Metadata *getRawFile() const { return getOperand(3); }
3054 
3055   static bool classof(const Metadata *MD) {
3056     return MD->getMetadataID() == DIImportedEntityKind;
3057   }
3058 };
3059 
3060 /// A pair of DIGlobalVariable and DIExpression.
3061 class DIGlobalVariableExpression : public MDNode {
3062   friend class LLVMContextImpl;
3063   friend class MDNode;
3064 
3065   DIGlobalVariableExpression(LLVMContext &C, StorageType Storage,
3066                              ArrayRef<Metadata *> Ops)
3067       : MDNode(C, DIGlobalVariableExpressionKind, Storage, Ops) {}
3068   ~DIGlobalVariableExpression() = default;
3069 
3070   static DIGlobalVariableExpression *
3071   getImpl(LLVMContext &Context, Metadata *Variable, Metadata *Expression,
3072           StorageType Storage, bool ShouldCreate = true);
3073 
3074   TempDIGlobalVariableExpression cloneImpl() const {
3075     return getTemporary(getContext(), getVariable(), getExpression());
3076   }
3077 
3078 public:
3079   DEFINE_MDNODE_GET(DIGlobalVariableExpression,
3080                     (Metadata * Variable, Metadata *Expression),
3081                     (Variable, Expression))
3082 
3083   TempDIGlobalVariableExpression clone() const { return cloneImpl(); }
3084 
3085   Metadata *getRawVariable() const { return getOperand(0); }
3086 
3087   DIGlobalVariable *getVariable() const {
3088     return cast_or_null<DIGlobalVariable>(getRawVariable());
3089   }
3090 
3091   Metadata *getRawExpression() const { return getOperand(1); }
3092 
3093   DIExpression *getExpression() const {
3094     return cast<DIExpression>(getRawExpression());
3095   }
3096 
3097   static bool classof(const Metadata *MD) {
3098     return MD->getMetadataID() == DIGlobalVariableExpressionKind;
3099   }
3100 };
3101 
3102 /// Macro Info DWARF-like metadata node.
3103 ///
3104 /// A metadata node with a DWARF macro info (i.e., a constant named
3105 /// \c DW_MACINFO_*, defined in llvm/BinaryFormat/Dwarf.h).  Called \a
3106 /// DIMacroNode
3107 /// because it's potentially used for non-DWARF output.
3108 class DIMacroNode : public MDNode {
3109   friend class LLVMContextImpl;
3110   friend class MDNode;
3111 
3112 protected:
3113   DIMacroNode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned MIType,
3114               ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = None)
3115       : MDNode(C, ID, Storage, Ops1, Ops2) {
3116     assert(MIType < 1u << 16);
3117     SubclassData16 = MIType;
3118   }
3119   ~DIMacroNode() = default;
3120 
3121   template <class Ty> Ty *getOperandAs(unsigned I) const {
3122     return cast_or_null<Ty>(getOperand(I));
3123   }
3124 
3125   StringRef getStringOperand(unsigned I) const {
3126     if (auto *S = getOperandAs<MDString>(I))
3127       return S->getString();
3128     return StringRef();
3129   }
3130 
3131   static MDString *getCanonicalMDString(LLVMContext &Context, StringRef S) {
3132     if (S.empty())
3133       return nullptr;
3134     return MDString::get(Context, S);
3135   }
3136 
3137 public:
3138   unsigned getMacinfoType() const { return SubclassData16; }
3139 
3140   static bool classof(const Metadata *MD) {
3141     switch (MD->getMetadataID()) {
3142     default:
3143       return false;
3144     case DIMacroKind:
3145     case DIMacroFileKind:
3146       return true;
3147     }
3148   }
3149 };
3150 
3151 class DIMacro : public DIMacroNode {
3152   friend class LLVMContextImpl;
3153   friend class MDNode;
3154 
3155   unsigned Line;
3156 
3157   DIMacro(LLVMContext &C, StorageType Storage, unsigned MIType, unsigned Line,
3158           ArrayRef<Metadata *> Ops)
3159       : DIMacroNode(C, DIMacroKind, Storage, MIType, Ops), Line(Line) {}
3160   ~DIMacro() = default;
3161 
3162   static DIMacro *getImpl(LLVMContext &Context, unsigned MIType, unsigned Line,
3163                           StringRef Name, StringRef Value, StorageType Storage,
3164                           bool ShouldCreate = true) {
3165     return getImpl(Context, MIType, Line, getCanonicalMDString(Context, Name),
3166                    getCanonicalMDString(Context, Value), Storage, ShouldCreate);
3167   }
3168   static DIMacro *getImpl(LLVMContext &Context, unsigned MIType, unsigned Line,
3169                           MDString *Name, MDString *Value, StorageType Storage,
3170                           bool ShouldCreate = true);
3171 
3172   TempDIMacro cloneImpl() const {
3173     return getTemporary(getContext(), getMacinfoType(), getLine(), getName(),
3174                         getValue());
3175   }
3176 
3177 public:
3178   DEFINE_MDNODE_GET(DIMacro, (unsigned MIType, unsigned Line, StringRef Name,
3179                               StringRef Value = ""),
3180                     (MIType, Line, Name, Value))
3181   DEFINE_MDNODE_GET(DIMacro, (unsigned MIType, unsigned Line, MDString *Name,
3182                               MDString *Value),
3183                     (MIType, Line, Name, Value))
3184 
3185   TempDIMacro clone() const { return cloneImpl(); }
3186 
3187   unsigned getLine() const { return Line; }
3188 
3189   StringRef getName() const { return getStringOperand(0); }
3190   StringRef getValue() const { return getStringOperand(1); }
3191 
3192   MDString *getRawName() const { return getOperandAs<MDString>(0); }
3193   MDString *getRawValue() const { return getOperandAs<MDString>(1); }
3194 
3195   static bool classof(const Metadata *MD) {
3196     return MD->getMetadataID() == DIMacroKind;
3197   }
3198 };
3199 
3200 class DIMacroFile : public DIMacroNode {
3201   friend class LLVMContextImpl;
3202   friend class MDNode;
3203 
3204   unsigned Line;
3205 
3206   DIMacroFile(LLVMContext &C, StorageType Storage, unsigned MIType,
3207               unsigned Line, ArrayRef<Metadata *> Ops)
3208       : DIMacroNode(C, DIMacroFileKind, Storage, MIType, Ops), Line(Line) {}
3209   ~DIMacroFile() = default;
3210 
3211   static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType,
3212                               unsigned Line, DIFile *File,
3213                               DIMacroNodeArray Elements, StorageType Storage,
3214                               bool ShouldCreate = true) {
3215     return getImpl(Context, MIType, Line, static_cast<Metadata *>(File),
3216                    Elements.get(), Storage, ShouldCreate);
3217   }
3218 
3219   static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType,
3220                               unsigned Line, Metadata *File, Metadata *Elements,
3221                               StorageType Storage, bool ShouldCreate = true);
3222 
3223   TempDIMacroFile cloneImpl() const {
3224     return getTemporary(getContext(), getMacinfoType(), getLine(), getFile(),
3225                         getElements());
3226   }
3227 
3228 public:
3229   DEFINE_MDNODE_GET(DIMacroFile, (unsigned MIType, unsigned Line, DIFile *File,
3230                                   DIMacroNodeArray Elements),
3231                     (MIType, Line, File, Elements))
3232   DEFINE_MDNODE_GET(DIMacroFile, (unsigned MIType, unsigned Line,
3233                                   Metadata *File, Metadata *Elements),
3234                     (MIType, Line, File, Elements))
3235 
3236   TempDIMacroFile clone() const { return cloneImpl(); }
3237 
3238   void replaceElements(DIMacroNodeArray Elements) {
3239 #ifndef NDEBUG
3240     for (DIMacroNode *Op : getElements())
3241       assert(is_contained(Elements->operands(), Op) &&
3242              "Lost a macro node during macro node list replacement");
3243 #endif
3244     replaceOperandWith(1, Elements.get());
3245   }
3246 
3247   unsigned getLine() const { return Line; }
3248   DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
3249 
3250   DIMacroNodeArray getElements() const {
3251     return cast_or_null<MDTuple>(getRawElements());
3252   }
3253 
3254   Metadata *getRawFile() const { return getOperand(0); }
3255   Metadata *getRawElements() const { return getOperand(1); }
3256 
3257   static bool classof(const Metadata *MD) {
3258     return MD->getMetadataID() == DIMacroFileKind;
3259   }
3260 };
3261 
3262 /// Identifies a unique instance of a variable.
3263 ///
3264 /// Storage for identifying a potentially inlined instance of a variable,
3265 /// or a fragment thereof. This guarantees that exactly one variable instance
3266 /// may be identified by this class, even when that variable is a fragment of
3267 /// an aggregate variable and/or there is another inlined instance of the same
3268 /// source code variable nearby.
3269 /// This class does not necessarily uniquely identify that variable: it is
3270 /// possible that a DebugVariable with different parameters may point to the
3271 /// same variable instance, but not that one DebugVariable points to multiple
3272 /// variable instances.
3273 class DebugVariable {
3274   using FragmentInfo = DIExpression::FragmentInfo;
3275 
3276   const DILocalVariable *Variable;
3277   Optional<FragmentInfo> Fragment;
3278   const DILocation *InlinedAt;
3279 
3280   /// Fragment that will overlap all other fragments. Used as default when
3281   /// caller demands a fragment.
3282   static const FragmentInfo DefaultFragment;
3283 
3284 public:
3285   DebugVariable(const DILocalVariable *Var, Optional<FragmentInfo> FragmentInfo,
3286                 const DILocation *InlinedAt)
3287       : Variable(Var), Fragment(FragmentInfo), InlinedAt(InlinedAt) {}
3288 
3289   DebugVariable(const DILocalVariable *Var, const DIExpression *DIExpr,
3290                 const DILocation *InlinedAt)
3291       : Variable(Var),
3292         Fragment(DIExpr ? DIExpr->getFragmentInfo() : NoneType()),
3293         InlinedAt(InlinedAt) {}
3294 
3295   const DILocalVariable *getVariable() const { return Variable; }
3296   const Optional<FragmentInfo> getFragment() const { return Fragment; }
3297   const DILocation *getInlinedAt() const { return InlinedAt; }
3298 
3299   const FragmentInfo getFragmentOrDefault() const {
3300     return Fragment.getValueOr(DefaultFragment);
3301   }
3302 
3303   static bool isDefaultFragment(const FragmentInfo F) {
3304     return F == DefaultFragment;
3305   }
3306 
3307   bool operator==(const DebugVariable &Other) const {
3308     return std::tie(Variable, Fragment, InlinedAt) ==
3309            std::tie(Other.Variable, Other.Fragment, Other.InlinedAt);
3310   }
3311 
3312   bool operator<(const DebugVariable &Other) const {
3313     return std::tie(Variable, Fragment, InlinedAt) <
3314            std::tie(Other.Variable, Other.Fragment, Other.InlinedAt);
3315   }
3316 };
3317 
3318 template <> struct DenseMapInfo<DebugVariable> {
3319   using FragmentInfo = DIExpression::FragmentInfo;
3320 
3321   /// Empty key: no key should be generated that has no DILocalVariable.
3322   static inline DebugVariable getEmptyKey() {
3323     return DebugVariable(nullptr, NoneType(), nullptr);
3324   }
3325 
3326   /// Difference in tombstone is that the Optional is meaningful.
3327   static inline DebugVariable getTombstoneKey() {
3328     return DebugVariable(nullptr, {{0, 0}}, nullptr);
3329   }
3330 
3331   static unsigned getHashValue(const DebugVariable &D) {
3332     unsigned HV = 0;
3333     const Optional<FragmentInfo> Fragment = D.getFragment();
3334     if (Fragment)
3335       HV = DenseMapInfo<FragmentInfo>::getHashValue(*Fragment);
3336 
3337     return hash_combine(D.getVariable(), HV, D.getInlinedAt());
3338   }
3339 
3340   static bool isEqual(const DebugVariable &A, const DebugVariable &B) {
3341     return A == B;
3342   }
3343 };
3344 
3345 } // end namespace llvm
3346 
3347 #undef DEFINE_MDNODE_GET_UNPACK_IMPL
3348 #undef DEFINE_MDNODE_GET_UNPACK
3349 #undef DEFINE_MDNODE_GET
3350 
3351 #endif // LLVM_IR_DEBUGINFOMETADATA_H
3352