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