1 //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the DIBuilder.
12 //===----------------------------------------------------------------------===//
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"
24 using namespace llvm::dwarf;
28 /// \brief Whether there are any fields yet.
30 /// Note that this is not equivalent to \c Chars.empty(), since \a concat()
31 /// may have been called already with an empty string.
33 SmallVector<char, 256> Chars;
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)) {}
41 template <class Twineable> HeaderBuilder &concat(Twineable &&X) {
46 Twine(X).toVector(Chars);
50 MDString *get(LLVMContext &Context) const {
51 return MDString::get(Context, StringRef(Chars.begin(), Chars.size()));
54 static HeaderBuilder get(unsigned Tag) {
55 return HeaderBuilder().concat("0x" + Twine::utohexstr(Tag));
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) {}
66 void DIBuilder::trackIfUnresolved(MDNode *N) {
72 assert(AllowUnresolvedNodes && "Cannot handle unresolved nodes");
73 UnresolvedNodes.emplace_back(N);
76 void DIBuilder::finalize() {
77 DIArray Enums = getOrCreateArray(AllEnumTypes);
78 TempEnumTypes->replaceAllUsesWith(Enums);
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 TempRetainTypes->replaceAllUsesWith(RetainTypes);
92 DIArray SPs = getOrCreateArray(AllSubprograms);
93 TempSubprograms->replaceAllUsesWith(SPs);
94 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
95 DISubprogram SP = cast<MDSubprogram>(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 Temp->replaceAllUsesWith(AV);
104 DIArray GVs = getOrCreateArray(AllGVs);
105 TempGVs->replaceAllUsesWith(GVs);
107 SmallVector<Metadata *, 16> RetainValuesI(AllImportedModules.begin(),
108 AllImportedModules.end());
109 DIArray IMs = getOrCreateArray(RetainValuesI);
110 TempImportedModules->replaceAllUsesWith(IMs);
112 // Now that all temp nodes have been replaced or deleted, resolve remaining
114 for (const auto &N : UnresolvedNodes)
115 if (N && !N->isResolved())
117 UnresolvedNodes.clear();
119 // Can't handle unresolved nodes anymore.
120 AllowUnresolvedNodes = false;
123 /// If N is compile unit return NULL otherwise return N.
124 static MDScope *getNonCompileUnitScope(MDNode *N) {
125 if (!N || isa<MDCompileUnit>(N))
127 return cast<MDScope>(N);
130 DICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
132 StringRef Producer, bool isOptimized,
133 StringRef Flags, unsigned RunTimeVer,
135 DebugEmissionKind Kind,
136 bool EmitDebugInfo) {
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");
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();
152 // TODO: Switch to getDistinct(). We never want to merge compile units based
154 MDCompileUnit *CUNode = MDCompileUnit::get(
155 VMContext, Lang, MDFile::get(VMContext, Filename, Directory), Producer,
156 isOptimized, Flags, RunTimeVer, SplitName, Kind, TempEnumTypes,
157 TempRetainTypes, TempSubprograms, TempGVs, TempImportedModules);
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.
165 NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
166 NMD->addOperand(CUNode);
169 trackIfUnresolved(CUNode);
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 AllImportedModules.emplace_back(M.get());
182 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
185 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
186 Context, NS, Line, StringRef(), AllImportedModules);
189 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
192 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
193 Context, NS, Line, StringRef(), AllImportedModules);
196 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
200 // Make sure to use the unique identifier based metadata reference for
201 // types that have one.
202 return ::createImportedModule(
203 VMContext, dwarf::DW_TAG_imported_declaration, Context,
204 DebugNodeRef::get(cast_or_null<DebugNode>(Decl.get())), Line, Name,
208 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
209 DIImportedEntity Imp,
210 unsigned Line, StringRef Name) {
211 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
212 Context, Imp, Line, Name, AllImportedModules);
215 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
216 return MDFile::get(VMContext, Filename, Directory);
219 DIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
220 assert(!Name.empty() && "Unable to create enumerator without name");
221 return MDEnumerator::get(VMContext, Val, Name);
224 DIBasicType DIBuilder::createUnspecifiedType(StringRef Name) {
225 assert(!Name.empty() && "Unable to create type without name");
226 return MDBasicType::get(VMContext, dwarf::DW_TAG_unspecified_type, Name);
229 DIBasicType DIBuilder::createNullPtrType() {
230 return createUnspecifiedType("decltype(nullptr)");
234 DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
235 uint64_t AlignInBits, unsigned Encoding) {
236 assert(!Name.empty() && "Unable to create type without name");
237 return MDBasicType::get(VMContext, dwarf::DW_TAG_base_type, Name, SizeInBits,
238 AlignInBits, Encoding);
241 DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
242 return MDDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr,
243 MDTypeRef::get(FromTy), 0, 0, 0, 0);
247 DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
248 uint64_t AlignInBits, StringRef Name) {
249 // FIXME: Why is there a name here?
250 return MDDerivedType::get(VMContext, dwarf::DW_TAG_pointer_type, Name,
251 nullptr, 0, nullptr, MDTypeRef::get(PointeeTy),
252 SizeInBits, AlignInBits, 0, 0);
256 DIBuilder::createMemberPointerType(DIType PointeeTy, DIType Base,
257 uint64_t SizeInBits, uint64_t AlignInBits) {
258 return MDDerivedType::get(VMContext, dwarf::DW_TAG_ptr_to_member_type, "",
259 nullptr, 0, nullptr, MDTypeRef::get(PointeeTy),
260 SizeInBits, AlignInBits, 0, 0, MDTypeRef::get(Base));
263 DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
264 assert(RTy && "Unable to create reference type");
265 return MDDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr,
266 MDTypeRef::get(RTy), 0, 0, 0, 0);
269 DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
270 unsigned LineNo, DIDescriptor Context) {
271 return MDDerivedType::get(
272 VMContext, dwarf::DW_TAG_typedef, Name, File, LineNo,
273 MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))),
274 MDTypeRef::get(Ty), 0, 0, 0, 0);
277 DIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
278 // typedefs are encoded in DIDerivedType format.
279 assert(Ty && "Invalid type!");
280 assert(FriendTy && "Invalid friend type!");
281 return MDDerivedType::get(VMContext, dwarf::DW_TAG_friend, "", nullptr, 0,
282 MDTypeRef::get(Ty), MDTypeRef::get(FriendTy), 0, 0,
286 DIDerivedType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
289 assert(Ty && "Unable to create inheritance");
290 return MDDerivedType::get(VMContext, dwarf::DW_TAG_inheritance, "", nullptr,
291 0, MDTypeRef::get(Ty), MDTypeRef::get(BaseTy), 0, 0,
295 DIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
296 DIFile File, unsigned LineNumber,
298 uint64_t AlignInBits,
299 uint64_t OffsetInBits, unsigned Flags,
301 return MDDerivedType::get(
302 VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
303 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))),
304 MDTypeRef::get(Ty), SizeInBits, AlignInBits, OffsetInBits, Flags);
307 static ConstantAsMetadata *getConstantOrNull(Constant *C) {
309 return ConstantAsMetadata::get(C);
313 DIDerivedType DIBuilder::createStaticMemberType(DIDescriptor Scope,
314 StringRef Name, DIFile File,
315 unsigned LineNumber, DIType Ty,
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 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))),
323 MDTypeRef::get(Ty), 0, 0, 0, Flags, getConstantOrNull(Val));
326 DIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File,
329 uint64_t AlignInBits,
330 uint64_t OffsetInBits, unsigned Flags,
331 DIType Ty, MDNode *PropertyNode) {
332 return MDDerivedType::get(
333 VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
334 MDScopeRef::get(getNonCompileUnitScope(File)), MDTypeRef::get(Ty),
335 SizeInBits, AlignInBits, OffsetInBits, Flags, PropertyNode);
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);
346 DITemplateTypeParameter
347 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
349 assert((!Context || isa<MDCompileUnit>(Context.get())) &&
350 "Expected compile unit");
351 return MDTemplateTypeParameter::get(VMContext, Name, MDTypeRef::get(Ty));
354 static DITemplateValueParameter
355 createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag,
356 DIDescriptor Context, StringRef Name,
357 DIType Ty, Metadata *MD) {
358 assert((!Context || isa<MDCompileUnit>(Context.get())) &&
359 "Expected compile unit");
360 return MDTemplateValueParameter::get(VMContext, Tag, Name, MDTypeRef::get(Ty),
364 DITemplateValueParameter
365 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
366 DIType Ty, Constant *Val) {
367 return createTemplateValueParameterHelper(
368 VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
369 getConstantOrNull(Val));
372 DITemplateValueParameter
373 DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
374 DIType Ty, StringRef Val) {
375 return createTemplateValueParameterHelper(
376 VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
377 MDString::get(VMContext, Val));
380 DITemplateValueParameter
381 DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
382 DIType Ty, DIArray Val) {
383 return createTemplateValueParameterHelper(
384 VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
388 DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
389 DIFile File, unsigned LineNumber,
391 uint64_t AlignInBits,
392 uint64_t OffsetInBits,
393 unsigned Flags, DIType DerivedFrom,
396 MDNode *TemplateParams,
397 StringRef UniqueIdentifier) {
398 assert((!Context || isa<MDScope>(Context)) &&
399 "createClassType should be called with a valid Context");
400 // TAG_class_type is encoded in DICompositeType format.
401 DICompositeType R = MDCompositeType::get(
402 VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
403 MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))),
404 MDTypeRef::get(DerivedFrom), SizeInBits, AlignInBits, OffsetInBits, Flags,
405 Elements, 0, MDTypeRef::get(VTableHolder),
406 cast_or_null<MDTuple>(TemplateParams), UniqueIdentifier);
407 if (!UniqueIdentifier.empty())
409 trackIfUnresolved(R);
413 DICompositeType DIBuilder::createStructType(DIDescriptor Context,
414 StringRef Name, DIFile File,
417 uint64_t AlignInBits,
418 unsigned Flags, DIType DerivedFrom,
420 unsigned RunTimeLang,
422 StringRef UniqueIdentifier) {
423 DICompositeType R = MDCompositeType::get(
424 VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
425 MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))),
426 MDTypeRef::get(DerivedFrom), SizeInBits, AlignInBits, 0, Flags, Elements,
427 RunTimeLang, MDTypeRef::get(VTableHolder), nullptr, UniqueIdentifier);
428 if (!UniqueIdentifier.empty())
430 trackIfUnresolved(R);
434 DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
435 DIFile File, unsigned LineNumber,
437 uint64_t AlignInBits, unsigned Flags,
439 unsigned RunTimeLang,
440 StringRef UniqueIdentifier) {
441 DICompositeType R = MDCompositeType::get(
442 VMContext, dwarf::DW_TAG_union_type, Name, File, LineNumber,
443 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))), nullptr,
444 SizeInBits, AlignInBits, 0, Flags, Elements, RunTimeLang, nullptr,
445 nullptr, UniqueIdentifier);
446 if (!UniqueIdentifier.empty())
448 trackIfUnresolved(R);
452 DISubroutineType DIBuilder::createSubroutineType(DIFile File,
453 DITypeArray ParameterTypes,
455 return MDSubroutineType::get(VMContext, Flags, ParameterTypes);
458 DICompositeType DIBuilder::createEnumerationType(
459 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
460 uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
461 DIType UnderlyingType, StringRef UniqueIdentifier) {
462 DICompositeType CTy = MDCompositeType::get(
463 VMContext, dwarf::DW_TAG_enumeration_type, Name, File, LineNumber,
464 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))),
465 MDTypeRef::get(UnderlyingType), SizeInBits, AlignInBits, 0, 0, Elements,
466 0, nullptr, nullptr, UniqueIdentifier);
467 AllEnumTypes.push_back(CTy);
468 if (!UniqueIdentifier.empty())
470 trackIfUnresolved(CTy);
474 DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
475 DIType Ty, DIArray Subscripts) {
476 auto *R = MDCompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
477 nullptr, 0, nullptr, MDTypeRef::get(Ty), Size,
478 AlignInBits, 0, 0, Subscripts, 0, nullptr);
479 trackIfUnresolved(R);
483 DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
484 DIType Ty, DIArray Subscripts) {
486 MDCompositeType::get(VMContext, dwarf::DW_TAG_array_type, "", nullptr, 0,
487 nullptr, MDTypeRef::get(Ty), Size, AlignInBits, 0,
488 DIType::FlagVector, Subscripts, 0, nullptr);
489 trackIfUnresolved(R);
493 static DIType createTypeWithFlags(LLVMContext &Context, DIType Ty,
494 unsigned FlagsToSet) {
495 TempMDType NewTy = cast<MDType>(static_cast<MDNode *>(Ty))->clone();
496 NewTy->setFlags(NewTy->getFlags() | FlagsToSet);
497 return MDNode::replaceWithUniqued(std::move(NewTy));
500 DIType DIBuilder::createArtificialType(DIType Ty) {
501 // FIXME: Restrict this to the nodes where it's valid.
502 if (Ty.isArtificial())
504 return createTypeWithFlags(VMContext, Ty, DIType::FlagArtificial);
507 DIType DIBuilder::createObjectPointerType(DIType Ty) {
508 // FIXME: Restrict this to the nodes where it's valid.
509 if (Ty.isObjectPointer())
511 unsigned Flags = DIType::FlagObjectPointer | DIType::FlagArtificial;
512 return createTypeWithFlags(VMContext, Ty, Flags);
515 void DIBuilder::retainType(DIType T) {
516 assert(T.get() && "Expected non-null type");
517 AllRetainTypes.emplace_back(T);
520 DIBasicType DIBuilder::createUnspecifiedParameter() {
521 return DIBasicType();
525 DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope,
526 DIFile F, unsigned Line, unsigned RuntimeLang,
527 uint64_t SizeInBits, uint64_t AlignInBits,
528 StringRef UniqueIdentifier) {
529 // FIXME: Define in terms of createReplaceableForwardDecl() by calling
530 // replaceWithUniqued().
531 DICompositeType RetTy = MDCompositeType::get(
532 VMContext, Tag, Name, F, Line,
533 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))), nullptr,
534 SizeInBits, AlignInBits, 0, DIDescriptor::FlagFwdDecl, nullptr,
535 RuntimeLang, nullptr, nullptr, UniqueIdentifier);
536 if (!UniqueIdentifier.empty())
538 trackIfUnresolved(RetTy);
542 DICompositeType DIBuilder::createReplaceableCompositeType(
543 unsigned Tag, StringRef Name, DIDescriptor Scope, DIFile F, unsigned Line,
544 unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
545 unsigned Flags, StringRef UniqueIdentifier) {
546 DICompositeType RetTy =
547 MDCompositeType::getTemporary(
548 VMContext, Tag, Name, F, Line,
549 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))), nullptr,
550 SizeInBits, AlignInBits, 0, Flags, nullptr, RuntimeLang, nullptr,
551 nullptr, UniqueIdentifier)
553 if (!UniqueIdentifier.empty())
555 trackIfUnresolved(RetTy);
559 DIArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
560 return DIArray(MDNode::get(VMContext, Elements));
563 DITypeArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
564 SmallVector<llvm::Metadata *, 16> Elts;
565 for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
566 if (Elements[i] && isa<MDNode>(Elements[i]))
567 Elts.push_back(MDTypeRef::get(cast<MDType>(Elements[i])));
569 Elts.push_back(Elements[i]);
571 return DITypeArray(MDNode::get(VMContext, Elts));
574 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
575 return MDSubrange::get(VMContext, Count, Lo);
578 static void checkGlobalVariableScope(DIDescriptor Context) {
580 if (DICompositeType CT =
581 dyn_cast_or_null<MDCompositeType>(getNonCompileUnitScope(Context)))
582 assert(!CT.getIdentifier() &&
583 "Context of a global variable should not be a type with identifier");
587 DIGlobalVariable DIBuilder::createGlobalVariable(
588 DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
589 unsigned LineNumber, DIType Ty, bool isLocalToUnit, Constant *Val,
591 checkGlobalVariableScope(Context);
593 auto *N = MDGlobalVariable::get(
594 VMContext, cast_or_null<MDScope>(Context.get()), Name, LinkageName, F,
595 LineNumber, MDTypeRef::get(Ty), isLocalToUnit, true,
596 getConstantOrNull(Val), cast_or_null<MDDerivedType>(Decl));
601 DIGlobalVariable DIBuilder::createTempGlobalVariableFwdDecl(
602 DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
603 unsigned LineNumber, DIType Ty, bool isLocalToUnit, Constant *Val,
605 checkGlobalVariableScope(Context);
607 return MDGlobalVariable::getTemporary(
608 VMContext, cast_or_null<MDScope>(Context.get()), Name, LinkageName,
609 F, LineNumber, MDTypeRef::get(Ty), isLocalToUnit, false, getConstantOrNull(Val),
610 cast_or_null<MDDerivedType>(Decl)).release();
613 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
614 StringRef Name, DIFile File,
615 unsigned LineNo, DIType Ty,
616 bool AlwaysPreserve, unsigned Flags,
618 // FIXME: Why getNonCompileUnitScope()?
619 // FIXME: Why is "!Context" okay here?
620 // FIXME: WHy doesn't this check for a subprogram or lexical block (AFAICT
621 // the only valid scopes)?
622 DIScope Context = getNonCompileUnitScope(Scope);
624 auto *Node = MDLocalVariable::get(
625 VMContext, Tag, cast_or_null<MDLocalScope>(Context.get()), Name, File,
626 LineNo, MDTypeRef::get(Ty), ArgNo, Flags);
627 if (AlwaysPreserve) {
628 // The optimizer may remove local variable. If there is an interest
629 // to preserve variable info in such situation then stash it in a
631 DISubprogram Fn(getDISubprogram(Scope));
632 assert(Fn && "Missing subprogram for local variable");
633 PreservedVariables[Fn].emplace_back(Node);
638 DIExpression DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
639 return MDExpression::get(VMContext, Addr);
642 DIExpression DIBuilder::createExpression(ArrayRef<int64_t> Signed) {
643 // TODO: Remove the callers of this signed version and delete.
644 SmallVector<uint64_t, 8> Addr(Signed.begin(), Signed.end());
645 return createExpression(Addr);
648 DIExpression DIBuilder::createBitPieceExpression(unsigned OffsetInBytes,
649 unsigned SizeInBytes) {
650 uint64_t Addr[] = {dwarf::DW_OP_bit_piece, OffsetInBytes, SizeInBytes};
651 return MDExpression::get(VMContext, Addr);
654 DISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
655 StringRef LinkageName, DIFile File,
656 unsigned LineNo, DICompositeType Ty,
657 bool isLocalToUnit, bool isDefinition,
658 unsigned ScopeLine, unsigned Flags,
659 bool isOptimized, Function *Fn,
660 MDNode *TParams, MDNode *Decl) {
661 // dragonegg does not generate identifier for types, so using an empty map
662 // to resolve the context should be fine.
663 DITypeIdentifierMap EmptyMap;
664 return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File,
665 LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
666 Flags, isOptimized, Fn, TParams, Decl);
669 DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
670 StringRef LinkageName, DIFile File,
671 unsigned LineNo, DICompositeType Ty,
672 bool isLocalToUnit, bool isDefinition,
673 unsigned ScopeLine, unsigned Flags,
674 bool isOptimized, Function *Fn,
675 MDNode *TParams, MDNode *Decl) {
676 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
677 "function types should be subroutines");
678 auto *Node = MDSubprogram::get(
679 VMContext, MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))),
680 Name, LinkageName, File.get(), LineNo,
681 cast_or_null<MDSubroutineType>(Ty.get()), isLocalToUnit, isDefinition,
682 ScopeLine, nullptr, 0, 0, Flags, isOptimized, getConstantOrNull(Fn),
683 cast_or_null<MDTuple>(TParams), cast_or_null<MDSubprogram>(Decl),
684 MDTuple::getTemporary(VMContext, None).release());
687 AllSubprograms.push_back(Node);
688 trackIfUnresolved(Node);
693 DIBuilder::createTempFunctionFwdDecl(DIDescriptor Context, StringRef Name,
694 StringRef LinkageName, DIFile File,
695 unsigned LineNo, DICompositeType Ty,
696 bool isLocalToUnit, bool isDefinition,
697 unsigned ScopeLine, unsigned Flags,
698 bool isOptimized, Function *Fn,
699 MDNode *TParams, MDNode *Decl) {
700 return MDSubprogram::getTemporary(
702 MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))), Name,
703 LinkageName, File.get(), LineNo,
704 cast_or_null<MDSubroutineType>(Ty.get()), isLocalToUnit,
705 isDefinition, ScopeLine, nullptr, 0, 0, Flags, isOptimized,
706 getConstantOrNull(Fn), cast_or_null<MDTuple>(TParams),
707 cast_or_null<MDSubprogram>(Decl), nullptr)
711 DISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
712 StringRef LinkageName, DIFile F,
713 unsigned LineNo, DICompositeType Ty,
714 bool isLocalToUnit, bool isDefinition,
715 unsigned VK, unsigned VIndex,
716 DIType VTableHolder, unsigned Flags,
717 bool isOptimized, Function *Fn,
719 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
720 "function types should be subroutines");
721 assert(getNonCompileUnitScope(Context) &&
722 "Methods should have both a Context and a context that isn't "
723 "the compile unit.");
724 // FIXME: Do we want to use different scope/lines?
725 auto *SP = MDSubprogram::get(
726 VMContext, MDScopeRef::get(cast<MDScope>(Context)), Name, LinkageName,
727 F.get(), LineNo, cast_or_null<MDSubroutineType>(Ty.get()), isLocalToUnit,
728 isDefinition, LineNo, MDTypeRef::get(VTableHolder), VK, VIndex, Flags,
729 isOptimized, getConstantOrNull(Fn), cast_or_null<MDTuple>(TParam),
733 AllSubprograms.push_back(SP);
734 trackIfUnresolved(SP);
738 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
739 DIFile File, unsigned LineNo) {
740 return MDNamespace::get(VMContext, getNonCompileUnitScope(Scope), File, Name,
744 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
746 unsigned Discriminator) {
747 return MDLexicalBlockFile::get(VMContext, Scope, File.getFileNode(),
751 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
752 unsigned Line, unsigned Col) {
753 // Make these distinct, to avoid merging two lexical blocks on the same
755 return MDLexicalBlock::getDistinct(VMContext, getNonCompileUnitScope(Scope),
756 File.getFileNode(), Line, Col);
759 static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
760 assert(V && "no value passed to dbg intrinsic");
761 return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
764 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
766 Instruction *InsertBefore) {
767 assert(VarInfo && "empty or invalid DIVariable passed to dbg.declare");
769 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
771 trackIfUnresolved(VarInfo);
772 trackIfUnresolved(Expr);
773 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
774 MetadataAsValue::get(VMContext, VarInfo),
775 MetadataAsValue::get(VMContext, Expr)};
776 return CallInst::Create(DeclareFn, Args, "", InsertBefore);
779 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
781 BasicBlock *InsertAtEnd) {
782 assert(VarInfo && "empty or invalid DIVariable passed to dbg.declare");
784 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
786 trackIfUnresolved(VarInfo);
787 trackIfUnresolved(Expr);
788 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
789 MetadataAsValue::get(VMContext, VarInfo),
790 MetadataAsValue::get(VMContext, Expr)};
792 // If this block already has a terminator then insert this intrinsic
793 // before the terminator.
794 if (TerminatorInst *T = InsertAtEnd->getTerminator())
795 return CallInst::Create(DeclareFn, Args, "", T);
797 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
800 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
803 Instruction *InsertBefore) {
804 assert(V && "no value passed to dbg.value");
805 assert(VarInfo && "empty or invalid DIVariable passed to dbg.value");
807 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
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);
818 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
821 BasicBlock *InsertAtEnd) {
822 assert(V && "no value passed to dbg.value");
823 assert(VarInfo && "empty or invalid DIVariable passed to dbg.value");
825 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
827 trackIfUnresolved(VarInfo);
828 trackIfUnresolved(Expr);
829 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
830 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
831 MetadataAsValue::get(VMContext, VarInfo),
832 MetadataAsValue::get(VMContext, Expr)};
833 return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
836 void DIBuilder::replaceVTableHolder(DICompositeType &T, DICompositeType VTableHolder) {
837 T.setContainingType(VTableHolder);
839 // If this didn't create a self-reference, just return.
840 if (T != VTableHolder)
843 // Look for unresolved operands. T will drop RAUW support, orphaning any
844 // cycles underneath it.
846 for (const MDOperand &O : T->operands())
847 if (auto *N = dyn_cast_or_null<MDNode>(O))
848 trackIfUnresolved(N);
851 void DIBuilder::replaceArrays(DICompositeType &T, DIArray Elements,
853 T.setArrays(Elements, TParams);
855 // If T isn't resolved, there's no problem.
856 if (!T->isResolved())
859 // If "T" is resolved, it may be due to a self-reference cycle. Track the
860 // arrays explicitly if they're unresolved, or else the cycles will be
863 trackIfUnresolved(Elements);
865 trackIfUnresolved(TParams);