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/Analysis/DIBuilder.h"
15 #include "llvm/Analysis/DebugInfo.h"
16 #include "llvm/Constants.h"
17 #include "llvm/IntrinsicInst.h"
18 #include "llvm/Module.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/Support/Dwarf.h"
23 using namespace llvm::dwarf;
25 static Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) {
26 assert((Tag & LLVMDebugVersionMask) == 0 &&
27 "Tag too large for debug encoding!");
28 return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion);
31 DIBuilder::DIBuilder(Module &m)
32 : M(m), VMContext(M.getContext()), TheCU(0), TempEnumTypes(0),
33 TempRetainTypes(0), TempSubprograms(0), TempGVs(0), DeclareFn(0),
37 /// finalize - Construct any deferred debug info descriptors.
38 void DIBuilder::finalize() {
39 DIArray Enums = getOrCreateArray(AllEnumTypes);
40 DIType(TempEnumTypes).replaceAllUsesWith(Enums);
42 DIArray RetainTypes = getOrCreateArray(AllRetainTypes);
43 DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
45 DIArray SPs = getOrCreateArray(AllSubprograms);
46 DIType(TempSubprograms).replaceAllUsesWith(SPs);
47 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
48 DISubprogram SP(SPs.getElement(i));
49 if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) {
50 SmallVector<Value *, 4> Variables;
51 for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii)
52 Variables.push_back(NMD->getOperand(ii));
53 if (MDNode *Temp = SP.getVariablesNodes()) {
54 DIArray AV = getOrCreateArray(Variables);
55 DIType(Temp).replaceAllUsesWith(AV);
57 NMD->eraseFromParent();
61 DIArray GVs = getOrCreateArray(AllGVs);
62 DIType(TempGVs).replaceAllUsesWith(GVs);
65 /// getNonCompileUnitScope - If N is compile unit return NULL otherwise return
67 static MDNode *getNonCompileUnitScope(MDNode *N) {
68 if (DIDescriptor(N).isCompileUnit())
73 /// createCompileUnit - A CompileUnit provides an anchor for all debugging
74 /// information generated during this instance of compilation.
75 void DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
76 StringRef Directory, StringRef Producer,
77 bool isOptimized, StringRef Flags,
78 unsigned RunTimeVer) {
79 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
80 TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
81 Value *THElts[] = { TempEnumTypes };
82 MDNode *EnumHolder = MDNode::get(VMContext, THElts);
84 TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
85 Value *TRElts[] = { TempRetainTypes };
86 MDNode *RetainHolder = MDNode::get(VMContext, TRElts);
88 TempSubprograms = MDNode::getTemporary(VMContext, TElts);
89 Value *TSElts[] = { TempSubprograms };
90 MDNode *SPHolder = MDNode::get(VMContext, TSElts);
92 TempGVs = MDNode::getTemporary(VMContext, TElts);
93 Value *TVElts[] = { TempGVs };
94 MDNode *GVHolder = MDNode::get(VMContext, TVElts);
97 GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
98 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
99 ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
100 MDString::get(VMContext, Filename),
101 MDString::get(VMContext, Directory),
102 MDString::get(VMContext, Producer),
103 // Deprecate isMain field.
104 ConstantInt::get(Type::getInt1Ty(VMContext), true), // isMain
105 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
106 MDString::get(VMContext, Flags),
107 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer),
113 TheCU = DICompileUnit(MDNode::get(VMContext, Elts));
115 // Create a named metadata so that it is easier to find cu in a module.
116 NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
117 NMD->addOperand(TheCU);
120 /// createFile - Create a file descriptor to hold debugging information
122 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
123 assert(TheCU && "Unable to create DW_TAG_file_type without CompileUnit");
125 GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
126 MDString::get(VMContext, Filename),
127 MDString::get(VMContext, Directory),
130 return DIFile(MDNode::get(VMContext, Elts));
133 /// createEnumerator - Create a single enumerator value.
134 DIEnumerator DIBuilder::createEnumerator(StringRef Name, uint64_t Val) {
136 GetTagConstant(VMContext, dwarf::DW_TAG_enumerator),
137 MDString::get(VMContext, Name),
138 ConstantInt::get(Type::getInt64Ty(VMContext), Val)
140 return DIEnumerator(MDNode::get(VMContext, Elts));
143 /// createBasicType - Create debugging information entry for a basic
144 /// type, e.g 'char'.
145 DIType DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
146 uint64_t AlignInBits,
148 // Basic types are encoded in DIBasicType format. Line number, filename,
149 // offset and flags are always empty here.
151 GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
153 MDString::get(VMContext, Name),
155 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
156 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
157 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
158 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
159 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
160 ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
162 return DIType(MDNode::get(VMContext, Elts));
165 /// createQaulifiedType - Create debugging information entry for a qualified
166 /// type, e.g. 'const int'.
167 DIType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
168 // Qualified types are encoded in DIDerivedType format.
170 GetTagConstant(VMContext, Tag),
172 MDString::get(VMContext, StringRef()), // Empty name.
174 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
175 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
176 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
177 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
178 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
181 return DIType(MDNode::get(VMContext, Elts));
184 /// createPointerType - Create debugging information entry for a pointer.
185 DIType DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
186 uint64_t AlignInBits, StringRef Name) {
187 // Pointer types are encoded in DIDerivedType format.
189 GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
191 MDString::get(VMContext, Name),
193 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
194 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
195 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
196 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
197 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
200 return DIType(MDNode::get(VMContext, Elts));
203 /// createReferenceType - Create debugging information entry for a reference.
204 DIType DIBuilder::createReferenceType(DIType RTy) {
205 // References are encoded in DIDerivedType format.
207 GetTagConstant(VMContext, dwarf::DW_TAG_reference_type),
211 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
212 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
213 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
214 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
215 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
218 return DIType(MDNode::get(VMContext, Elts));
221 /// createTypedef - Create debugging information entry for a typedef.
222 DIType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
223 unsigned LineNo, DIDescriptor Context) {
224 // typedefs are encoded in DIDerivedType format.
225 assert(Ty.Verify() && "Invalid typedef type!");
227 GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
228 getNonCompileUnitScope(Context),
229 MDString::get(VMContext, Name),
231 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
232 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
233 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
234 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
235 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
238 return DIType(MDNode::get(VMContext, Elts));
241 /// createFriend - Create debugging information entry for a 'friend'.
242 DIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
243 // typedefs are encoded in DIDerivedType format.
244 assert(Ty.Verify() && "Invalid type!");
245 assert(FriendTy.Verify() && "Invalid friend type!");
247 GetTagConstant(VMContext, dwarf::DW_TAG_friend),
251 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
252 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
253 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
254 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
255 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
258 return DIType(MDNode::get(VMContext, Elts));
261 /// createInheritance - Create debugging information entry to establish
262 /// inheritnace relationship between two types.
263 DIType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
264 uint64_t BaseOffset, unsigned Flags) {
265 // TAG_inheritance is encoded in DIDerivedType format.
267 GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
271 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
272 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
273 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
274 ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
275 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
278 return DIType(MDNode::get(VMContext, Elts));
281 /// createMemberType - Create debugging information entry for a member.
282 DIType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
283 DIFile File, unsigned LineNumber,
284 uint64_t SizeInBits, uint64_t AlignInBits,
285 uint64_t OffsetInBits, unsigned Flags,
287 // TAG_member is encoded in DIDerivedType format.
289 GetTagConstant(VMContext, dwarf::DW_TAG_member),
290 getNonCompileUnitScope(Scope),
291 MDString::get(VMContext, Name),
293 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
294 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
295 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
296 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
297 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
300 return DIType(MDNode::get(VMContext, Elts));
303 /// createObjCIVar - Create debugging information entry for Objective-C
304 /// instance variable.
305 DIType DIBuilder::createObjCIVar(StringRef Name,
306 DIFile File, unsigned LineNumber,
307 uint64_t SizeInBits, uint64_t AlignInBits,
308 uint64_t OffsetInBits, unsigned Flags,
309 DIType Ty, StringRef PropertyName,
310 StringRef GetterName, StringRef SetterName,
311 unsigned PropertyAttributes) {
312 // TAG_member is encoded in DIDerivedType format.
314 GetTagConstant(VMContext, dwarf::DW_TAG_member),
315 getNonCompileUnitScope(File),
316 MDString::get(VMContext, Name),
318 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
319 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
320 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
321 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
322 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
324 MDString::get(VMContext, PropertyName),
325 MDString::get(VMContext, GetterName),
326 MDString::get(VMContext, SetterName),
327 ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
329 return DIType(MDNode::get(VMContext, Elts));
332 /// createClassType - Create debugging information entry for a class.
333 DIType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
334 DIFile File, unsigned LineNumber,
335 uint64_t SizeInBits, uint64_t AlignInBits,
336 uint64_t OffsetInBits, unsigned Flags,
337 DIType DerivedFrom, DIArray Elements,
338 MDNode *VTableHoder, MDNode *TemplateParams) {
339 // TAG_class_type is encoded in DICompositeType format.
341 GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
342 getNonCompileUnitScope(Context),
343 MDString::get(VMContext, Name),
345 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
346 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
347 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
348 ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
349 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
352 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
356 return DIType(MDNode::get(VMContext, Elts));
359 /// createTemplateTypeParameter - Create debugging information for template
361 DITemplateTypeParameter
362 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
363 DIType Ty, MDNode *File, unsigned LineNo,
366 GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
367 getNonCompileUnitScope(Context),
368 MDString::get(VMContext, Name),
371 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
372 ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
374 return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
377 /// createTemplateValueParameter - Create debugging information for template
379 DITemplateValueParameter
380 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
381 DIType Ty, uint64_t Val,
382 MDNode *File, unsigned LineNo,
385 GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter),
386 getNonCompileUnitScope(Context),
387 MDString::get(VMContext, Name),
389 ConstantInt::get(Type::getInt64Ty(VMContext), Val),
391 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
392 ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
394 return DITemplateValueParameter(MDNode::get(VMContext, Elts));
397 /// createStructType - Create debugging information entry for a struct.
398 DIType DIBuilder::createStructType(DIDescriptor Context, StringRef Name,
399 DIFile File, unsigned LineNumber,
400 uint64_t SizeInBits, uint64_t AlignInBits,
401 unsigned Flags, DIArray Elements,
402 unsigned RunTimeLang) {
403 // TAG_structure_type is encoded in DICompositeType format.
405 GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
406 getNonCompileUnitScope(Context),
407 MDString::get(VMContext, Name),
409 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
410 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
411 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
412 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
413 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
414 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
416 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
417 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
419 return DIType(MDNode::get(VMContext, Elts));
422 /// createUnionType - Create debugging information entry for an union.
423 DIType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
425 unsigned LineNumber, uint64_t SizeInBits,
426 uint64_t AlignInBits, unsigned Flags,
427 DIArray Elements, unsigned RunTimeLang) {
428 // TAG_union_type is encoded in DICompositeType format.
430 GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
431 getNonCompileUnitScope(Scope),
432 MDString::get(VMContext, Name),
434 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
435 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
436 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
437 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
438 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
439 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
441 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
442 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
444 return DIType(MDNode::get(VMContext, Elts));
447 /// createSubroutineType - Create subroutine type.
448 DIType DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
449 // TAG_subroutine_type is encoded in DICompositeType format.
451 GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
452 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
453 MDString::get(VMContext, ""),
454 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
455 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
456 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
457 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
458 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
459 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
460 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
462 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
463 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
465 return DIType(MDNode::get(VMContext, Elts));
468 /// createEnumerationType - Create debugging information entry for an
470 DIType DIBuilder::createEnumerationType(DIDescriptor Scope, StringRef Name,
471 DIFile File, unsigned LineNumber,
473 uint64_t AlignInBits,
475 // TAG_enumeration_type is encoded in DICompositeType format.
477 GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
478 getNonCompileUnitScope(Scope),
479 MDString::get(VMContext, Name),
481 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
482 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
483 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
484 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
485 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
486 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
488 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
489 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
491 MDNode *Node = MDNode::get(VMContext, Elts);
492 AllEnumTypes.push_back(Node);
496 /// createArrayType - Create debugging information entry for an array.
497 DIType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
498 DIType Ty, DIArray Subscripts) {
499 // TAG_array_type is encoded in DICompositeType format.
501 GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
503 MDString::get(VMContext, ""),
505 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
506 ConstantInt::get(Type::getInt64Ty(VMContext), Size),
507 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
508 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
509 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
512 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
513 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
515 return DIType(MDNode::get(VMContext, Elts));
518 /// createVectorType - Create debugging information entry for a vector.
519 DIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
520 DIType Ty, DIArray Subscripts) {
521 // TAG_vector_type is encoded in DICompositeType format.
523 GetTagConstant(VMContext, dwarf::DW_TAG_vector_type),
525 MDString::get(VMContext, ""),
527 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
528 ConstantInt::get(Type::getInt64Ty(VMContext), Size),
529 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
530 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
531 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
534 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
535 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
537 return DIType(MDNode::get(VMContext, Elts));
540 /// createArtificialType - Create a new DIType with "artificial" flag set.
541 DIType DIBuilder::createArtificialType(DIType Ty) {
542 if (Ty.isArtificial())
545 SmallVector<Value *, 9> Elts;
547 assert (N && "Unexpected input DIType!");
548 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
549 if (Value *V = N->getOperand(i))
552 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
555 unsigned CurFlags = Ty.getFlags();
556 CurFlags = CurFlags | DIType::FlagArtificial;
558 // Flags are stored at this slot.
559 Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
561 return DIType(MDNode::get(VMContext, Elts));
564 /// retainType - Retain DIType in a module even if it is not referenced
565 /// through debug info anchors.
566 void DIBuilder::retainType(DIType T) {
567 AllRetainTypes.push_back(T);
570 /// createUnspecifiedParameter - Create unspeicified type descriptor
571 /// for the subroutine type.
572 DIDescriptor DIBuilder::createUnspecifiedParameter() {
574 GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
576 return DIDescriptor(MDNode::get(VMContext, Elts));
579 /// createTemporaryType - Create a temporary forward-declared type.
580 DIType DIBuilder::createTemporaryType() {
581 // Give the temporary MDNode a tag. It doesn't matter what tag we
582 // use here as long as DIType accepts it.
583 Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
584 MDNode *Node = MDNode::getTemporary(VMContext, Elts);
588 /// createTemporaryType - Create a temporary forward-declared type.
589 DIType DIBuilder::createTemporaryType(DIFile F) {
590 // Give the temporary MDNode a tag. It doesn't matter what tag we
591 // use here as long as DIType accepts it.
593 GetTagConstant(VMContext, DW_TAG_base_type),
598 MDNode *Node = MDNode::getTemporary(VMContext, Elts);
602 /// getOrCreateArray - Get a DIArray, create one if required.
603 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
604 if (Elements.empty()) {
605 Value *Null = llvm::Constant::getNullValue(Type::getInt32Ty(VMContext));
606 return DIArray(MDNode::get(VMContext, Null));
608 return DIArray(MDNode::get(VMContext, Elements));
611 /// getOrCreateSubrange - Create a descriptor for a value range. This
612 /// implicitly uniques the values returned.
613 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Hi) {
615 GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
616 ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
617 ConstantInt::get(Type::getInt64Ty(VMContext), Hi)
620 return DISubrange(MDNode::get(VMContext, Elts));
623 /// createGlobalVariable - Create a new descriptor for the specified global.
624 DIGlobalVariable DIBuilder::
625 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
626 DIType Ty, bool isLocalToUnit, llvm::Value *Val) {
628 GetTagConstant(VMContext, dwarf::DW_TAG_variable),
629 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
631 MDString::get(VMContext, Name),
632 MDString::get(VMContext, Name),
633 MDString::get(VMContext, Name),
635 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
637 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
638 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
641 MDNode *Node = MDNode::get(VMContext, Elts);
642 AllGVs.push_back(Node);
643 return DIGlobalVariable(Node);
646 /// createStaticVariable - Create a new descriptor for the specified static
648 DIGlobalVariable DIBuilder::
649 createStaticVariable(DIDescriptor Context, StringRef Name,
650 StringRef LinkageName, DIFile F, unsigned LineNumber,
651 DIType Ty, bool isLocalToUnit, llvm::Value *Val) {
653 GetTagConstant(VMContext, dwarf::DW_TAG_variable),
654 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
655 getNonCompileUnitScope(Context),
656 MDString::get(VMContext, Name),
657 MDString::get(VMContext, Name),
658 MDString::get(VMContext, LinkageName),
660 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
662 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
663 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
666 MDNode *Node = MDNode::get(VMContext, Elts);
667 AllGVs.push_back(Node);
668 return DIGlobalVariable(Node);
671 /// createVariable - Create a new descriptor for the specified variable.
672 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
673 StringRef Name, DIFile File,
674 unsigned LineNo, DIType Ty,
675 bool AlwaysPreserve, unsigned Flags,
678 GetTagConstant(VMContext, Tag),
679 getNonCompileUnitScope(Scope),
680 MDString::get(VMContext, Name),
682 ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
684 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
685 Constant::getNullValue(Type::getInt32Ty(VMContext)),
687 MDNode *Node = MDNode::get(VMContext, Elts);
688 if (AlwaysPreserve) {
689 // The optimizer may remove local variable. If there is an interest
690 // to preserve variable info in such situation then stash it in a
692 DISubprogram Fn(getDISubprogram(Scope));
693 NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
694 FnLocals->addOperand(Node);
696 return DIVariable(Node);
699 /// createComplexVariable - Create a new descriptor for the specified variable
700 /// which has a complex address expression for its address.
701 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
702 StringRef Name, DIFile F,
704 DIType Ty, ArrayRef<Value *> Addr,
706 SmallVector<Value *, 15> Elts;
707 Elts.push_back(GetTagConstant(VMContext, Tag));
708 Elts.push_back(getNonCompileUnitScope(Scope)),
709 Elts.push_back(MDString::get(VMContext, Name));
711 Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
712 (LineNo | (ArgNo << 24))));
714 Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)));
715 Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)));
716 Elts.append(Addr.begin(), Addr.end());
718 return DIVariable(MDNode::get(VMContext, Elts));
721 /// createFunction - Create a new descriptor for the specified function.
722 DISubprogram DIBuilder::createFunction(DIDescriptor Context,
724 StringRef LinkageName,
725 DIFile File, unsigned LineNo,
727 bool isLocalToUnit, bool isDefinition,
728 unsigned Flags, bool isOptimized,
732 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
733 MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
734 Value *TVElts[] = { Temp };
735 MDNode *THolder = MDNode::get(VMContext, TVElts);
738 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
739 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
740 getNonCompileUnitScope(Context),
741 MDString::get(VMContext, Name),
742 MDString::get(VMContext, Name),
743 MDString::get(VMContext, LinkageName),
745 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
747 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
748 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
749 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
750 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
751 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
752 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
753 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
759 MDNode *Node = MDNode::get(VMContext, Elts);
761 // Create a named metadata so that we do not lose this mdnode.
762 AllSubprograms.push_back(Node);
763 return DISubprogram(Node);
766 /// createMethod - Create a new descriptor for the specified C++ method.
767 DISubprogram DIBuilder::createMethod(DIDescriptor Context,
769 StringRef LinkageName,
771 unsigned LineNo, DIType Ty,
774 unsigned VK, unsigned VIndex,
775 MDNode *VTableHolder,
780 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
781 MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
782 Value *TVElts[] = { Temp };
783 MDNode *THolder = MDNode::get(VMContext, TVElts);
786 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
787 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
788 getNonCompileUnitScope(Context),
789 MDString::get(VMContext, Name),
790 MDString::get(VMContext, Name),
791 MDString::get(VMContext, LinkageName),
793 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
795 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
796 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
797 ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
798 ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
800 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
801 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
804 llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
807 MDNode *Node = MDNode::get(VMContext, Elts);
808 return DISubprogram(Node);
811 /// createNameSpace - This creates new descriptor for a namespace
812 /// with the specified parent scope.
813 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
814 DIFile File, unsigned LineNo) {
816 GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
817 getNonCompileUnitScope(Scope),
818 MDString::get(VMContext, Name),
820 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
822 return DINameSpace(MDNode::get(VMContext, Elts));
825 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
826 unsigned Line, unsigned Col) {
827 // Defeat MDNode uniqing for lexical blocks by using unique id.
828 static unsigned int unique_id = 0;
830 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
831 getNonCompileUnitScope(Scope),
832 ConstantInt::get(Type::getInt32Ty(VMContext), Line),
833 ConstantInt::get(Type::getInt32Ty(VMContext), Col),
835 ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
837 return DILexicalBlock(MDNode::get(VMContext, Elts));
840 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
841 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
842 Instruction *InsertBefore) {
843 assert(Storage && "no storage passed to dbg.declare");
844 assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare");
846 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
848 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
849 return CallInst::Create(DeclareFn, Args, "", InsertBefore);
852 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
853 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
854 BasicBlock *InsertAtEnd) {
855 assert(Storage && "no storage passed to dbg.declare");
856 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare");
858 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
860 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
862 // If this block already has a terminator then insert this intrinsic
863 // before the terminator.
864 if (TerminatorInst *T = InsertAtEnd->getTerminator())
865 return CallInst::Create(DeclareFn, Args, "", T);
867 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
870 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
871 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
873 Instruction *InsertBefore) {
874 assert(V && "no value passed to dbg.value");
875 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
877 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
879 Value *Args[] = { MDNode::get(V->getContext(), V),
880 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
882 return CallInst::Create(ValueFn, Args, "", InsertBefore);
885 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
886 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
888 BasicBlock *InsertAtEnd) {
889 assert(V && "no value passed to dbg.value");
890 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
892 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
894 Value *Args[] = { MDNode::get(V->getContext(), V),
895 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
897 return CallInst::Create(ValueFn, Args, "", InsertAtEnd);