Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

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