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 DIType(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 DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
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);
104 DIArray GVs = getOrCreateArray(AllGVs);
105 DIType(TempGVs).replaceAllUsesWith(GVs);
107 SmallVector<Metadata *, 16> RetainValuesI(AllImportedModules.begin(),
108 AllImportedModules.end());
109 DIArray IMs = getOrCreateArray(RetainValuesI);
110 DIType(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 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);
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);
170 return DICompileUnit(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 assert(M.Verify() && "Imported module should be valid");
179 AllImportedModules.emplace_back(M.get());
183 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
186 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
187 Context, NS, Line, StringRef(), AllImportedModules);
190 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
193 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
194 Context, NS, Line, StringRef(), AllImportedModules);
197 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
201 // Make sure to use the unique identifier based metadata reference for
202 // types that have one.
203 return ::createImportedModule(
204 VMContext, dwarf::DW_TAG_imported_declaration, Context,
205 DebugNodeRef::get(cast_or_null<DebugNode>(Decl.get())), Line, Name,
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);
216 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
217 return MDFile::get(VMContext, Filename, Directory);
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);
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);
230 DIBasicType DIBuilder::createNullPtrType() {
231 return createUnspecifiedType("decltype(nullptr)");
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);
242 DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
243 return MDDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr,
244 MDTypeRef::get(FromTy), 0, 0, 0, 0);
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, MDTypeRef::get(PointeeTy),
253 SizeInBits, AlignInBits, 0, 0);
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, MDTypeRef::get(PointeeTy),
261 SizeInBits, AlignInBits, 0, 0, MDTypeRef::get(Base));
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 MDTypeRef::get(RTy), 0, 0, 0, 0);
270 DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
271 unsigned LineNo, DIDescriptor Context) {
272 return MDDerivedType::get(
273 VMContext, dwarf::DW_TAG_typedef, Name, File, LineNo,
274 MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))),
275 MDTypeRef::get(Ty), 0, 0, 0, 0);
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 MDTypeRef::get(Ty), MDTypeRef::get(FriendTy), 0, 0,
287 DIDerivedType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
290 assert(Ty.isType() && "Unable to create inheritance");
291 return MDDerivedType::get(VMContext, dwarf::DW_TAG_inheritance, "", nullptr,
292 0, MDTypeRef::get(Ty), MDTypeRef::get(BaseTy), 0, 0,
296 DIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
297 DIFile File, unsigned LineNumber,
299 uint64_t AlignInBits,
300 uint64_t OffsetInBits, unsigned Flags,
302 return MDDerivedType::get(
303 VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
304 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))),
305 MDTypeRef::get(Ty), SizeInBits, AlignInBits, OffsetInBits, Flags);
308 static ConstantAsMetadata *getConstantOrNull(Constant *C) {
310 return ConstantAsMetadata::get(C);
314 DIDerivedType DIBuilder::createStaticMemberType(DIDescriptor Scope,
315 StringRef Name, DIFile File,
316 unsigned LineNumber, DIType Ty,
318 llvm::Constant *Val) {
319 // TAG_member is encoded in DIDerivedType format.
320 Flags |= DIDescriptor::FlagStaticMember;
321 return MDDerivedType::get(
322 VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
323 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))),
324 MDTypeRef::get(Ty), 0, 0, 0, Flags, getConstantOrNull(Val));
327 DIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File,
330 uint64_t AlignInBits,
331 uint64_t OffsetInBits, unsigned Flags,
332 DIType Ty, MDNode *PropertyNode) {
333 return MDDerivedType::get(
334 VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
335 MDScopeRef::get(getNonCompileUnitScope(File)), MDTypeRef::get(Ty),
336 SizeInBits, AlignInBits, OffsetInBits, Flags, PropertyNode);
340 DIBuilder::createObjCProperty(StringRef Name, DIFile File, unsigned LineNumber,
341 StringRef GetterName, StringRef SetterName,
342 unsigned PropertyAttributes, DIType Ty) {
343 return MDObjCProperty::get(VMContext, Name, File, LineNumber, GetterName,
344 SetterName, PropertyAttributes, Ty);
347 DITemplateTypeParameter
348 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
350 assert((!Context || isa<MDCompileUnit>(Context.get())) &&
351 "Expected compile unit");
352 return MDTemplateTypeParameter::get(VMContext, Name, MDTypeRef::get(Ty));
355 static DITemplateValueParameter
356 createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag,
357 DIDescriptor Context, StringRef Name,
358 DIType Ty, Metadata *MD) {
359 assert((!Context || isa<MDCompileUnit>(Context.get())) &&
360 "Expected compile unit");
361 return MDTemplateValueParameter::get(VMContext, Tag, Name, MDTypeRef::get(Ty),
365 DITemplateValueParameter
366 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
367 DIType Ty, Constant *Val) {
368 return createTemplateValueParameterHelper(
369 VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
370 getConstantOrNull(Val));
373 DITemplateValueParameter
374 DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
375 DIType Ty, StringRef Val) {
376 return createTemplateValueParameterHelper(
377 VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
378 MDString::get(VMContext, Val));
381 DITemplateValueParameter
382 DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
383 DIType Ty, DIArray Val) {
384 return createTemplateValueParameterHelper(
385 VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
389 DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
390 DIFile File, unsigned LineNumber,
392 uint64_t AlignInBits,
393 uint64_t OffsetInBits,
394 unsigned Flags, DIType DerivedFrom,
397 MDNode *TemplateParams,
398 StringRef UniqueIdentifier) {
399 assert((!Context || Context.isScope() || Context.isType()) &&
400 "createClassType should be called with a valid Context");
401 // TAG_class_type is encoded in DICompositeType format.
402 DICompositeType R = MDCompositeType::get(
403 VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
404 MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))),
405 MDTypeRef::get(DerivedFrom), SizeInBits, AlignInBits, OffsetInBits, Flags,
406 Elements, 0, MDTypeRef::get(VTableHolder),
407 cast_or_null<MDTuple>(TemplateParams), UniqueIdentifier);
408 if (!UniqueIdentifier.empty())
410 trackIfUnresolved(R);
414 DICompositeType DIBuilder::createStructType(DIDescriptor Context,
415 StringRef Name, DIFile File,
418 uint64_t AlignInBits,
419 unsigned Flags, DIType DerivedFrom,
421 unsigned RunTimeLang,
423 StringRef UniqueIdentifier) {
424 DICompositeType R = MDCompositeType::get(
425 VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
426 MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))),
427 MDTypeRef::get(DerivedFrom), SizeInBits, AlignInBits, 0, Flags, Elements,
428 RunTimeLang, MDTypeRef::get(VTableHolder), nullptr, UniqueIdentifier);
429 if (!UniqueIdentifier.empty())
431 trackIfUnresolved(R);
435 DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
436 DIFile File, unsigned LineNumber,
438 uint64_t AlignInBits, unsigned Flags,
440 unsigned RunTimeLang,
441 StringRef UniqueIdentifier) {
442 DICompositeType R = MDCompositeType::get(
443 VMContext, dwarf::DW_TAG_union_type, Name, File, LineNumber,
444 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))), nullptr,
445 SizeInBits, AlignInBits, 0, Flags, Elements, RunTimeLang, nullptr,
446 nullptr, UniqueIdentifier);
447 if (!UniqueIdentifier.empty())
449 trackIfUnresolved(R);
453 DISubroutineType DIBuilder::createSubroutineType(DIFile File,
454 DITypeArray ParameterTypes,
456 return MDSubroutineType::get(VMContext, Flags, ParameterTypes);
459 DICompositeType DIBuilder::createEnumerationType(
460 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
461 uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
462 DIType UnderlyingType, StringRef UniqueIdentifier) {
463 DICompositeType CTy = MDCompositeType::get(
464 VMContext, dwarf::DW_TAG_enumeration_type, Name, File, LineNumber,
465 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))),
466 MDTypeRef::get(UnderlyingType), SizeInBits, AlignInBits, 0, 0, Elements,
467 0, nullptr, nullptr, UniqueIdentifier);
468 AllEnumTypes.push_back(CTy);
469 if (!UniqueIdentifier.empty())
471 trackIfUnresolved(CTy);
475 DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
476 DIType Ty, DIArray Subscripts) {
477 auto *R = MDCompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
478 nullptr, 0, nullptr, MDTypeRef::get(Ty), Size,
479 AlignInBits, 0, 0, Subscripts, 0, nullptr);
480 trackIfUnresolved(R);
484 DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
485 DIType Ty, DIArray Subscripts) {
487 MDCompositeType::get(VMContext, dwarf::DW_TAG_array_type, "", nullptr, 0,
488 nullptr, MDTypeRef::get(Ty), Size, AlignInBits, 0,
489 DIType::FlagVector, Subscripts, 0, nullptr);
490 trackIfUnresolved(R);
494 static DIType createTypeWithFlags(LLVMContext &Context, DIType Ty,
495 unsigned FlagsToSet) {
496 TempMDType NewTy = cast<MDType>(static_cast<MDNode *>(Ty))->clone();
497 NewTy->setFlags(NewTy->getFlags() | FlagsToSet);
498 return MDNode::replaceWithUniqued(std::move(NewTy));
501 DIType DIBuilder::createArtificialType(DIType Ty) {
502 // FIXME: Restrict this to the nodes where it's valid.
503 if (Ty.isArtificial())
505 return createTypeWithFlags(VMContext, Ty, DIType::FlagArtificial);
508 DIType DIBuilder::createObjectPointerType(DIType Ty) {
509 // FIXME: Restrict this to the nodes where it's valid.
510 if (Ty.isObjectPointer())
512 unsigned Flags = DIType::FlagObjectPointer | DIType::FlagArtificial;
513 return createTypeWithFlags(VMContext, Ty, Flags);
516 void DIBuilder::retainType(DIType T) {
517 assert(T.get() && "Expected non-null type");
518 AllRetainTypes.emplace_back(T);
521 DIBasicType DIBuilder::createUnspecifiedParameter() {
522 return DIBasicType();
526 DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope,
527 DIFile F, unsigned Line, unsigned RuntimeLang,
528 uint64_t SizeInBits, uint64_t AlignInBits,
529 StringRef UniqueIdentifier) {
530 // FIXME: Define in terms of createReplaceableForwardDecl() by calling
531 // replaceWithUniqued().
532 DICompositeType RetTy = MDCompositeType::get(
533 VMContext, Tag, Name, F, Line,
534 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))), nullptr,
535 SizeInBits, AlignInBits, 0, DIDescriptor::FlagFwdDecl, nullptr,
536 RuntimeLang, nullptr, nullptr, UniqueIdentifier);
537 if (!UniqueIdentifier.empty())
539 trackIfUnresolved(RetTy);
543 DICompositeType DIBuilder::createReplaceableCompositeType(
544 unsigned Tag, StringRef Name, DIDescriptor Scope, DIFile F, unsigned Line,
545 unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
546 unsigned Flags, StringRef UniqueIdentifier) {
547 DICompositeType RetTy =
548 MDCompositeType::getTemporary(
549 VMContext, Tag, Name, F, Line,
550 MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))), nullptr,
551 SizeInBits, AlignInBits, 0, Flags, nullptr, RuntimeLang, nullptr,
552 nullptr, UniqueIdentifier)
554 if (!UniqueIdentifier.empty())
556 trackIfUnresolved(RetTy);
560 DIArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
561 return DIArray(MDNode::get(VMContext, Elements));
564 DITypeArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
565 SmallVector<llvm::Metadata *, 16> Elts;
566 for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
567 if (Elements[i] && isa<MDNode>(Elements[i]))
568 Elts.push_back(MDTypeRef::get(DIType(cast<MDNode>(Elements[i]))));
570 Elts.push_back(Elements[i]);
572 return DITypeArray(MDNode::get(VMContext, Elts));
575 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
576 return MDSubrange::get(VMContext, Count, Lo);
579 static void checkGlobalVariableScope(DIDescriptor Context) {
580 MDNode *TheCtx = getNonCompileUnitScope(Context);
581 if (DIScope(TheCtx).isCompositeType()) {
582 assert(!DICompositeType(TheCtx).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 DIDescriptor Context(getNonCompileUnitScope(Scope));
623 assert((!Context || Context.isScope()) &&
624 "createLocalVariable should be called with a valid Context");
626 auto *Node = MDLocalVariable::get(
627 VMContext, Tag, cast_or_null<MDLocalScope>(Context.get()), Name, File,
628 LineNo, MDTypeRef::get(Ty), ArgNo, Flags);
629 if (AlwaysPreserve) {
630 // The optimizer may remove local variable. If there is an interest
631 // to preserve variable info in such situation then stash it in a
633 DISubprogram Fn(getDISubprogram(Scope));
634 assert(Fn && "Missing subprogram for local variable");
635 PreservedVariables[Fn].emplace_back(Node);
640 DIExpression DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
641 return MDExpression::get(VMContext, Addr);
644 DIExpression DIBuilder::createExpression(ArrayRef<int64_t> Signed) {
645 // TODO: Remove the callers of this signed version and delete.
646 SmallVector<uint64_t, 8> Addr(Signed.begin(), Signed.end());
647 return createExpression(Addr);
650 DIExpression DIBuilder::createBitPieceExpression(unsigned OffsetInBytes,
651 unsigned SizeInBytes) {
652 uint64_t Addr[] = {dwarf::DW_OP_bit_piece, OffsetInBytes, SizeInBytes};
653 return MDExpression::get(VMContext, Addr);
656 DISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
657 StringRef LinkageName, DIFile File,
658 unsigned LineNo, DICompositeType Ty,
659 bool isLocalToUnit, bool isDefinition,
660 unsigned ScopeLine, unsigned Flags,
661 bool isOptimized, Function *Fn,
662 MDNode *TParams, MDNode *Decl) {
663 // dragonegg does not generate identifier for types, so using an empty map
664 // to resolve the context should be fine.
665 DITypeIdentifierMap EmptyMap;
666 return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File,
667 LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
668 Flags, isOptimized, Fn, TParams, Decl);
671 DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
672 StringRef LinkageName, DIFile File,
673 unsigned LineNo, DICompositeType Ty,
674 bool isLocalToUnit, bool isDefinition,
675 unsigned ScopeLine, unsigned Flags,
676 bool isOptimized, Function *Fn,
677 MDNode *TParams, MDNode *Decl) {
678 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
679 "function types should be subroutines");
680 auto *Node = MDSubprogram::get(
681 VMContext, MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))),
682 Name, LinkageName, File.get(), LineNo,
683 cast_or_null<MDSubroutineType>(Ty.get()), isLocalToUnit, isDefinition,
684 ScopeLine, nullptr, 0, 0, Flags, isOptimized, getConstantOrNull(Fn),
685 cast_or_null<MDTuple>(TParams), cast_or_null<MDSubprogram>(Decl),
686 MDTuple::getTemporary(VMContext, None).release());
689 AllSubprograms.push_back(Node);
690 trackIfUnresolved(Node);
695 DIBuilder::createTempFunctionFwdDecl(DIDescriptor Context, StringRef Name,
696 StringRef LinkageName, DIFile File,
697 unsigned LineNo, DICompositeType Ty,
698 bool isLocalToUnit, bool isDefinition,
699 unsigned ScopeLine, unsigned Flags,
700 bool isOptimized, Function *Fn,
701 MDNode *TParams, MDNode *Decl) {
702 return MDSubprogram::getTemporary(
704 MDScopeRef::get(DIScope(getNonCompileUnitScope(Context))), Name,
705 LinkageName, File.get(), LineNo,
706 cast_or_null<MDSubroutineType>(Ty.get()), isLocalToUnit,
707 isDefinition, ScopeLine, nullptr, 0, 0, Flags, isOptimized,
708 getConstantOrNull(Fn), cast_or_null<MDTuple>(TParams),
709 cast_or_null<MDSubprogram>(Decl), nullptr)
713 DISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
714 StringRef LinkageName, DIFile F,
715 unsigned LineNo, DICompositeType Ty,
716 bool isLocalToUnit, bool isDefinition,
717 unsigned VK, unsigned VIndex,
718 DIType VTableHolder, unsigned Flags,
719 bool isOptimized, Function *Fn,
721 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
722 "function types should be subroutines");
723 assert(getNonCompileUnitScope(Context) &&
724 "Methods should have both a Context and a context that isn't "
725 "the compile unit.");
726 // FIXME: Do we want to use different scope/lines?
727 auto *Node = MDSubprogram::get(
728 VMContext, MDScopeRef::get(DIScope(Context)), Name, LinkageName, F.get(),
729 LineNo, cast_or_null<MDSubroutineType>(Ty.get()), isLocalToUnit,
730 isDefinition, LineNo, MDTypeRef::get(VTableHolder), VK, VIndex, Flags,
731 isOptimized, getConstantOrNull(Fn), cast_or_null<MDTuple>(TParam),
735 AllSubprograms.push_back(Node);
736 DISubprogram S(Node);
737 assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
738 trackIfUnresolved(S);
742 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
743 DIFile File, unsigned LineNo) {
744 DINameSpace R = MDNamespace::get(VMContext, getNonCompileUnitScope(Scope),
747 "createNameSpace should return a verifiable DINameSpace");
751 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
753 unsigned Discriminator) {
754 DILexicalBlockFile R = MDLexicalBlockFile::get(
755 VMContext, Scope, File.getFileNode(), Discriminator);
758 "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
762 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
763 unsigned Line, unsigned Col) {
764 // Make these distinct, to avoid merging two lexical blocks on the same
766 DILexicalBlock R = MDLexicalBlock::getDistinct(
767 VMContext, getNonCompileUnitScope(Scope), File.getFileNode(), Line, Col);
769 "createLexicalBlock should return a verifiable DILexicalBlock");
773 static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
774 assert(V && "no value passed to dbg intrinsic");
775 return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
778 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
780 Instruction *InsertBefore) {
781 assert(VarInfo.isVariable() &&
782 "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)};
791 return CallInst::Create(DeclareFn, Args, "", InsertBefore);
794 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
796 BasicBlock *InsertAtEnd) {
797 assert(VarInfo.isVariable() &&
798 "empty or invalid DIVariable passed to dbg.declare");
800 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
802 trackIfUnresolved(VarInfo);
803 trackIfUnresolved(Expr);
804 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
805 MetadataAsValue::get(VMContext, VarInfo),
806 MetadataAsValue::get(VMContext, Expr)};
808 // If this block already has a terminator then insert this intrinsic
809 // before the terminator.
810 if (TerminatorInst *T = InsertAtEnd->getTerminator())
811 return CallInst::Create(DeclareFn, Args, "", T);
813 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
816 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
819 Instruction *InsertBefore) {
820 assert(V && "no value passed to dbg.value");
821 assert(VarInfo.isVariable() &&
822 "empty or invalid DIVariable passed to dbg.value");
824 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
826 trackIfUnresolved(VarInfo);
827 trackIfUnresolved(Expr);
828 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
829 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
830 MetadataAsValue::get(VMContext, VarInfo),
831 MetadataAsValue::get(VMContext, Expr)};
832 return CallInst::Create(ValueFn, Args, "", InsertBefore);
835 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
838 BasicBlock *InsertAtEnd) {
839 assert(V && "no value passed to dbg.value");
840 assert(VarInfo.isVariable() &&
841 "empty or invalid DIVariable passed to dbg.value");
843 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
845 trackIfUnresolved(VarInfo);
846 trackIfUnresolved(Expr);
847 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
848 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
849 MetadataAsValue::get(VMContext, VarInfo),
850 MetadataAsValue::get(VMContext, Expr)};
851 return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
854 void DIBuilder::replaceVTableHolder(DICompositeType &T, DICompositeType VTableHolder) {
855 T.setContainingType(VTableHolder);
857 // If this didn't create a self-reference, just return.
858 if (T != VTableHolder)
861 // Look for unresolved operands. T will drop RAUW support, orphaning any
862 // cycles underneath it.
864 for (const MDOperand &O : T->operands())
865 if (auto *N = dyn_cast_or_null<MDNode>(O))
866 trackIfUnresolved(N);
869 void DIBuilder::replaceArrays(DICompositeType &T, DIArray Elements,
871 T.setArrays(Elements, TParams);
873 // If T isn't resolved, there's no problem.
874 if (!T->isResolved())
877 // If "T" is resolved, it may be due to a self-reference cycle. Track the
878 // arrays explicitly if they're unresolved, or else the cycles will be
881 trackIfUnresolved(Elements);
883 trackIfUnresolved(TParams);