Home | History | Annotate | Download | only in IR
      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 
     62 namespace 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.
     71 template <class T> class TypedDINodeRef {
     72   const Metadata *MD = nullptr;
     73 
     74 public:
     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 
     98 using DINodeRef = TypedDINodeRef<DINode>;
     99 using DIScopeRef = TypedDINodeRef<DIScope>;
    100 using DITypeRef = TypedDINodeRef<DIType>;
    101 
    102 class DITypeRefArray {
    103   const MDTuple *N = nullptr;
    104 
    105 public:
    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.
    155 class DINode : public MDNode {
    156   friend class LLVMContextImpl;
    157   friend class MDNode;
    158 
    159 protected:
    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 
    187 public:
    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 
    244 template <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 
    252 template <class T>
    253 struct 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.
    262 class 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 
    294 public:
    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.
    334 class 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 
    359 public:
    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.
    395 class 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 
    422 public:
    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.
    447 class DIScope : public DINode {
    448 protected:
    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 
    454 public:
    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.
    499 class DIFile : public DIScope {
    500   friend class LLVMContextImpl;
    501   friend class MDNode;
    502 
    503 public:
    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 
    535 private:
    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 
    570 public:
    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 
    607 StringRef DIScope::getFilename() const {
    608   if (auto *F = getFile())
    609     return F->getFilename();
    610   return "";
    611 }
    612 
    613 StringRef DIScope::getDirectory() const {
    614   if (auto *F = getFile())
    615     return F->getDirectory();
    616   return "";
    617 }
    618 
    619 Optional<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.
    630 class DIType : public DIScope {
    631   unsigned Line;
    632   DIFlags Flags;
    633   uint64_t SizeInBits;
    634   uint64_t OffsetInBits;
    635   uint32_t AlignInBits;
    636 
    637 protected:
    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 
    663 public:
    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.
    734 class 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 
    765 public:
    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.).
    798 class 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 
    843 public:
    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.
    934 class 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 
    990 public:
    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.
   1102 class 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 
   1132 public:
   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.
   1156 class DICompileUnit : public DIScope {
   1157   friend class LLVMContextImpl;
   1158   friend class MDNode;
   1159 
   1160 public:
   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 
   1171 private:
   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 
   1232 public:
   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.
   1340 class DILocalScope : public DIScope {
   1341 protected:
   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 
   1347 public:
   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.
   1370 class 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 
   1419 public:
   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.
   1578 class 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 
   1658 public:
   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 
   1697 public:
   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 
   1800 class DILexicalBlockBase : public DILocalScope {
   1801 protected:
   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 
   1807 public:
   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 
   1818 class 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 
   1851 public:
   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 
   1869 class 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 
   1900 public:
   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 
   1921 unsigned DILocation::getDiscriminator() const {
   1922   if (auto *F = dyn_cast<DILexicalBlockFile>(getScope()))
   1923     return F->getDiscriminator();
   1924   return 0;
   1925 }
   1926 
   1927 const DILocation *
   1928 DILocation::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 
   1944 unsigned DILocation::getBaseDiscriminator() const {
   1945   return getBaseDiscriminatorFromDiscriminator(getDiscriminator());
   1946 }
   1947 
   1948 unsigned DILocation::getDuplicationFactor() const {
   1949   return getDuplicationFactorFromDiscriminator(getDiscriminator());
   1950 }
   1951 
   1952 unsigned DILocation::getCopyIdentifier() const {
   1953   return getCopyIdentifierFromDiscriminator(getDiscriminator());
   1954 }
   1955 
   1956 const DILocation *DILocation::setBaseDiscriminator(unsigned D) const {
   1957   if (D == 0)
   1958     return this;
   1959   else
   1960     return cloneWithDiscriminator(getPrefixEncodingFromUnsigned(D) << 1);
   1961 }
   1962 
   1963 const 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 
   1980 class 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 
   2008 public:
   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 ///
   2032 class 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 
   2061 public:
   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.
   2091 class DITemplateParameter : public DINode {
   2092 protected:
   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 
   2098 public:
   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 
   2111 class 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 
   2135 public:
   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 
   2148 class 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 
   2175 public:
   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.
   2193 class DIVariable : public DINode {
   2194   unsigned Line;
   2195   uint32_t AlignInBits;
   2196 
   2197 protected:
   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 
   2204 public:
   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.
   2261 class 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 
   2280 public:
   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.
   2504 class 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 
   2544 public:
   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.
   2583 class 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 
   2619 public:
   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 ///
   2663 class 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 
   2691 public:
   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 
   2731 class 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 
   2766 public:
   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).
   2820 class 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 
   2850 public:
   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.
   2879 class 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 
   2896 public:
   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.
   2926 class DIMacroNode : public MDNode {
   2927   friend class LLVMContextImpl;
   2928   friend class MDNode;
   2929 
   2930 protected:
   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 
   2955 public:
   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 
   2969 class 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 
   2995 public:
   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 
   3018 class 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 
   3046 public:
   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