R600/SI: Move gds operand to the end of operand list
[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 DICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
131                                            StringRef Directory,
132                                            StringRef Producer, bool isOptimized,
133                                            StringRef Flags, unsigned RunTimeVer,
134                                            StringRef SplitName,
135                                            DebugEmissionKind Kind,
136                                            bool EmitDebugInfo) {
137
138   assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) ||
139           (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
140          "Invalid Language tag");
141   assert(!Filename.empty() &&
142          "Unable to create compile unit without filename");
143
144   // TODO: Once we make MDCompileUnit distinct, stop using temporaries here
145   // (just start with operands assigned to nullptr).
146   TempEnumTypes = MDTuple::getTemporary(VMContext, None).release();
147   TempRetainTypes = MDTuple::getTemporary(VMContext, None).release();
148   TempSubprograms = MDTuple::getTemporary(VMContext, None).release();
149   TempGVs = MDTuple::getTemporary(VMContext, None).release();
150   TempImportedModules = MDTuple::getTemporary(VMContext, None).release();
151
152   // TODO: Switch to getDistinct().  We never want to merge compile units based
153   // on contents.
154   MDNode *CUNode = MDCompileUnit::get(
155       VMContext, Lang, MDFile::get(VMContext, Filename, Directory), Producer,
156       isOptimized, Flags, RunTimeVer, SplitName, Kind, TempEnumTypes,
157       TempRetainTypes, TempSubprograms, TempGVs, TempImportedModules);
158
159   // Create a named metadata so that it is easier to find cu in a module.
160   // Note that we only generate this when the caller wants to actually
161   // emit debug information. When we are only interested in tracking
162   // source line locations throughout the backend, we prevent codegen from
163   // emitting debug info in the final output by not generating llvm.dbg.cu.
164   if (EmitDebugInfo) {
165     NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
166     NMD->addOperand(CUNode);
167   }
168
169   trackIfUnresolved(CUNode);
170   return DICompileUnit(CUNode);
171 }
172
173 static DIImportedEntity
174 createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope Context,
175                      Metadata *NS, unsigned Line, StringRef Name,
176                      SmallVectorImpl<TrackingMDNodeRef> &AllImportedModules) {
177   DIImportedEntity M = MDImportedEntity::get(C, Tag, Context, NS, Line, Name);
178   assert(M.Verify() && "Imported module should be valid");
179   AllImportedModules.emplace_back(M.get());
180   return M;
181 }
182
183 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
184                                                  DINameSpace NS,
185                                                  unsigned Line) {
186   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
187                                 Context, NS, Line, StringRef(), AllImportedModules);
188 }
189
190 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
191                                                  DIImportedEntity NS,
192                                                  unsigned Line) {
193   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
194                                 Context, NS, Line, StringRef(), AllImportedModules);
195 }
196
197 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
198                                                       DIDescriptor Decl,
199                                                       unsigned Line, StringRef Name) {
200   // Make sure to use the unique identifier based metadata reference for
201   // types that have one.
202   Metadata *V =
203       Decl.isType() ? static_cast<Metadata *>(DIType(Decl).getRef()) : Decl;
204   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
205                                 Context, V, Line, Name,
206                                 AllImportedModules);
207 }
208
209 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
210                                                       DIImportedEntity Imp,
211                                                       unsigned Line, StringRef Name) {
212   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
213                                 Context, Imp, Line, Name, AllImportedModules);
214 }
215
216 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
217   return MDFile::get(VMContext, Filename, Directory);
218 }
219
220 DIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
221   assert(!Name.empty() && "Unable to create enumerator without name");
222   return MDEnumerator::get(VMContext, Val, Name);
223 }
224
225 DIBasicType DIBuilder::createUnspecifiedType(StringRef Name) {
226   assert(!Name.empty() && "Unable to create type without name");
227   return MDBasicType::get(VMContext, dwarf::DW_TAG_unspecified_type, Name);
228 }
229
230 DIBasicType DIBuilder::createNullPtrType() {
231   return createUnspecifiedType("decltype(nullptr)");
232 }
233
234 DIBasicType
235 DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
236                            uint64_t AlignInBits, unsigned Encoding) {
237   assert(!Name.empty() && "Unable to create type without name");
238   return MDBasicType::get(VMContext, dwarf::DW_TAG_base_type, Name, SizeInBits,
239                           AlignInBits, Encoding);
240 }
241
242 DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
243   return MDDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr,
244                             FromTy.getRef(), 0, 0, 0, 0);
245 }
246
247 DIDerivedType
248 DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
249                              uint64_t AlignInBits, StringRef Name) {
250   // FIXME: Why is there a name here?
251   return MDDerivedType::get(VMContext, dwarf::DW_TAG_pointer_type, Name,
252                             nullptr, 0, nullptr, PointeeTy.getRef(), SizeInBits,
253                             AlignInBits, 0, 0);
254 }
255
256 DIDerivedType
257 DIBuilder::createMemberPointerType(DIType PointeeTy, DIType Base,
258                                    uint64_t SizeInBits, uint64_t AlignInBits) {
259   return MDDerivedType::get(VMContext, dwarf::DW_TAG_ptr_to_member_type, "",
260                             nullptr, 0, nullptr, PointeeTy.getRef(), SizeInBits,
261                             AlignInBits, 0, 0, Base.getRef());
262 }
263
264 DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
265   assert(RTy.isType() && "Unable to create reference type");
266   return MDDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr,
267                             RTy.getRef(), 0, 0, 0, 0);
268 }
269
270 DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
271                                        unsigned LineNo, DIDescriptor Context) {
272   return MDDerivedType::get(VMContext, dwarf::DW_TAG_typedef, Name,
273                             File.getFileNode(), LineNo,
274                             DIScope(getNonCompileUnitScope(Context)).getRef(),
275                             Ty.getRef(), 0, 0, 0, 0);
276 }
277
278 DIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
279   // typedefs are encoded in DIDerivedType format.
280   assert(Ty.isType() && "Invalid type!");
281   assert(FriendTy.isType() && "Invalid friend type!");
282   return MDDerivedType::get(VMContext, dwarf::DW_TAG_friend, "", nullptr, 0,
283                             Ty.getRef(), FriendTy.getRef(), 0, 0, 0, 0);
284 }
285
286 DIDerivedType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
287                                            uint64_t BaseOffset,
288                                            unsigned Flags) {
289   assert(Ty.isType() && "Unable to create inheritance");
290   return MDDerivedType::get(VMContext, dwarf::DW_TAG_inheritance, "", nullptr,
291                             0, Ty.getRef(), BaseTy.getRef(), 0, 0, BaseOffset,
292                             Flags);
293 }
294
295 DIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
296                                           DIFile File, unsigned LineNumber,
297                                           uint64_t SizeInBits,
298                                           uint64_t AlignInBits,
299                                           uint64_t OffsetInBits, unsigned Flags,
300                                           DIType Ty) {
301   return MDDerivedType::get(
302       VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
303       DIScope(getNonCompileUnitScope(Scope)).getRef(), Ty.getRef(), SizeInBits,
304       AlignInBits, OffsetInBits, Flags);
305 }
306
307 static Metadata *getConstantOrNull(Constant *C) {
308   if (C)
309     return ConstantAsMetadata::get(C);
310   return nullptr;
311 }
312
313 DIDerivedType DIBuilder::createStaticMemberType(DIDescriptor Scope,
314                                                 StringRef Name, DIFile File,
315                                                 unsigned LineNumber, DIType Ty,
316                                                 unsigned Flags,
317                                                 llvm::Constant *Val) {
318   // TAG_member is encoded in DIDerivedType format.
319   Flags |= DIDescriptor::FlagStaticMember;
320   return MDDerivedType::get(
321       VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
322       DIScope(getNonCompileUnitScope(Scope)).getRef(), Ty.getRef(), 0, 0, 0,
323       Flags, getConstantOrNull(Val));
324 }
325
326 DIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File,
327                                         unsigned LineNumber,
328                                         uint64_t SizeInBits,
329                                         uint64_t AlignInBits,
330                                         uint64_t OffsetInBits, unsigned Flags,
331                                         DIType Ty, MDNode *PropertyNode) {
332   return MDDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
333                             LineNumber, getNonCompileUnitScope(File),
334                             Ty.getRef(), SizeInBits, AlignInBits, OffsetInBits,
335                             Flags, PropertyNode);
336 }
337
338 DIObjCProperty
339 DIBuilder::createObjCProperty(StringRef Name, DIFile File, unsigned LineNumber,
340                               StringRef GetterName, StringRef SetterName,
341                               unsigned PropertyAttributes, DIType Ty) {
342   return MDObjCProperty::get(VMContext, Name, File, LineNumber, GetterName,
343                              SetterName, PropertyAttributes, Ty);
344 }
345
346 DITemplateTypeParameter
347 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
348                                        DIType Ty) {
349   assert(!DIScope(getNonCompileUnitScope(Context)).getRef() &&
350          "Expected compile unit");
351   return MDTemplateTypeParameter::get(VMContext, Name, Ty.getRef());
352 }
353
354 static DITemplateValueParameter
355 createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag,
356                                    DIDescriptor Context, StringRef Name,
357                                    DIType Ty, Metadata *MD) {
358   assert(!DIScope(getNonCompileUnitScope(Context)).getRef() &&
359          "Expected compile unit");
360   return MDTemplateValueParameter::get(VMContext, Tag, Name, Ty.getRef(), MD);
361 }
362
363 DITemplateValueParameter
364 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
365                                         DIType Ty, Constant *Val) {
366   return createTemplateValueParameterHelper(
367       VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
368       getConstantOrNull(Val));
369 }
370
371 DITemplateValueParameter
372 DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
373                                            DIType Ty, StringRef Val) {
374   return createTemplateValueParameterHelper(
375       VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
376       MDString::get(VMContext, Val));
377 }
378
379 DITemplateValueParameter
380 DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
381                                        DIType Ty, DIArray Val) {
382   return createTemplateValueParameterHelper(
383       VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
384       Val);
385 }
386
387 DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
388                                            DIFile File, unsigned LineNumber,
389                                            uint64_t SizeInBits,
390                                            uint64_t AlignInBits,
391                                            uint64_t OffsetInBits,
392                                            unsigned Flags, DIType DerivedFrom,
393                                            DIArray Elements,
394                                            DIType VTableHolder,
395                                            MDNode *TemplateParams,
396                                            StringRef UniqueIdentifier) {
397   assert((!Context || Context.isScope() || Context.isType()) &&
398          "createClassType should be called with a valid Context");
399   // TAG_class_type is encoded in DICompositeType format.
400   DICompositeType R = MDCompositeType::get(
401       VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
402       DIScope(getNonCompileUnitScope(Context)).getRef(), DerivedFrom.getRef(),
403       SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, 0,
404       VTableHolder.getRef(), TemplateParams, UniqueIdentifier);
405   if (!UniqueIdentifier.empty())
406     retainType(R);
407   trackIfUnresolved(R);
408   return R;
409 }
410
411 DICompositeType DIBuilder::createStructType(DIDescriptor Context,
412                                             StringRef Name, DIFile File,
413                                             unsigned LineNumber,
414                                             uint64_t SizeInBits,
415                                             uint64_t AlignInBits,
416                                             unsigned Flags, DIType DerivedFrom,
417                                             DIArray Elements,
418                                             unsigned RunTimeLang,
419                                             DIType VTableHolder,
420                                             StringRef UniqueIdentifier) {
421   DICompositeType R = MDCompositeType::get(
422       VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
423       DIScope(getNonCompileUnitScope(Context)).getRef(), DerivedFrom.getRef(),
424       SizeInBits, AlignInBits, 0, Flags, Elements, RunTimeLang,
425       VTableHolder.getRef(), nullptr, UniqueIdentifier);
426   if (!UniqueIdentifier.empty())
427     retainType(R);
428   trackIfUnresolved(R);
429   return R;
430 }
431
432 DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
433                                            DIFile File, unsigned LineNumber,
434                                            uint64_t SizeInBits,
435                                            uint64_t AlignInBits, unsigned Flags,
436                                            DIArray Elements,
437                                            unsigned RunTimeLang,
438                                            StringRef UniqueIdentifier) {
439   DICompositeType R = MDCompositeType::get(
440       VMContext, dwarf::DW_TAG_union_type, Name, File, LineNumber,
441       DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr, SizeInBits,
442       AlignInBits, 0, Flags, Elements, RunTimeLang, nullptr, nullptr,
443       UniqueIdentifier);
444   if (!UniqueIdentifier.empty())
445     retainType(R);
446   trackIfUnresolved(R);
447   return R;
448 }
449
450 DISubroutineType DIBuilder::createSubroutineType(DIFile File,
451                                                  DITypeArray ParameterTypes,
452                                                  unsigned Flags) {
453   return MDSubroutineType::get(VMContext, Flags, ParameterTypes);
454 }
455
456 DICompositeType DIBuilder::createEnumerationType(
457     DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
458     uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
459     DIType UnderlyingType, StringRef UniqueIdentifier) {
460   DICompositeType CTy = MDCompositeType::get(
461       VMContext, dwarf::DW_TAG_enumeration_type, Name, File, LineNumber,
462       DIScope(getNonCompileUnitScope(Scope)).getRef(), UnderlyingType.getRef(),
463       SizeInBits, AlignInBits, 0, 0, Elements, 0, nullptr, nullptr,
464       UniqueIdentifier);
465   AllEnumTypes.push_back(CTy);
466   if (!UniqueIdentifier.empty())
467     retainType(CTy);
468   trackIfUnresolved(CTy);
469   return CTy;
470 }
471
472 DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
473                                            DIType Ty, DIArray Subscripts) {
474   auto *R = MDCompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
475                                  nullptr, 0, nullptr, Ty.getRef(), Size,
476                                  AlignInBits, 0, 0, Subscripts, 0, nullptr);
477   trackIfUnresolved(R);
478   return R;
479 }
480
481 DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
482                                             DIType Ty, DIArray Subscripts) {
483   auto *R = MDCompositeType::get(
484       VMContext, dwarf::DW_TAG_array_type, "", nullptr, 0, nullptr, Ty.getRef(),
485       Size, AlignInBits, 0, DIType::FlagVector, Subscripts, 0, nullptr);
486   trackIfUnresolved(R);
487   return R;
488 }
489
490 static DIType createTypeWithFlags(LLVMContext &Context, DIType Ty,
491                                   unsigned FlagsToSet) {
492   TempMDType NewTy = cast<MDType>(static_cast<MDNode *>(Ty))->clone();
493   NewTy->setFlags(NewTy->getFlags() | FlagsToSet);
494   return MDNode::replaceWithUniqued(std::move(NewTy));
495 }
496
497 DIType DIBuilder::createArtificialType(DIType Ty) {
498   // FIXME: Restrict this to the nodes where it's valid.
499   if (Ty.isArtificial())
500     return Ty;
501   return createTypeWithFlags(VMContext, Ty, DIType::FlagArtificial);
502 }
503
504 DIType DIBuilder::createObjectPointerType(DIType Ty) {
505   // FIXME: Restrict this to the nodes where it's valid.
506   if (Ty.isObjectPointer())
507     return Ty;
508   unsigned Flags = DIType::FlagObjectPointer | DIType::FlagArtificial;
509   return createTypeWithFlags(VMContext, Ty, Flags);
510 }
511
512 void DIBuilder::retainType(DIType T) { AllRetainTypes.emplace_back(T); }
513
514 DIBasicType DIBuilder::createUnspecifiedParameter() {
515   return DIBasicType();
516 }
517
518 DICompositeType
519 DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope,
520                              DIFile F, unsigned Line, unsigned RuntimeLang,
521                              uint64_t SizeInBits, uint64_t AlignInBits,
522                              StringRef UniqueIdentifier) {
523   // FIXME: Define in terms of createReplaceableForwardDecl() by calling
524   // replaceWithUniqued().
525   DICompositeType RetTy = MDCompositeType::get(
526       VMContext, Tag, Name, F.getFileNode(), Line,
527       DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr, SizeInBits,
528       AlignInBits, 0, DIDescriptor::FlagFwdDecl, nullptr, RuntimeLang, nullptr,
529       nullptr, UniqueIdentifier);
530   if (!UniqueIdentifier.empty())
531     retainType(RetTy);
532   trackIfUnresolved(RetTy);
533   return RetTy;
534 }
535
536 DICompositeType DIBuilder::createReplaceableCompositeType(
537     unsigned Tag, StringRef Name, DIDescriptor Scope, DIFile F, unsigned Line,
538     unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
539     unsigned Flags, StringRef UniqueIdentifier) {
540   DICompositeType RetTy =
541       MDCompositeType::getTemporary(
542           VMContext, Tag, Name, F.getFileNode(), Line,
543           DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr, SizeInBits,
544           AlignInBits, 0, Flags, nullptr, RuntimeLang,
545           nullptr, nullptr, UniqueIdentifier).release();
546   if (!UniqueIdentifier.empty())
547     retainType(RetTy);
548   trackIfUnresolved(RetTy);
549   return RetTy;
550 }
551
552 DIArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
553   return DIArray(MDNode::get(VMContext, Elements));
554 }
555
556 DITypeArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
557   SmallVector<llvm::Metadata *, 16> Elts;
558   for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
559     if (Elements[i] && isa<MDNode>(Elements[i]))
560       Elts.push_back(DIType(cast<MDNode>(Elements[i])).getRef());
561     else
562       Elts.push_back(Elements[i]);
563   }
564   return DITypeArray(MDNode::get(VMContext, Elts));
565 }
566
567 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
568   return MDSubrange::get(VMContext, Count, Lo);
569 }
570
571 static void checkGlobalVariableScope(DIDescriptor Context) {
572   MDNode *TheCtx = getNonCompileUnitScope(Context);
573   if (DIScope(TheCtx).isCompositeType()) {
574     assert(!DICompositeType(TheCtx).getIdentifier() &&
575            "Context of a global variable should not be a type with identifier");
576   }
577 }
578
579 DIGlobalVariable DIBuilder::createGlobalVariable(
580     DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
581     unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
582     MDNode *Decl) {
583   checkGlobalVariableScope(Context);
584
585   auto *N = MDGlobalVariable::get(VMContext, Context, Name, LinkageName, F,
586                                   LineNumber, Ty, isLocalToUnit, true,
587                                   getConstantOrNull(Val), Decl);
588   AllGVs.push_back(N);
589   return N;
590 }
591
592 DIGlobalVariable DIBuilder::createTempGlobalVariableFwdDecl(
593     DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
594     unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
595     MDNode *Decl) {
596   checkGlobalVariableScope(Context);
597
598   return MDGlobalVariable::getTemporary(VMContext, Context, Name, LinkageName,
599                                         F, LineNumber, Ty, isLocalToUnit, false,
600                                         getConstantOrNull(Val), Decl).release();
601 }
602
603 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
604                                           StringRef Name, DIFile File,
605                                           unsigned LineNo, DITypeRef Ty,
606                                           bool AlwaysPreserve, unsigned Flags,
607                                           unsigned ArgNo) {
608   // FIXME: Why getNonCompileUnitScope()?
609   // FIXME: Why is "!Context" okay here?
610   // FIXME: WHy doesn't this check for a subprogram or lexical block (AFAICT
611   // the only valid scopes)?
612   DIDescriptor Context(getNonCompileUnitScope(Scope));
613   assert((!Context || Context.isScope()) &&
614          "createLocalVariable should be called with a valid Context");
615
616   auto *Node =
617       MDLocalVariable::get(VMContext, Tag, getNonCompileUnitScope(Scope), Name,
618                            File, LineNo, Ty, ArgNo, Flags);
619   if (AlwaysPreserve) {
620     // The optimizer may remove local variable. If there is an interest
621     // to preserve variable info in such situation then stash it in a
622     // named mdnode.
623     DISubprogram Fn(getDISubprogram(Scope));
624     assert(Fn && "Missing subprogram for local variable");
625     PreservedVariables[Fn].emplace_back(Node);
626   }
627   return Node;
628 }
629
630 DIExpression DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
631   return MDExpression::get(VMContext, Addr);
632 }
633
634 DIExpression DIBuilder::createExpression(ArrayRef<int64_t> Signed) {
635   // TODO: Remove the callers of this signed version and delete.
636   SmallVector<uint64_t, 8> Addr(Signed.begin(), Signed.end());
637   return createExpression(Addr);
638 }
639
640 DIExpression DIBuilder::createBitPieceExpression(unsigned OffsetInBytes,
641                                                  unsigned SizeInBytes) {
642   uint64_t Addr[] = {dwarf::DW_OP_bit_piece, OffsetInBytes, SizeInBytes};
643   return MDExpression::get(VMContext, Addr);
644 }
645
646 DISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
647                                        StringRef LinkageName, DIFile File,
648                                        unsigned LineNo, DICompositeType Ty,
649                                        bool isLocalToUnit, bool isDefinition,
650                                        unsigned ScopeLine, unsigned Flags,
651                                        bool isOptimized, Function *Fn,
652                                        MDNode *TParams, MDNode *Decl) {
653   // dragonegg does not generate identifier for types, so using an empty map
654   // to resolve the context should be fine.
655   DITypeIdentifierMap EmptyMap;
656   return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File,
657                         LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
658                         Flags, isOptimized, Fn, TParams, Decl);
659 }
660
661 DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
662                                        StringRef LinkageName, DIFile File,
663                                        unsigned LineNo, DICompositeType Ty,
664                                        bool isLocalToUnit, bool isDefinition,
665                                        unsigned ScopeLine, unsigned Flags,
666                                        bool isOptimized, Function *Fn,
667                                        MDNode *TParams, MDNode *Decl) {
668   assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
669          "function types should be subroutines");
670   auto *Node = MDSubprogram::get(
671       VMContext, DIScope(getNonCompileUnitScope(Context)).getRef(), Name,
672       LinkageName, File.getFileNode(), LineNo, Ty, isLocalToUnit, isDefinition,
673       ScopeLine, nullptr, 0, 0, Flags, isOptimized, getConstantOrNull(Fn),
674       TParams, Decl, MDNode::getTemporary(VMContext, None).release());
675
676   if (isDefinition)
677     AllSubprograms.push_back(Node);
678   trackIfUnresolved(Node);
679   return Node;
680 }
681
682 DISubprogram
683 DIBuilder::createTempFunctionFwdDecl(DIDescriptor Context, StringRef Name,
684                                      StringRef LinkageName, DIFile File,
685                                      unsigned LineNo, DICompositeType Ty,
686                                      bool isLocalToUnit, bool isDefinition,
687                                      unsigned ScopeLine, unsigned Flags,
688                                      bool isOptimized, Function *Fn,
689                                      MDNode *TParams, MDNode *Decl) {
690   return MDSubprogram::getTemporary(
691              VMContext, DIScope(getNonCompileUnitScope(Context)).getRef(), Name,
692              LinkageName, File.getFileNode(), LineNo, Ty, isLocalToUnit,
693              isDefinition, ScopeLine, nullptr, 0, 0, Flags, isOptimized,
694              getConstantOrNull(Fn), TParams, Decl, nullptr).release();
695 }
696
697 DISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
698                                      StringRef LinkageName, DIFile F,
699                                      unsigned LineNo, DICompositeType Ty,
700                                      bool isLocalToUnit, bool isDefinition,
701                                      unsigned VK, unsigned VIndex,
702                                      DIType VTableHolder, unsigned Flags,
703                                      bool isOptimized, Function *Fn,
704                                      MDNode *TParam) {
705   assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
706          "function types should be subroutines");
707   assert(getNonCompileUnitScope(Context) &&
708          "Methods should have both a Context and a context that isn't "
709          "the compile unit.");
710   // FIXME: Do we want to use different scope/lines?
711   auto *Node = MDSubprogram::get(
712       VMContext, DIScope(Context).getRef(), Name, LinkageName, F.getFileNode(),
713       LineNo, Ty, isLocalToUnit, isDefinition, LineNo, VTableHolder.getRef(),
714       VK, VIndex, Flags, isOptimized, getConstantOrNull(Fn), TParam, nullptr,
715       nullptr);
716
717   if (isDefinition)
718     AllSubprograms.push_back(Node);
719   DISubprogram S(Node);
720   assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
721   trackIfUnresolved(S);
722   return S;
723 }
724
725 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
726                                        DIFile File, unsigned LineNo) {
727   DINameSpace R = MDNamespace::get(VMContext, getNonCompileUnitScope(Scope),
728                                    File.getFileNode(), Name, LineNo);
729   assert(R.Verify() &&
730          "createNameSpace should return a verifiable DINameSpace");
731   return R;
732 }
733
734 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
735                                                      DIFile File,
736                                                      unsigned Discriminator) {
737   DILexicalBlockFile R = MDLexicalBlockFile::get(
738       VMContext, Scope, File.getFileNode(), Discriminator);
739   assert(
740       R.Verify() &&
741       "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
742   return R;
743 }
744
745 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
746                                              unsigned Line, unsigned Col) {
747   // Make these distinct, to avoid merging two lexical blocks on the same
748   // file/line/column.
749   DILexicalBlock R = MDLexicalBlock::getDistinct(
750       VMContext, getNonCompileUnitScope(Scope), File.getFileNode(), Line, Col);
751   assert(R.Verify() &&
752          "createLexicalBlock should return a verifiable DILexicalBlock");
753   return R;
754 }
755
756 static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
757   assert(V && "no value passed to dbg intrinsic");
758   return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
759 }
760
761 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
762                                       DIExpression Expr,
763                                       Instruction *InsertBefore) {
764   assert(VarInfo.isVariable() &&
765          "empty or invalid DIVariable passed to dbg.declare");
766   if (!DeclareFn)
767     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
768
769   trackIfUnresolved(VarInfo);
770   trackIfUnresolved(Expr);
771   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
772                    MetadataAsValue::get(VMContext, VarInfo),
773                    MetadataAsValue::get(VMContext, Expr)};
774   return CallInst::Create(DeclareFn, Args, "", InsertBefore);
775 }
776
777 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
778                                       DIExpression Expr,
779                                       BasicBlock *InsertAtEnd) {
780   assert(VarInfo.isVariable() &&
781          "empty or invalid DIVariable passed to dbg.declare");
782   if (!DeclareFn)
783     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
784
785   trackIfUnresolved(VarInfo);
786   trackIfUnresolved(Expr);
787   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
788                    MetadataAsValue::get(VMContext, VarInfo),
789                    MetadataAsValue::get(VMContext, Expr)};
790
791   // If this block already has a terminator then insert this intrinsic
792   // before the terminator.
793   if (TerminatorInst *T = InsertAtEnd->getTerminator())
794     return CallInst::Create(DeclareFn, Args, "", T);
795   else
796     return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
797 }
798
799 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
800                                                 DIVariable VarInfo,
801                                                 DIExpression Expr,
802                                                 Instruction *InsertBefore) {
803   assert(V && "no value passed to dbg.value");
804   assert(VarInfo.isVariable() &&
805          "empty or invalid DIVariable passed to dbg.value");
806   if (!ValueFn)
807     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
808
809   trackIfUnresolved(VarInfo);
810   trackIfUnresolved(Expr);
811   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
812                    ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
813                    MetadataAsValue::get(VMContext, VarInfo),
814                    MetadataAsValue::get(VMContext, Expr)};
815   return CallInst::Create(ValueFn, Args, "", InsertBefore);
816 }
817
818 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
819                                                 DIVariable VarInfo,
820                                                 DIExpression Expr,
821                                                 BasicBlock *InsertAtEnd) {
822   assert(V && "no value passed to dbg.value");
823   assert(VarInfo.isVariable() &&
824          "empty or invalid DIVariable passed to dbg.value");
825   if (!ValueFn)
826     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
827
828   trackIfUnresolved(VarInfo);
829   trackIfUnresolved(Expr);
830   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
831                    ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
832                    MetadataAsValue::get(VMContext, VarInfo),
833                    MetadataAsValue::get(VMContext, Expr)};
834   return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
835 }
836
837 void DIBuilder::replaceVTableHolder(DICompositeType &T, DICompositeType VTableHolder) {
838   T.setContainingType(VTableHolder);
839
840   // If this didn't create a self-reference, just return.
841   if (T != VTableHolder)
842     return;
843
844   // Look for unresolved operands.  T will drop RAUW support, orphaning any
845   // cycles underneath it.
846   if (T->isResolved())
847     for (const MDOperand &O : T->operands())
848       if (auto *N = dyn_cast_or_null<MDNode>(O))
849         trackIfUnresolved(N);
850 }
851
852 void DIBuilder::replaceArrays(DICompositeType &T, DIArray Elements,
853                               DIArray TParams) {
854   T.setArrays(Elements, TParams);
855
856   // If T isn't resolved, there's no problem.
857   if (!T->isResolved())
858     return;
859
860   // If "T" is resolved, it may be due to a self-reference cycle.  Track the
861   // arrays explicitly if they're unresolved, or else the cycles will be
862   // orphaned.
863   if (Elements)
864     trackIfUnresolved(Elements);
865   if (TParams)
866     trackIfUnresolved(TParams);
867 }