DIBuilder.cpp revision 4c5e43da7792f75567b693105cc53e3f1992ad98
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
23using namespace llvm;
24using namespace llvm::dwarf;
25
26namespace {
27class 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
35public:
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
60DIBuilder::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
66void 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
76void 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.
124static MDScope *getNonCompileUnitScope(MDNode *N) {
125  if (!N || isa<MDCompileUnit>(N))
126    return nullptr;
127  return cast<MDScope>(N);
128}
129
130DICompileUnit 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
173static DIImportedEntity
174createImportedModule(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
183DIImportedEntity 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
190DIImportedEntity 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
197DIImportedEntity 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
209DIImportedEntity 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
216DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
217  return MDFile::get(VMContext, Filename, Directory);
218}
219
220DIEnumerator 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
225DIBasicType 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
230DIBasicType DIBuilder::createNullPtrType() {
231  return createUnspecifiedType("decltype(nullptr)");
232}
233
234DIBasicType
235DIBuilder::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
242DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
243  return MDDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr,
244                            FromTy.getRef(), 0, 0, 0, 0);
245}
246
247DIDerivedType
248DIBuilder::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
256DIDerivedType
257DIBuilder::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
264DIDerivedType 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
270DIDerivedType 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
278DIDerivedType 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
286DIDerivedType 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
295DIDerivedType 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
307static ConstantAsMetadata *getConstantOrNull(Constant *C) {
308  if (C)
309    return ConstantAsMetadata::get(C);
310  return nullptr;
311}
312
313DIDerivedType 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
326DIDerivedType 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
338DIObjCProperty
339DIBuilder::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
346DITemplateTypeParameter
347DIBuilder::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
354static DITemplateValueParameter
355createTemplateValueParameterHelper(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
363DITemplateValueParameter
364DIBuilder::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
371DITemplateValueParameter
372DIBuilder::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
379DITemplateValueParameter
380DIBuilder::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
387DICompositeType 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
411DICompositeType 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
432DICompositeType 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
450DISubroutineType DIBuilder::createSubroutineType(DIFile File,
451                                                 DITypeArray ParameterTypes,
452                                                 unsigned Flags) {
453  return MDSubroutineType::get(VMContext, Flags, ParameterTypes);
454}
455
456DICompositeType 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
472DICompositeType 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
481DICompositeType 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
490static 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
497DIType 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
504DIType 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
512void DIBuilder::retainType(DIType T) { AllRetainTypes.emplace_back(T); }
513
514DIBasicType DIBuilder::createUnspecifiedParameter() {
515  return DIBasicType();
516}
517
518DICompositeType
519DIBuilder::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
536DICompositeType 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
552DIArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
553  return DIArray(MDNode::get(VMContext, Elements));
554}
555
556DITypeArray 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
567DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
568  return MDSubrange::get(VMContext, Count, Lo);
569}
570
571static 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
579DIGlobalVariable 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
592DIGlobalVariable 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
603DIVariable 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
630DIExpression DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
631  return MDExpression::get(VMContext, Addr);
632}
633
634DIExpression 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
640DIExpression 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
646DISubprogram 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
661DISubprogram 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
682DISubprogram
683DIBuilder::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
697DISubprogram 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
725DINameSpace 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
734DILexicalBlockFile 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
745DILexicalBlock 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
756static 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
761Instruction *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
777Instruction *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
799Instruction *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
818Instruction *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
837void 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
852void 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}
868