603fafc15fde9342e4aed1ef44c4b4605b8ce84d
[oota-llvm.git] / lib / IR / DIBuilder.cpp
1 //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the DIBuilder.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/IR/DIBuilder.h"
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/IR/Constants.h"
17 #include "llvm/IR/DebugInfo.h"
18 #include "llvm/IR/IntrinsicInst.h"
19 #include "llvm/IR/Module.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Support/Dwarf.h"
22
23 using namespace llvm;
24 using namespace llvm::dwarf;
25
26 namespace {
27 class HeaderBuilder {
28   /// \brief Whether there are any fields yet.
29   ///
30   /// Note that this is not equivalent to \c Chars.empty(), since \a concat()
31   /// may have been called already with an empty string.
32   bool IsEmpty;
33   SmallVector<char, 256> Chars;
34
35 public:
36   HeaderBuilder() : IsEmpty(true) {}
37   HeaderBuilder(const HeaderBuilder &X) : IsEmpty(X.IsEmpty), Chars(X.Chars) {}
38   HeaderBuilder(HeaderBuilder &&X)
39       : IsEmpty(X.IsEmpty), Chars(std::move(X.Chars)) {}
40
41   template <class Twineable> HeaderBuilder &concat(Twineable &&X) {
42     if (IsEmpty)
43       IsEmpty = false;
44     else
45       Chars.push_back(0);
46     Twine(X).toVector(Chars);
47     return *this;
48   }
49
50   MDString *get(LLVMContext &Context) const {
51     return MDString::get(Context, StringRef(Chars.begin(), Chars.size()));
52   }
53
54   static HeaderBuilder get(unsigned Tag) {
55     return HeaderBuilder().concat("0x" + Twine::utohexstr(Tag));
56   }
57 };
58 }
59
60 DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes)
61     : M(m), VMContext(M.getContext()), TempEnumTypes(nullptr),
62       TempRetainTypes(nullptr), TempSubprograms(nullptr), TempGVs(nullptr),
63       DeclareFn(nullptr), ValueFn(nullptr),
64       AllowUnresolvedNodes(AllowUnresolvedNodes) {}
65
66 void DIBuilder::trackIfUnresolved(MDNode *N) {
67   if (!N)
68     return;
69   if (N->isResolved())
70     return;
71
72   assert(AllowUnresolvedNodes && "Cannot handle unresolved nodes");
73   UnresolvedNodes.emplace_back(N);
74 }
75
76 void DIBuilder::finalize() {
77   DIArray Enums = getOrCreateArray(AllEnumTypes);
78   DIType(TempEnumTypes).replaceAllUsesWith(Enums);
79
80   SmallVector<Metadata *, 16> RetainValues;
81   // Declarations and definitions of the same type may be retained. Some
82   // clients RAUW these pairs, leaving duplicates in the retained types
83   // list. Use a set to remove the duplicates while we transform the
84   // TrackingVHs back into Values.
85   SmallPtrSet<Metadata *, 16> RetainSet;
86   for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
87     if (RetainSet.insert(AllRetainTypes[I]).second)
88       RetainValues.push_back(AllRetainTypes[I]);
89   DIArray RetainTypes = getOrCreateArray(RetainValues);
90   DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
91
92   DIArray SPs = getOrCreateArray(AllSubprograms);
93   DIType(TempSubprograms).replaceAllUsesWith(SPs);
94   for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
95     DISubprogram SP(SPs.getElement(i));
96     if (MDNode *Temp = SP.getVariablesNodes()) {
97       SmallVector<Metadata *, 4> Variables;
98       for (Metadata *V : PreservedVariables.lookup(SP))
99         Variables.push_back(V);
100       DIArray AV = getOrCreateArray(Variables);
101       DIType(Temp).replaceAllUsesWith(AV);
102     }
103   }
104
105   DIArray GVs = getOrCreateArray(AllGVs);
106   DIType(TempGVs).replaceAllUsesWith(GVs);
107
108   SmallVector<Metadata *, 16> RetainValuesI;
109   for (unsigned I = 0, E = AllImportedModules.size(); I < E; I++)
110     RetainValuesI.push_back(AllImportedModules[I]);
111   DIArray IMs = getOrCreateArray(RetainValuesI);
112   DIType(TempImportedModules).replaceAllUsesWith(IMs);
113
114   // Now that all temp nodes have been replaced or deleted, resolve remaining
115   // cycles.
116   for (const auto &N : UnresolvedNodes)
117     if (N && !N->isResolved())
118       N->resolveCycles();
119   UnresolvedNodes.clear();
120
121   // Can't handle unresolved nodes anymore.
122   AllowUnresolvedNodes = false;
123 }
124
125 /// If N is compile unit return NULL otherwise return N.
126 static MDNode *getNonCompileUnitScope(MDNode *N) {
127   if (DIDescriptor(N).isCompileUnit())
128     return nullptr;
129   return N;
130 }
131
132 static MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename,
133                                   StringRef Directory) {
134   assert(!Filename.empty() && "Unable to create file without name");
135   Metadata *Pair[] = {MDString::get(VMContext, Filename),
136                       MDString::get(VMContext, Directory)};
137   return MDNode::get(VMContext, Pair);
138 }
139
140 DICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
141                                            StringRef Directory,
142                                            StringRef Producer, bool isOptimized,
143                                            StringRef Flags, unsigned RunTimeVer,
144                                            StringRef SplitName,
145                                            DebugEmissionKind Kind,
146                                            bool EmitDebugInfo) {
147
148   assert(((Lang <= dwarf::DW_LANG_OCaml && Lang >= dwarf::DW_LANG_C89) ||
149           (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
150          "Invalid Language tag");
151   assert(!Filename.empty() &&
152          "Unable to create compile unit without filename");
153   Metadata *TElts[] = {HeaderBuilder::get(DW_TAG_base_type).get(VMContext)};
154   TempEnumTypes = MDNode::getTemporary(VMContext, TElts).release();
155
156   TempRetainTypes = MDNode::getTemporary(VMContext, TElts).release();
157
158   TempSubprograms = MDNode::getTemporary(VMContext, TElts).release();
159
160   TempGVs = MDNode::getTemporary(VMContext, TElts).release();
161
162   TempImportedModules = MDNode::getTemporary(VMContext, TElts).release();
163
164   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_compile_unit)
165                           .concat(Lang)
166                           .concat(Producer)
167                           .concat(isOptimized)
168                           .concat(Flags)
169                           .concat(RunTimeVer)
170                           .concat(SplitName)
171                           .concat(Kind)
172                           .get(VMContext),
173                       createFilePathPair(VMContext, Filename, Directory),
174                       TempEnumTypes, TempRetainTypes, TempSubprograms, TempGVs,
175                       TempImportedModules};
176
177   MDNode *CUNode = MDNode::get(VMContext, Elts);
178
179   // Create a named metadata so that it is easier to find cu in a module.
180   // Note that we only generate this when the caller wants to actually
181   // emit debug information. When we are only interested in tracking
182   // source line locations throughout the backend, we prevent codegen from
183   // emitting debug info in the final output by not generating llvm.dbg.cu.
184   if (EmitDebugInfo) {
185     NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
186     NMD->addOperand(CUNode);
187   }
188
189   trackIfUnresolved(CUNode);
190   return DICompileUnit(CUNode);
191 }
192
193 static DIImportedEntity
194 createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope Context,
195                      Metadata *NS, unsigned Line, StringRef Name,
196                      SmallVectorImpl<TrackingMDNodeRef> &AllImportedModules) {
197   const MDNode *R;
198   Metadata *Elts[] = {HeaderBuilder::get(Tag).concat(Line).concat(Name).get(C),
199                       Context, NS};
200   R = MDNode::get(C, Elts);
201   DIImportedEntity M(R);
202   assert(M.Verify() && "Imported module should be valid");
203   AllImportedModules.emplace_back(M.get());
204   return M;
205 }
206
207 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
208                                                  DINameSpace NS,
209                                                  unsigned Line) {
210   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
211                                 Context, NS, Line, StringRef(), AllImportedModules);
212 }
213
214 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
215                                                  DIImportedEntity NS,
216                                                  unsigned Line) {
217   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
218                                 Context, NS, Line, StringRef(), AllImportedModules);
219 }
220
221 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
222                                                       DIDescriptor Decl,
223                                                       unsigned Line, StringRef Name) {
224   // Make sure to use the unique identifier based metadata reference for
225   // types that have one.
226   Metadata *V =
227       Decl.isType() ? static_cast<Metadata *>(DIType(Decl).getRef()) : Decl;
228   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
229                                 Context, V, Line, Name,
230                                 AllImportedModules);
231 }
232
233 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
234                                                       DIImportedEntity Imp,
235                                                       unsigned Line, StringRef Name) {
236   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
237                                 Context, Imp, Line, Name, AllImportedModules);
238 }
239
240 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
241   Metadata *Elts[] = {
242       HeaderBuilder::get(dwarf::DW_TAG_file_type).get(VMContext),
243       createFilePathPair(VMContext, Filename, Directory)};
244   return DIFile(MDNode::get(VMContext, Elts));
245 }
246
247 DIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
248   assert(!Name.empty() && "Unable to create enumerator without name");
249   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_enumerator)
250                           .concat(Name)
251                           .concat(Val)
252                           .get(VMContext)};
253   return DIEnumerator(MDNode::get(VMContext, Elts));
254 }
255
256 DIBasicType DIBuilder::createUnspecifiedType(StringRef Name) {
257   assert(!Name.empty() && "Unable to create type without name");
258   // Unspecified types are encoded in DIBasicType format. Line number, filename,
259   // size, alignment, offset and flags are always empty here.
260   Metadata *Elts[] = {
261       HeaderBuilder::get(dwarf::DW_TAG_unspecified_type)
262           .concat(Name)
263           .concat(0)
264           .concat(0)
265           .concat(0)
266           .concat(0)
267           .concat(0)
268           .concat(0)
269           .get(VMContext),
270       nullptr, // Filename
271       nullptr  // Unused
272   };
273   return DIBasicType(MDNode::get(VMContext, Elts));
274 }
275
276 DIBasicType DIBuilder::createNullPtrType() {
277   return createUnspecifiedType("decltype(nullptr)");
278 }
279
280 DIBasicType
281 DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
282                            uint64_t AlignInBits, unsigned Encoding) {
283   assert(!Name.empty() && "Unable to create type without name");
284   // Basic types are encoded in DIBasicType format. Line number, filename,
285   // offset and flags are always empty here.
286   Metadata *Elts[] = {
287       HeaderBuilder::get(dwarf::DW_TAG_base_type)
288           .concat(Name)
289           .concat(0) // Line
290           .concat(SizeInBits)
291           .concat(AlignInBits)
292           .concat(0) // Offset
293           .concat(0) // Flags
294           .concat(Encoding)
295           .get(VMContext),
296       nullptr, // Filename
297       nullptr  // Unused
298   };
299   return DIBasicType(MDNode::get(VMContext, Elts));
300 }
301
302 DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
303   // Qualified types are encoded in DIDerivedType format.
304   Metadata *Elts[] = {HeaderBuilder::get(Tag)
305                           .concat(StringRef()) // Name
306                           .concat(0)           // Line
307                           .concat(0)           // Size
308                           .concat(0)           // Align
309                           .concat(0)           // Offset
310                           .concat(0)           // Flags
311                           .get(VMContext),
312                       nullptr, // Filename
313                       nullptr, // Unused
314                       FromTy.getRef()};
315   return DIDerivedType(MDNode::get(VMContext, Elts));
316 }
317
318 DIDerivedType
319 DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
320                              uint64_t AlignInBits, StringRef Name) {
321   // Pointer types are encoded in DIDerivedType format.
322   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_pointer_type)
323                           .concat(Name)
324                           .concat(0) // Line
325                           .concat(SizeInBits)
326                           .concat(AlignInBits)
327                           .concat(0) // Offset
328                           .concat(0) // Flags
329                           .get(VMContext),
330                       nullptr, // Filename
331                       nullptr, // Unused
332                       PointeeTy.getRef()};
333   return DIDerivedType(MDNode::get(VMContext, Elts));
334 }
335
336 DIDerivedType
337 DIBuilder::createMemberPointerType(DIType PointeeTy, DIType Base,
338                                    uint64_t SizeInBits, uint64_t AlignInBits) {
339   // Pointer types are encoded in DIDerivedType format.
340   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_ptr_to_member_type)
341                           .concat(StringRef())
342                           .concat(0) // Line
343                           .concat(SizeInBits) // Size
344                           .concat(AlignInBits) // Align
345                           .concat(0) // Offset
346                           .concat(0) // Flags
347                           .get(VMContext),
348                       nullptr, // Filename
349                       nullptr, // Unused
350                       PointeeTy.getRef(), Base.getRef()};
351   return DIDerivedType(MDNode::get(VMContext, Elts));
352 }
353
354 DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
355   assert(RTy.isType() && "Unable to create reference type");
356   // References are encoded in DIDerivedType format.
357   Metadata *Elts[] = {HeaderBuilder::get(Tag)
358                           .concat(StringRef()) // Name
359                           .concat(0)           // Line
360                           .concat(0)           // Size
361                           .concat(0)           // Align
362                           .concat(0)           // Offset
363                           .concat(0)           // Flags
364                           .get(VMContext),
365                       nullptr, // Filename
366                       nullptr, // TheCU,
367                       RTy.getRef()};
368   return DIDerivedType(MDNode::get(VMContext, Elts));
369 }
370
371 DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
372                                        unsigned LineNo, DIDescriptor Context) {
373   // typedefs are encoded in DIDerivedType format.
374   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_typedef)
375                           .concat(Name)
376                           .concat(LineNo)
377                           .concat(0) // Size
378                           .concat(0) // Align
379                           .concat(0) // Offset
380                           .concat(0) // Flags
381                           .get(VMContext),
382                       File.getFileNode(),
383                       DIScope(getNonCompileUnitScope(Context)).getRef(),
384                       Ty.getRef()};
385   return DIDerivedType(MDNode::get(VMContext, Elts));
386 }
387
388 DIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
389   // typedefs are encoded in DIDerivedType format.
390   assert(Ty.isType() && "Invalid type!");
391   assert(FriendTy.isType() && "Invalid friend type!");
392   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_friend)
393                           .concat(StringRef()) // Name
394                           .concat(0)           // Line
395                           .concat(0)           // Size
396                           .concat(0)           // Align
397                           .concat(0)           // Offset
398                           .concat(0)           // Flags
399                           .get(VMContext),
400                       nullptr, Ty.getRef(), FriendTy.getRef()};
401   return DIDerivedType(MDNode::get(VMContext, Elts));
402 }
403
404 DIDerivedType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
405                                            uint64_t BaseOffset,
406                                            unsigned Flags) {
407   assert(Ty.isType() && "Unable to create inheritance");
408   // TAG_inheritance is encoded in DIDerivedType format.
409   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_inheritance)
410                           .concat(StringRef()) // Name
411                           .concat(0)           // Line
412                           .concat(0)           // Size
413                           .concat(0)           // Align
414                           .concat(BaseOffset)
415                           .concat(Flags)
416                           .get(VMContext),
417                       nullptr, Ty.getRef(), BaseTy.getRef()};
418   return DIDerivedType(MDNode::get(VMContext, Elts));
419 }
420
421 DIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
422                                           DIFile File, unsigned LineNumber,
423                                           uint64_t SizeInBits,
424                                           uint64_t AlignInBits,
425                                           uint64_t OffsetInBits, unsigned Flags,
426                                           DIType Ty) {
427   // TAG_member is encoded in DIDerivedType format.
428   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
429                           .concat(Name)
430                           .concat(LineNumber)
431                           .concat(SizeInBits)
432                           .concat(AlignInBits)
433                           .concat(OffsetInBits)
434                           .concat(Flags)
435                           .get(VMContext),
436                       File.getFileNode(),
437                       DIScope(getNonCompileUnitScope(Scope)).getRef(),
438                       Ty.getRef()};
439   return DIDerivedType(MDNode::get(VMContext, Elts));
440 }
441
442 static Metadata *getConstantOrNull(Constant *C) {
443   if (C)
444     return ConstantAsMetadata::get(C);
445   return nullptr;
446 }
447
448 DIDerivedType DIBuilder::createStaticMemberType(DIDescriptor Scope,
449                                                 StringRef Name, DIFile File,
450                                                 unsigned LineNumber, DIType Ty,
451                                                 unsigned Flags,
452                                                 llvm::Constant *Val) {
453   // TAG_member is encoded in DIDerivedType format.
454   Flags |= DIDescriptor::FlagStaticMember;
455   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
456                           .concat(Name)
457                           .concat(LineNumber)
458                           .concat(0) // Size
459                           .concat(0) // Align
460                           .concat(0) // Offset
461                           .concat(Flags)
462                           .get(VMContext),
463                       File.getFileNode(),
464                       DIScope(getNonCompileUnitScope(Scope)).getRef(),
465                       Ty.getRef(), getConstantOrNull(Val)};
466   return DIDerivedType(MDNode::get(VMContext, Elts));
467 }
468
469 DIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File,
470                                         unsigned LineNumber,
471                                         uint64_t SizeInBits,
472                                         uint64_t AlignInBits,
473                                         uint64_t OffsetInBits, unsigned Flags,
474                                         DIType Ty, MDNode *PropertyNode) {
475   // TAG_member is encoded in DIDerivedType format.
476   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
477                           .concat(Name)
478                           .concat(LineNumber)
479                           .concat(SizeInBits)
480                           .concat(AlignInBits)
481                           .concat(OffsetInBits)
482                           .concat(Flags)
483                           .get(VMContext),
484                       File.getFileNode(), getNonCompileUnitScope(File), Ty,
485                       PropertyNode};
486   return DIDerivedType(MDNode::get(VMContext, Elts));
487 }
488
489 DIObjCProperty
490 DIBuilder::createObjCProperty(StringRef Name, DIFile File, unsigned LineNumber,
491                               StringRef GetterName, StringRef SetterName,
492                               unsigned PropertyAttributes, DIType Ty) {
493   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_APPLE_property)
494                           .concat(Name)
495                           .concat(LineNumber)
496                           .concat(GetterName)
497                           .concat(SetterName)
498                           .concat(PropertyAttributes)
499                           .get(VMContext),
500                       File, Ty};
501   return DIObjCProperty(MDNode::get(VMContext, Elts));
502 }
503
504 DITemplateTypeParameter
505 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
506                                        DIType Ty, MDNode *File, unsigned LineNo,
507                                        unsigned ColumnNo) {
508   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_template_type_parameter)
509                           .concat(Name)
510                           .concat(LineNo)
511                           .concat(ColumnNo)
512                           .get(VMContext),
513                       DIScope(getNonCompileUnitScope(Context)).getRef(),
514                       Ty.getRef(), File};
515   return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
516 }
517
518 static DITemplateValueParameter createTemplateValueParameterHelper(
519     LLVMContext &VMContext, unsigned Tag, DIDescriptor Context, StringRef Name,
520     DIType Ty, Metadata *MD, MDNode *File, unsigned LineNo, unsigned ColumnNo) {
521   Metadata *Elts[] = {
522       HeaderBuilder::get(Tag).concat(Name).concat(LineNo).concat(ColumnNo).get(
523           VMContext),
524       DIScope(getNonCompileUnitScope(Context)).getRef(), Ty.getRef(), MD, File};
525   return DITemplateValueParameter(MDNode::get(VMContext, Elts));
526 }
527
528 DITemplateValueParameter
529 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
530                                         DIType Ty, Constant *Val, MDNode *File,
531                                         unsigned LineNo, unsigned ColumnNo) {
532   return createTemplateValueParameterHelper(
533       VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
534       getConstantOrNull(Val), File, LineNo, ColumnNo);
535 }
536
537 DITemplateValueParameter
538 DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
539                                            DIType Ty, StringRef Val,
540                                            MDNode *File, unsigned LineNo,
541                                            unsigned ColumnNo) {
542   return createTemplateValueParameterHelper(
543       VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
544       MDString::get(VMContext, Val), File, LineNo, ColumnNo);
545 }
546
547 DITemplateValueParameter
548 DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
549                                        DIType Ty, DIArray Val,
550                                        MDNode *File, unsigned LineNo,
551                                        unsigned ColumnNo) {
552   return createTemplateValueParameterHelper(
553       VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
554       Val, File, LineNo, ColumnNo);
555 }
556
557 DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
558                                            DIFile File, unsigned LineNumber,
559                                            uint64_t SizeInBits,
560                                            uint64_t AlignInBits,
561                                            uint64_t OffsetInBits,
562                                            unsigned Flags, DIType DerivedFrom,
563                                            DIArray Elements,
564                                            DIType VTableHolder,
565                                            MDNode *TemplateParams,
566                                            StringRef UniqueIdentifier) {
567   assert((!Context || Context.isScope() || Context.isType()) &&
568          "createClassType should be called with a valid Context");
569   // TAG_class_type is encoded in DICompositeType format.
570   Metadata *Elts[] = {
571       HeaderBuilder::get(dwarf::DW_TAG_class_type)
572           .concat(Name)
573           .concat(LineNumber)
574           .concat(SizeInBits)
575           .concat(AlignInBits)
576           .concat(OffsetInBits)
577           .concat(Flags)
578           .concat(0)
579           .get(VMContext),
580       File.getFileNode(), DIScope(getNonCompileUnitScope(Context)).getRef(),
581       DerivedFrom.getRef(), Elements, VTableHolder.getRef(), TemplateParams,
582       UniqueIdentifier.empty() ? nullptr
583                                : MDString::get(VMContext, UniqueIdentifier)};
584   DICompositeType R(MDNode::get(VMContext, Elts));
585   assert(R.isCompositeType() &&
586          "createClassType should return a DICompositeType");
587   if (!UniqueIdentifier.empty())
588     retainType(R);
589   return R;
590 }
591
592 DICompositeType DIBuilder::createStructType(DIDescriptor Context,
593                                             StringRef Name, DIFile File,
594                                             unsigned LineNumber,
595                                             uint64_t SizeInBits,
596                                             uint64_t AlignInBits,
597                                             unsigned Flags, DIType DerivedFrom,
598                                             DIArray Elements,
599                                             unsigned RunTimeLang,
600                                             DIType VTableHolder,
601                                             StringRef UniqueIdentifier) {
602  // TAG_structure_type is encoded in DICompositeType format.
603   Metadata *Elts[] = {
604       HeaderBuilder::get(dwarf::DW_TAG_structure_type)
605           .concat(Name)
606           .concat(LineNumber)
607           .concat(SizeInBits)
608           .concat(AlignInBits)
609           .concat(0)
610           .concat(Flags)
611           .concat(RunTimeLang)
612           .get(VMContext),
613       File.getFileNode(), DIScope(getNonCompileUnitScope(Context)).getRef(),
614       DerivedFrom.getRef(), Elements, VTableHolder.getRef(), nullptr,
615       UniqueIdentifier.empty() ? nullptr
616                                : MDString::get(VMContext, UniqueIdentifier)};
617   DICompositeType R(MDNode::get(VMContext, Elts));
618   assert(R.isCompositeType() &&
619          "createStructType should return a DICompositeType");
620   if (!UniqueIdentifier.empty())
621     retainType(R);
622   return R;
623 }
624
625 DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
626                                            DIFile File, unsigned LineNumber,
627                                            uint64_t SizeInBits,
628                                            uint64_t AlignInBits, unsigned Flags,
629                                            DIArray Elements,
630                                            unsigned RunTimeLang,
631                                            StringRef UniqueIdentifier) {
632   // TAG_union_type is encoded in DICompositeType format.
633   Metadata *Elts[] = {
634       HeaderBuilder::get(dwarf::DW_TAG_union_type)
635           .concat(Name)
636           .concat(LineNumber)
637           .concat(SizeInBits)
638           .concat(AlignInBits)
639           .concat(0) // Offset
640           .concat(Flags)
641           .concat(RunTimeLang)
642           .get(VMContext),
643       File.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(),
644       nullptr, Elements, nullptr, nullptr,
645       UniqueIdentifier.empty() ? nullptr
646                                : MDString::get(VMContext, UniqueIdentifier)};
647   DICompositeType R(MDNode::get(VMContext, Elts));
648   if (!UniqueIdentifier.empty())
649     retainType(R);
650   return R;
651 }
652
653 DISubroutineType DIBuilder::createSubroutineType(DIFile File,
654                                                  DITypeArray ParameterTypes,
655                                                  unsigned Flags) {
656   // TAG_subroutine_type is encoded in DICompositeType format.
657   Metadata *Elts[] = {
658       HeaderBuilder::get(dwarf::DW_TAG_subroutine_type)
659           .concat(StringRef())
660           .concat(0)     // Line
661           .concat(0)     // Size
662           .concat(0)     // Align
663           .concat(0)     // Offset
664           .concat(Flags) // Flags
665           .concat(0)
666           .get(VMContext),
667       nullptr, nullptr, nullptr, ParameterTypes, nullptr, nullptr,
668       nullptr // Type Identifer
669   };
670   return DISubroutineType(MDNode::get(VMContext, Elts));
671 }
672
673 DICompositeType DIBuilder::createEnumerationType(
674     DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
675     uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
676     DIType UnderlyingType, StringRef UniqueIdentifier) {
677   // TAG_enumeration_type is encoded in DICompositeType format.
678   Metadata *Elts[] = {
679       HeaderBuilder::get(dwarf::DW_TAG_enumeration_type)
680           .concat(Name)
681           .concat(LineNumber)
682           .concat(SizeInBits)
683           .concat(AlignInBits)
684           .concat(0) // Offset
685           .concat(0) // Flags
686           .concat(0)
687           .get(VMContext),
688       File.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(),
689       UnderlyingType.getRef(), Elements, nullptr, nullptr,
690       UniqueIdentifier.empty() ? nullptr
691                                : MDString::get(VMContext, UniqueIdentifier)};
692   DICompositeType CTy(MDNode::get(VMContext, Elts));
693   AllEnumTypes.push_back(CTy);
694   if (!UniqueIdentifier.empty())
695     retainType(CTy);
696   return CTy;
697 }
698
699 DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
700                                            DIType Ty, DIArray Subscripts) {
701   // TAG_array_type is encoded in DICompositeType format.
702   Metadata *Elts[] = {
703       HeaderBuilder::get(dwarf::DW_TAG_array_type)
704           .concat(StringRef())
705           .concat(0) // Line
706           .concat(Size)
707           .concat(AlignInBits)
708           .concat(0) // Offset
709           .concat(0) // Flags
710           .concat(0)
711           .get(VMContext),
712       nullptr, // Filename/Directory,
713       nullptr, // Unused
714       Ty.getRef(), Subscripts, nullptr, nullptr,
715       nullptr // Type Identifer
716   };
717   return DICompositeType(MDNode::get(VMContext, Elts));
718 }
719
720 DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
721                                             DIType Ty, DIArray Subscripts) {
722   // A vector is an array type with the FlagVector flag applied.
723   Metadata *Elts[] = {
724       HeaderBuilder::get(dwarf::DW_TAG_array_type)
725           .concat("")
726           .concat(0) // Line
727           .concat(Size)
728           .concat(AlignInBits)
729           .concat(0) // Offset
730           .concat(DIType::FlagVector)
731           .concat(0)
732           .get(VMContext),
733       nullptr, // Filename/Directory,
734       nullptr, // Unused
735       Ty.getRef(), Subscripts, nullptr, nullptr,
736       nullptr // Type Identifer
737   };
738   return DICompositeType(MDNode::get(VMContext, Elts));
739 }
740
741 static HeaderBuilder setTypeFlagsInHeader(StringRef Header,
742                                           unsigned FlagsToSet) {
743   DIHeaderFieldIterator I(Header);
744   std::advance(I, 6);
745
746   unsigned Flags;
747   if (I->getAsInteger(0, Flags))
748     Flags = 0;
749   Flags |= FlagsToSet;
750
751   return HeaderBuilder()
752       .concat(I.getPrefix())
753       .concat(Flags)
754       .concat(I.getSuffix());
755 }
756
757 static DIType createTypeWithFlags(LLVMContext &Context, DIType Ty,
758                                   unsigned FlagsToSet) {
759   SmallVector<Metadata *, 9> Elts;
760   MDNode *N = Ty;
761   assert(N && "Unexpected input DIType!");
762   // Update header field.
763   Elts.push_back(setTypeFlagsInHeader(Ty.getHeader(), FlagsToSet).get(Context));
764   for (unsigned I = 1, E = N->getNumOperands(); I != E; ++I)
765     Elts.push_back(N->getOperand(I));
766
767   return DIType(MDNode::get(Context, Elts));
768 }
769
770 DIType DIBuilder::createArtificialType(DIType Ty) {
771   if (Ty.isArtificial())
772     return Ty;
773   return createTypeWithFlags(VMContext, Ty, DIType::FlagArtificial);
774 }
775
776 DIType DIBuilder::createObjectPointerType(DIType Ty) {
777   if (Ty.isObjectPointer())
778     return Ty;
779   unsigned Flags = DIType::FlagObjectPointer | DIType::FlagArtificial;
780   return createTypeWithFlags(VMContext, Ty, Flags);
781 }
782
783 void DIBuilder::retainType(DIType T) { AllRetainTypes.emplace_back(T); }
784
785 DIBasicType DIBuilder::createUnspecifiedParameter() {
786   return DIBasicType();
787 }
788
789 DICompositeType
790 DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope,
791                              DIFile F, unsigned Line, unsigned RuntimeLang,
792                              uint64_t SizeInBits, uint64_t AlignInBits,
793                              StringRef UniqueIdentifier) {
794   // Create a temporary MDNode.
795   Metadata *Elts[] = {
796       HeaderBuilder::get(Tag)
797           .concat(Name)
798           .concat(Line)
799           .concat(SizeInBits)
800           .concat(AlignInBits)
801           .concat(0) // Offset
802           .concat(DIDescriptor::FlagFwdDecl)
803           .concat(RuntimeLang)
804           .get(VMContext),
805       F.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr,
806       DIArray(), nullptr,
807       nullptr, // TemplateParams
808       UniqueIdentifier.empty() ? nullptr
809                                : MDString::get(VMContext, UniqueIdentifier)};
810   MDNode *Node = MDNode::get(VMContext, Elts);
811   DICompositeType RetTy(Node);
812   assert(RetTy.isCompositeType() &&
813          "createForwardDecl result should be a DIType");
814   if (!UniqueIdentifier.empty())
815     retainType(RetTy);
816   return RetTy;
817 }
818
819 DICompositeType DIBuilder::createReplaceableForwardDecl(
820     unsigned Tag, StringRef Name, DIDescriptor Scope, DIFile F, unsigned Line,
821     unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
822     StringRef UniqueIdentifier) {
823   // Create a temporary MDNode.
824   Metadata *Elts[] = {
825       HeaderBuilder::get(Tag)
826           .concat(Name)
827           .concat(Line)
828           .concat(SizeInBits)
829           .concat(AlignInBits)
830           .concat(0) // Offset
831           .concat(DIDescriptor::FlagFwdDecl)
832           .concat(RuntimeLang)
833           .get(VMContext),
834       F.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr,
835       DIArray(), nullptr,
836       nullptr, // TemplateParams
837       UniqueIdentifier.empty() ? nullptr
838                                : MDString::get(VMContext, UniqueIdentifier)};
839   DICompositeType RetTy(MDNode::getTemporary(VMContext, Elts).release());
840   assert(RetTy.isCompositeType() &&
841          "createReplaceableForwardDecl result should be a DIType");
842   if (!UniqueIdentifier.empty())
843     retainType(RetTy);
844   return RetTy;
845 }
846
847 DIArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
848   return DIArray(MDNode::get(VMContext, Elements));
849 }
850
851 DITypeArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
852   SmallVector<llvm::Metadata *, 16> Elts;
853   for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
854     if (Elements[i] && isa<MDNode>(Elements[i]))
855       Elts.push_back(DIType(cast<MDNode>(Elements[i])).getRef());
856     else
857       Elts.push_back(Elements[i]);
858   }
859   return DITypeArray(MDNode::get(VMContext, Elts));
860 }
861
862 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
863   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subrange_type)
864                           .concat(Lo)
865                           .concat(Count)
866                           .get(VMContext)};
867
868   return DISubrange(MDNode::get(VMContext, Elts));
869 }
870
871 static DIGlobalVariable createGlobalVariableHelper(
872     LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
873     StringRef LinkageName, DIFile F, unsigned LineNumber, DITypeRef Ty,
874     bool isLocalToUnit, Constant *Val, MDNode *Decl, bool isDefinition,
875     std::function<MDNode *(ArrayRef<Metadata *>)> CreateFunc) {
876
877   MDNode *TheCtx = getNonCompileUnitScope(Context);
878   if (DIScope(TheCtx).isCompositeType()) {
879     assert(!DICompositeType(TheCtx).getIdentifier() &&
880            "Context of a global variable should not be a type with identifier");
881   }
882
883   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_variable)
884                           .concat(Name)
885                           .concat(Name)
886                           .concat(LinkageName)
887                           .concat(LineNumber)
888                           .concat(isLocalToUnit)
889                           .concat(isDefinition)
890                           .get(VMContext),
891                       TheCtx, F, Ty, getConstantOrNull(Val),
892                       DIDescriptor(Decl)};
893
894   return DIGlobalVariable(CreateFunc(Elts));
895 }
896
897 DIGlobalVariable DIBuilder::createGlobalVariable(
898     DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
899     unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
900     MDNode *Decl) {
901   return createGlobalVariableHelper(
902       VMContext, Context, Name, LinkageName, F, LineNumber, Ty, isLocalToUnit,
903       Val, Decl, true, [&](ArrayRef<Metadata *> Elts) -> MDNode *{
904         MDNode *Node = MDNode::get(VMContext, Elts);
905         AllGVs.push_back(Node);
906         return Node;
907       });
908 }
909
910 DIGlobalVariable DIBuilder::createTempGlobalVariableFwdDecl(
911     DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
912     unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
913     MDNode *Decl) {
914   return createGlobalVariableHelper(VMContext, Context, Name, LinkageName, F,
915                                     LineNumber, Ty, isLocalToUnit, Val, Decl,
916                                     false, [&](ArrayRef<Metadata *> Elts) {
917     return MDNode::getTemporary(VMContext, Elts).release();
918   });
919 }
920
921 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
922                                           StringRef Name, DIFile File,
923                                           unsigned LineNo, DITypeRef Ty,
924                                           bool AlwaysPreserve, unsigned Flags,
925                                           unsigned ArgNo) {
926   DIDescriptor Context(getNonCompileUnitScope(Scope));
927   assert((!Context || Context.isScope()) &&
928          "createLocalVariable should be called with a valid Context");
929   Metadata *Elts[] = {HeaderBuilder::get(Tag)
930                           .concat(Name)
931                           .concat(LineNo | (ArgNo << 24))
932                           .concat(Flags)
933                           .get(VMContext),
934                       getNonCompileUnitScope(Scope), File, Ty};
935   MDNode *Node = MDNode::get(VMContext, Elts);
936   if (AlwaysPreserve) {
937     // The optimizer may remove local variable. If there is an interest
938     // to preserve variable info in such situation then stash it in a
939     // named mdnode.
940     DISubprogram Fn(getDISubprogram(Scope));
941     assert(Fn && "Missing subprogram for local variable");
942     PreservedVariables[Fn].emplace_back(Node);
943   }
944   DIVariable RetVar(Node);
945   assert(RetVar.isVariable() &&
946          "createLocalVariable should return a valid DIVariable");
947   return RetVar;
948 }
949
950 DIExpression DIBuilder::createExpression(ArrayRef<int64_t> Addr) {
951   auto Header = HeaderBuilder::get(DW_TAG_expression);
952   for (int64_t I : Addr)
953     Header.concat(I);
954   Metadata *Elts[] = {Header.get(VMContext)};
955   return DIExpression(MDNode::get(VMContext, Elts));
956 }
957
958 DIExpression DIBuilder::createPieceExpression(unsigned OffsetInBytes,
959                                               unsigned SizeInBytes) {
960   int64_t Addr[] = {dwarf::DW_OP_piece, OffsetInBytes, SizeInBytes};
961   return createExpression(Addr);
962 }
963
964 DISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
965                                        StringRef LinkageName, DIFile File,
966                                        unsigned LineNo, DICompositeType Ty,
967                                        bool isLocalToUnit, bool isDefinition,
968                                        unsigned ScopeLine, unsigned Flags,
969                                        bool isOptimized, Function *Fn,
970                                        MDNode *TParams, MDNode *Decl) {
971   // dragonegg does not generate identifier for types, so using an empty map
972   // to resolve the context should be fine.
973   DITypeIdentifierMap EmptyMap;
974   return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File,
975                         LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
976                         Flags, isOptimized, Fn, TParams, Decl);
977 }
978
979 static DISubprogram createFunctionHelper(
980     LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
981     StringRef LinkageName, DIFile File, unsigned LineNo, DICompositeType Ty,
982     bool isLocalToUnit, bool isDefinition, unsigned ScopeLine, unsigned Flags,
983     bool isOptimized, Function *Fn, MDNode *TParams, MDNode *Decl, MDNode *Vars,
984     std::function<MDNode *(ArrayRef<Metadata *>)> CreateFunc) {
985   assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
986          "function types should be subroutines");
987   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subprogram)
988                           .concat(Name)
989                           .concat(Name)
990                           .concat(LinkageName)
991                           .concat(LineNo)
992                           .concat(isLocalToUnit)
993                           .concat(isDefinition)
994                           .concat(0)
995                           .concat(0)
996                           .concat(Flags)
997                           .concat(isOptimized)
998                           .concat(ScopeLine)
999                           .get(VMContext),
1000                       File.getFileNode(),
1001                       DIScope(getNonCompileUnitScope(Context)).getRef(), Ty,
1002                       nullptr, getConstantOrNull(Fn), TParams, Decl, Vars};
1003
1004   DISubprogram S(CreateFunc(Elts));
1005   assert(S.isSubprogram() &&
1006          "createFunction should return a valid DISubprogram");
1007   return S;
1008 }
1009
1010
1011 DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
1012                                        StringRef LinkageName, DIFile File,
1013                                        unsigned LineNo, DICompositeType Ty,
1014                                        bool isLocalToUnit, bool isDefinition,
1015                                        unsigned ScopeLine, unsigned Flags,
1016                                        bool isOptimized, Function *Fn,
1017                                        MDNode *TParams, MDNode *Decl) {
1018   return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
1019                               LineNo, Ty, isLocalToUnit, isDefinition,
1020                               ScopeLine, Flags, isOptimized, Fn, TParams, Decl,
1021                               MDNode::getTemporary(VMContext, None).release(),
1022                               [&](ArrayRef<Metadata *> Elts) -> MDNode *{
1023     MDNode *Node = MDNode::get(VMContext, Elts);
1024     // Create a named metadata so that we
1025     // do not lose this mdnode.
1026     if (isDefinition)
1027       AllSubprograms.push_back(Node);
1028     return Node;
1029   });
1030 }
1031
1032 DISubprogram
1033 DIBuilder::createTempFunctionFwdDecl(DIDescriptor Context, StringRef Name,
1034                                      StringRef LinkageName, DIFile File,
1035                                      unsigned LineNo, DICompositeType Ty,
1036                                      bool isLocalToUnit, bool isDefinition,
1037                                      unsigned ScopeLine, unsigned Flags,
1038                                      bool isOptimized, Function *Fn,
1039                                      MDNode *TParams, MDNode *Decl) {
1040   return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
1041                               LineNo, Ty, isLocalToUnit, isDefinition,
1042                               ScopeLine, Flags, isOptimized, Fn, TParams, Decl,
1043                               nullptr, [&](ArrayRef<Metadata *> Elts) {
1044     return MDNode::getTemporary(VMContext, Elts).release();
1045   });
1046 }
1047
1048 DISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
1049                                      StringRef LinkageName, DIFile F,
1050                                      unsigned LineNo, DICompositeType Ty,
1051                                      bool isLocalToUnit, bool isDefinition,
1052                                      unsigned VK, unsigned VIndex,
1053                                      DIType VTableHolder, unsigned Flags,
1054                                      bool isOptimized, Function *Fn,
1055                                      MDNode *TParam) {
1056   assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1057          "function types should be subroutines");
1058   assert(getNonCompileUnitScope(Context) &&
1059          "Methods should have both a Context and a context that isn't "
1060          "the compile unit.");
1061   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subprogram)
1062                           .concat(Name)
1063                           .concat(Name)
1064                           .concat(LinkageName)
1065                           .concat(LineNo)
1066                           .concat(isLocalToUnit)
1067                           .concat(isDefinition)
1068                           .concat(VK)
1069                           .concat(VIndex)
1070                           .concat(Flags)
1071                           .concat(isOptimized)
1072                           .concat(LineNo)
1073                           // FIXME: Do we want to use different scope/lines?
1074                           .get(VMContext),
1075                       F.getFileNode(), DIScope(Context).getRef(), Ty,
1076                       VTableHolder.getRef(), getConstantOrNull(Fn), TParam,
1077                       nullptr, nullptr};
1078   MDNode *Node = MDNode::get(VMContext, Elts);
1079   if (isDefinition)
1080     AllSubprograms.push_back(Node);
1081   DISubprogram S(Node);
1082   assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
1083   return S;
1084 }
1085
1086 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
1087                                        DIFile File, unsigned LineNo) {
1088   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_namespace)
1089                           .concat(Name)
1090                           .concat(LineNo)
1091                           .get(VMContext),
1092                       File.getFileNode(), getNonCompileUnitScope(Scope)};
1093   DINameSpace R(MDNode::get(VMContext, Elts));
1094   assert(R.Verify() &&
1095          "createNameSpace should return a verifiable DINameSpace");
1096   return R;
1097 }
1098
1099 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
1100                                                      DIFile File,
1101                                                      unsigned Discriminator) {
1102   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_lexical_block)
1103                           .concat(Discriminator)
1104                           .get(VMContext),
1105                       File.getFileNode(), Scope};
1106   DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1107   assert(
1108       R.Verify() &&
1109       "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1110   return R;
1111 }
1112
1113 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
1114                                              unsigned Line, unsigned Col) {
1115   // FIXME: This isn't thread safe nor the right way to defeat MDNode uniquing.
1116   // I believe the right way is to have a self-referential element in the node.
1117   // Also: why do we bother with line/column - they're not used and the
1118   // documentation (SourceLevelDebugging.rst) claims the line/col are necessary
1119   // for uniquing, yet then we have this other solution (because line/col were
1120   // inadequate) anyway. Remove all 3 and replace them with a self-reference.
1121
1122   // Defeat MDNode uniquing for lexical blocks by using unique id.
1123   static unsigned int unique_id = 0;
1124   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_lexical_block)
1125                           .concat(Line)
1126                           .concat(Col)
1127                           .concat(unique_id++)
1128                           .get(VMContext),
1129                       File.getFileNode(), getNonCompileUnitScope(Scope)};
1130   DILexicalBlock R(MDNode::get(VMContext, Elts));
1131   assert(R.Verify() &&
1132          "createLexicalBlock should return a verifiable DILexicalBlock");
1133   return R;
1134 }
1135
1136 static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
1137   assert(V && "no value passed to dbg intrinsic");
1138   return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
1139 }
1140
1141 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1142                                       DIExpression Expr,
1143                                       Instruction *InsertBefore) {
1144   assert(VarInfo.isVariable() &&
1145          "empty or invalid DIVariable passed to dbg.declare");
1146   if (!DeclareFn)
1147     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1148
1149   trackIfUnresolved(VarInfo);
1150   trackIfUnresolved(Expr);
1151   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
1152                    MetadataAsValue::get(VMContext, VarInfo),
1153                    MetadataAsValue::get(VMContext, Expr)};
1154   return CallInst::Create(DeclareFn, Args, "", InsertBefore);
1155 }
1156
1157 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1158                                       DIExpression Expr,
1159                                       BasicBlock *InsertAtEnd) {
1160   assert(VarInfo.isVariable() &&
1161          "empty or invalid DIVariable passed to dbg.declare");
1162   if (!DeclareFn)
1163     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1164
1165   trackIfUnresolved(VarInfo);
1166   trackIfUnresolved(Expr);
1167   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
1168                    MetadataAsValue::get(VMContext, VarInfo),
1169                    MetadataAsValue::get(VMContext, Expr)};
1170
1171   // If this block already has a terminator then insert this intrinsic
1172   // before the terminator.
1173   if (TerminatorInst *T = InsertAtEnd->getTerminator())
1174     return CallInst::Create(DeclareFn, Args, "", T);
1175   else
1176     return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
1177 }
1178
1179 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1180                                                 DIVariable VarInfo,
1181                                                 DIExpression Expr,
1182                                                 Instruction *InsertBefore) {
1183   assert(V && "no value passed to dbg.value");
1184   assert(VarInfo.isVariable() &&
1185          "empty or invalid DIVariable passed to dbg.value");
1186   if (!ValueFn)
1187     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1188
1189   trackIfUnresolved(VarInfo);
1190   trackIfUnresolved(Expr);
1191   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
1192                    ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
1193                    MetadataAsValue::get(VMContext, VarInfo),
1194                    MetadataAsValue::get(VMContext, Expr)};
1195   return CallInst::Create(ValueFn, Args, "", InsertBefore);
1196 }
1197
1198 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1199                                                 DIVariable VarInfo,
1200                                                 DIExpression Expr,
1201                                                 BasicBlock *InsertAtEnd) {
1202   assert(V && "no value passed to dbg.value");
1203   assert(VarInfo.isVariable() &&
1204          "empty or invalid DIVariable passed to dbg.value");
1205   if (!ValueFn)
1206     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1207
1208   trackIfUnresolved(VarInfo);
1209   trackIfUnresolved(Expr);
1210   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
1211                    ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
1212                    MetadataAsValue::get(VMContext, VarInfo),
1213                    MetadataAsValue::get(VMContext, Expr)};
1214   return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1215 }
1216
1217 void DIBuilder::replaceVTableHolder(DICompositeType &T, DICompositeType VTableHolder) {
1218   T.setContainingType(VTableHolder);
1219
1220   // If this didn't create a self-reference, just return.
1221   if (T != VTableHolder)
1222     return;
1223
1224   // Look for unresolved operands.  T has dropped RAUW support and is already
1225   // marked resolved, orphaning any cycles underneath it.
1226   assert(T->isResolved() && "Expected self-reference to be resolved");
1227   for (const MDOperand &O : T->operands())
1228     if (auto *N = dyn_cast_or_null<MDNode>(O))
1229       trackIfUnresolved(N);
1230 }
1231
1232 void DIBuilder::replaceArrays(DICompositeType &T, DIArray Elements,
1233                               DIArray TParams) {
1234   T.setArrays(Elements, TParams);
1235
1236   // If T isn't resolved, there's no problem.
1237   if (!T->isResolved())
1238     return;
1239
1240   // If "T" is resolved, it may be due to a self-reference cycle.  Track the
1241   // arrays explicitly if they're unresolved, or else the cycles will be
1242   // orphaned.
1243   if (Elements)
1244     trackIfUnresolved(Elements);
1245   if (TParams)
1246     trackIfUnresolved(TParams);
1247 }