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