1 //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the DIBuilder.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/DIBuilder.h"
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/DebugInfo.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/IntrinsicInst.h"
19 #include "llvm/IR/Module.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Support/Dwarf.h"
22
23 using namespace llvm;
24 using namespace llvm::dwarf;
25
GetTagConstant(LLVMContext & VMContext,unsigned Tag)26 static Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) {
27 assert((Tag & LLVMDebugVersionMask) == 0 &&
28 "Tag too large for debug encoding!");
29 return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion);
30 }
31
DIBuilder(Module & m)32 DIBuilder::DIBuilder(Module &m)
33 : M(m), VMContext(M.getContext()), TheCU(0), TempEnumTypes(0),
34 TempRetainTypes(0), TempSubprograms(0), TempGVs(0), DeclareFn(0),
35 ValueFn(0)
36 {}
37
38 /// finalize - Construct any deferred debug info descriptors.
finalize()39 void DIBuilder::finalize() {
40 DIArray Enums = getOrCreateArray(AllEnumTypes);
41 DIType(TempEnumTypes).replaceAllUsesWith(Enums);
42
43 DIArray RetainTypes = getOrCreateArray(AllRetainTypes);
44 DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
45
46 DIArray SPs = getOrCreateArray(AllSubprograms);
47 DIType(TempSubprograms).replaceAllUsesWith(SPs);
48 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
49 DISubprogram SP(SPs.getElement(i));
50 SmallVector<Value *, 4> Variables;
51 if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) {
52 for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii)
53 Variables.push_back(NMD->getOperand(ii));
54 NMD->eraseFromParent();
55 }
56 if (MDNode *Temp = SP.getVariablesNodes()) {
57 DIArray AV = getOrCreateArray(Variables);
58 DIType(Temp).replaceAllUsesWith(AV);
59 }
60 }
61
62 DIArray GVs = getOrCreateArray(AllGVs);
63 DIType(TempGVs).replaceAllUsesWith(GVs);
64 }
65
66 /// getNonCompileUnitScope - If N is compile unit return NULL otherwise return
67 /// N.
getNonCompileUnitScope(MDNode * N)68 static MDNode *getNonCompileUnitScope(MDNode *N) {
69 if (DIDescriptor(N).isCompileUnit())
70 return NULL;
71 return N;
72 }
73
74 /// createCompileUnit - A CompileUnit provides an anchor for all debugging
75 /// information generated during this instance of compilation.
createCompileUnit(unsigned Lang,StringRef Filename,StringRef Directory,StringRef Producer,bool isOptimized,StringRef Flags,unsigned RunTimeVer,StringRef SplitName)76 void DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
77 StringRef Directory, StringRef Producer,
78 bool isOptimized, StringRef Flags,
79 unsigned RunTimeVer, StringRef SplitName) {
80 assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) ||
81 (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
82 "Invalid Language tag");
83 assert(!Filename.empty() &&
84 "Unable to create compile unit without filename");
85 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
86 TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
87
88 TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
89
90 TempSubprograms = MDNode::getTemporary(VMContext, TElts);
91
92 TempGVs = MDNode::getTemporary(VMContext, TElts);
93
94 Value *Elts[] = {
95 GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
96 Constant::getNullValue(Type::getInt32Ty(VMContext)),
97 ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
98 createFile(Filename, Directory),
99 MDString::get(VMContext, Producer),
100 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
101 MDString::get(VMContext, Flags),
102 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer),
103 TempEnumTypes,
104 TempRetainTypes,
105 TempSubprograms,
106 TempGVs,
107 MDString::get(VMContext, SplitName)
108 };
109 TheCU = DICompileUnit(MDNode::get(VMContext, Elts));
110
111 // Create a named metadata so that it is easier to find cu in a module.
112 NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
113 NMD->addOperand(TheCU);
114 }
115
116 /// createFile - Create a file descriptor to hold debugging information
117 /// for a file.
createFile(StringRef Filename,StringRef Directory)118 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
119 assert(!Filename.empty() && "Unable to create file without name");
120 Value *Pair[] = {
121 MDString::get(VMContext, Filename),
122 MDString::get(VMContext, Directory),
123 };
124 Value *Elts[] = {
125 GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
126 MDNode::get(VMContext, Pair)
127 };
128 return DIFile(MDNode::get(VMContext, Elts));
129 }
130
131 /// createEnumerator - Create a single enumerator value.
createEnumerator(StringRef Name,uint64_t Val)132 DIEnumerator DIBuilder::createEnumerator(StringRef Name, uint64_t Val) {
133 assert(!Name.empty() && "Unable to create enumerator without name");
134 Value *Elts[] = {
135 GetTagConstant(VMContext, dwarf::DW_TAG_enumerator),
136 MDString::get(VMContext, Name),
137 ConstantInt::get(Type::getInt64Ty(VMContext), Val)
138 };
139 return DIEnumerator(MDNode::get(VMContext, Elts));
140 }
141
142 /// createNullPtrType - Create C++0x nullptr type.
createNullPtrType(StringRef Name)143 DIType DIBuilder::createNullPtrType(StringRef Name) {
144 assert(!Name.empty() && "Unable to create type without name");
145 // nullptr is encoded in DIBasicType format. Line number, filename,
146 // ,size, alignment, offset and flags are always empty here.
147 Value *Elts[] = {
148 GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type),
149 NULL, //TheCU,
150 MDString::get(VMContext, Name),
151 NULL, // Filename
152 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
153 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
154 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
155 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
156 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
157 ConstantInt::get(Type::getInt32Ty(VMContext), 0) // Encoding
158 };
159 return DIType(MDNode::get(VMContext, Elts));
160 }
161
162 /// createBasicType - Create debugging information entry for a basic
163 /// type, e.g 'char'.
164 DIBasicType
createBasicType(StringRef Name,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Encoding)165 DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
166 uint64_t AlignInBits, unsigned Encoding) {
167 assert(!Name.empty() && "Unable to create type without name");
168 // Basic types are encoded in DIBasicType format. Line number, filename,
169 // offset and flags are always empty here.
170 Value *Elts[] = {
171 GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
172 NULL, //TheCU,
173 MDString::get(VMContext, Name),
174 NULL, // Filename
175 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
176 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
177 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
178 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
179 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
180 ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
181 };
182 return DIBasicType(MDNode::get(VMContext, Elts));
183 }
184
185 /// createQualifiedType - Create debugging information entry for a qualified
186 /// type, e.g. 'const int'.
createQualifiedType(unsigned Tag,DIType FromTy)187 DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
188 // Qualified types are encoded in DIDerivedType format.
189 Value *Elts[] = {
190 GetTagConstant(VMContext, Tag),
191 NULL, //TheCU,
192 MDString::get(VMContext, StringRef()), // Empty name.
193 NULL, // Filename
194 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
195 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
196 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
197 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
198 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
199 FromTy
200 };
201 return DIDerivedType(MDNode::get(VMContext, Elts));
202 }
203
204 /// createPointerType - Create debugging information entry for a pointer.
205 DIDerivedType
createPointerType(DIType PointeeTy,uint64_t SizeInBits,uint64_t AlignInBits,StringRef Name)206 DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
207 uint64_t AlignInBits, StringRef Name) {
208 // Pointer types are encoded in DIDerivedType format.
209 Value *Elts[] = {
210 GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
211 NULL, //TheCU,
212 MDString::get(VMContext, Name),
213 NULL, // Filename
214 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
215 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
216 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
217 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
218 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
219 PointeeTy
220 };
221 return DIDerivedType(MDNode::get(VMContext, Elts));
222 }
223
createMemberPointerType(DIType PointeeTy,DIType Base)224 DIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy, DIType Base) {
225 // Pointer types are encoded in DIDerivedType format.
226 Value *Elts[] = {
227 GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type),
228 NULL, //TheCU,
229 NULL,
230 NULL, // Filename
231 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
232 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
233 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
234 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
235 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
236 PointeeTy,
237 Base
238 };
239 return DIDerivedType(MDNode::get(VMContext, Elts));
240 }
241
242 /// createReferenceType - Create debugging information entry for a reference
243 /// type.
createReferenceType(unsigned Tag,DIType RTy)244 DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
245 assert(RTy.Verify() && "Unable to create reference type");
246 // References are encoded in DIDerivedType format.
247 Value *Elts[] = {
248 GetTagConstant(VMContext, Tag),
249 NULL, // TheCU,
250 NULL, // Name
251 NULL, // Filename
252 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
253 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
254 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
255 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
256 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
257 RTy
258 };
259 return DIDerivedType(MDNode::get(VMContext, Elts));
260 }
261
262 /// createTypedef - Create debugging information entry for a typedef.
createTypedef(DIType Ty,StringRef Name,DIFile File,unsigned LineNo,DIDescriptor Context)263 DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
264 unsigned LineNo, DIDescriptor Context) {
265 // typedefs are encoded in DIDerivedType format.
266 assert(Ty.Verify() && "Invalid typedef type!");
267 Value *Elts[] = {
268 GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
269 getNonCompileUnitScope(Context),
270 MDString::get(VMContext, Name),
271 File,
272 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
273 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
274 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
275 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
276 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
277 Ty
278 };
279 return DIDerivedType(MDNode::get(VMContext, Elts));
280 }
281
282 /// createFriend - Create debugging information entry for a 'friend'.
createFriend(DIType Ty,DIType FriendTy)283 DIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
284 // typedefs are encoded in DIDerivedType format.
285 assert(Ty.Verify() && "Invalid type!");
286 assert(FriendTy.Verify() && "Invalid friend type!");
287 Value *Elts[] = {
288 GetTagConstant(VMContext, dwarf::DW_TAG_friend),
289 Ty,
290 NULL, // Name
291 Ty.getFile(),
292 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
293 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
294 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
295 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
296 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
297 FriendTy
298 };
299 return DIType(MDNode::get(VMContext, Elts));
300 }
301
302 /// createInheritance - Create debugging information entry to establish
303 /// inheritance relationship between two types.
createInheritance(DIType Ty,DIType BaseTy,uint64_t BaseOffset,unsigned Flags)304 DIDerivedType DIBuilder::createInheritance(
305 DIType Ty, DIType BaseTy, uint64_t BaseOffset, unsigned Flags) {
306 assert(Ty.Verify() && "Unable to create inheritance");
307 // TAG_inheritance is encoded in DIDerivedType format.
308 Value *Elts[] = {
309 GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
310 Ty,
311 NULL, // Name
312 Ty.getFile(),
313 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
314 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
315 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
316 ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
317 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
318 BaseTy
319 };
320 return DIDerivedType(MDNode::get(VMContext, Elts));
321 }
322
323 /// createMemberType - Create debugging information entry for a member.
createMemberType(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType Ty)324 DIDerivedType DIBuilder::createMemberType(
325 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
326 uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
327 unsigned Flags, DIType Ty) {
328 // TAG_member is encoded in DIDerivedType format.
329 Value *Elts[] = {
330 GetTagConstant(VMContext, dwarf::DW_TAG_member),
331 getNonCompileUnitScope(Scope),
332 MDString::get(VMContext, Name),
333 File,
334 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
335 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
336 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
337 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
338 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
339 Ty
340 };
341 return DIDerivedType(MDNode::get(VMContext, Elts));
342 }
343
344 /// createStaticMemberType - Create debugging information entry for a
345 /// C++ static data member.
createStaticMemberType(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNumber,DIType Ty,unsigned Flags,llvm::Value * Val)346 DIType DIBuilder::createStaticMemberType(DIDescriptor Scope, StringRef Name,
347 DIFile File, unsigned LineNumber,
348 DIType Ty, unsigned Flags,
349 llvm::Value *Val) {
350 // TAG_member is encoded in DIDerivedType format.
351 Flags |= DIDescriptor::FlagStaticMember;
352 Value *Elts[] = {
353 GetTagConstant(VMContext, dwarf::DW_TAG_member),
354 getNonCompileUnitScope(Scope),
355 MDString::get(VMContext, Name),
356 File,
357 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
358 ConstantInt::get(Type::getInt64Ty(VMContext), 0/*SizeInBits*/),
359 ConstantInt::get(Type::getInt64Ty(VMContext), 0/*AlignInBits*/),
360 ConstantInt::get(Type::getInt64Ty(VMContext), 0/*OffsetInBits*/),
361 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
362 Ty,
363 Val
364 };
365 return DIType(MDNode::get(VMContext, Elts));
366 }
367
368 /// createObjCIVar - Create debugging information entry for Objective-C
369 /// instance variable.
createObjCIVar(StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType Ty,StringRef PropertyName,StringRef GetterName,StringRef SetterName,unsigned PropertyAttributes)370 DIType DIBuilder::createObjCIVar(StringRef Name,
371 DIFile File, unsigned LineNumber,
372 uint64_t SizeInBits, uint64_t AlignInBits,
373 uint64_t OffsetInBits, unsigned Flags,
374 DIType Ty, StringRef PropertyName,
375 StringRef GetterName, StringRef SetterName,
376 unsigned PropertyAttributes) {
377 // TAG_member is encoded in DIDerivedType format.
378 Value *Elts[] = {
379 GetTagConstant(VMContext, dwarf::DW_TAG_member),
380 getNonCompileUnitScope(File),
381 MDString::get(VMContext, Name),
382 File,
383 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
384 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
385 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
386 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
387 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
388 Ty,
389 MDString::get(VMContext, PropertyName),
390 MDString::get(VMContext, GetterName),
391 MDString::get(VMContext, SetterName),
392 ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
393 };
394 return DIType(MDNode::get(VMContext, Elts));
395 }
396
397 /// createObjCIVar - Create debugging information entry for Objective-C
398 /// instance variable.
createObjCIVar(StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType Ty,MDNode * PropertyNode)399 DIType DIBuilder::createObjCIVar(StringRef Name,
400 DIFile File, unsigned LineNumber,
401 uint64_t SizeInBits, uint64_t AlignInBits,
402 uint64_t OffsetInBits, unsigned Flags,
403 DIType Ty, MDNode *PropertyNode) {
404 // TAG_member is encoded in DIDerivedType format.
405 Value *Elts[] = {
406 GetTagConstant(VMContext, dwarf::DW_TAG_member),
407 getNonCompileUnitScope(File),
408 MDString::get(VMContext, Name),
409 File,
410 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
411 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
412 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
413 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
414 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
415 Ty,
416 PropertyNode
417 };
418 return DIType(MDNode::get(VMContext, Elts));
419 }
420
421 /// createObjCProperty - Create debugging information entry for Objective-C
422 /// property.
createObjCProperty(StringRef Name,DIFile File,unsigned LineNumber,StringRef GetterName,StringRef SetterName,unsigned PropertyAttributes,DIType Ty)423 DIObjCProperty DIBuilder::createObjCProperty(StringRef Name,
424 DIFile File, unsigned LineNumber,
425 StringRef GetterName,
426 StringRef SetterName,
427 unsigned PropertyAttributes,
428 DIType Ty) {
429 Value *Elts[] = {
430 GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property),
431 MDString::get(VMContext, Name),
432 File,
433 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
434 MDString::get(VMContext, GetterName),
435 MDString::get(VMContext, SetterName),
436 ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
437 Ty
438 };
439 return DIObjCProperty(MDNode::get(VMContext, Elts));
440 }
441
442 /// createTemplateTypeParameter - Create debugging information for template
443 /// type parameter.
444 DITemplateTypeParameter
createTemplateTypeParameter(DIDescriptor Context,StringRef Name,DIType Ty,MDNode * File,unsigned LineNo,unsigned ColumnNo)445 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
446 DIType Ty, MDNode *File, unsigned LineNo,
447 unsigned ColumnNo) {
448 Value *Elts[] = {
449 GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
450 getNonCompileUnitScope(Context),
451 MDString::get(VMContext, Name),
452 Ty,
453 File,
454 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
455 ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
456 };
457 return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
458 }
459
460 /// createTemplateValueParameter - Create debugging information for template
461 /// value parameter.
462 DITemplateValueParameter
createTemplateValueParameter(DIDescriptor Context,StringRef Name,DIType Ty,uint64_t Val,MDNode * File,unsigned LineNo,unsigned ColumnNo)463 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
464 DIType Ty, uint64_t Val,
465 MDNode *File, unsigned LineNo,
466 unsigned ColumnNo) {
467 Value *Elts[] = {
468 GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter),
469 getNonCompileUnitScope(Context),
470 MDString::get(VMContext, Name),
471 Ty,
472 ConstantInt::get(Type::getInt64Ty(VMContext), Val),
473 File,
474 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
475 ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
476 };
477 return DITemplateValueParameter(MDNode::get(VMContext, Elts));
478 }
479
480 /// createClassType - Create debugging information entry for a class.
createClassType(DIDescriptor Context,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType DerivedFrom,DIArray Elements,MDNode * VTableHolder,MDNode * TemplateParams)481 DIType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
482 DIFile File, unsigned LineNumber,
483 uint64_t SizeInBits, uint64_t AlignInBits,
484 uint64_t OffsetInBits, unsigned Flags,
485 DIType DerivedFrom, DIArray Elements,
486 MDNode *VTableHolder,
487 MDNode *TemplateParams) {
488 assert((!Context || Context.Verify()) &&
489 "createClassType should be called with a valid Context");
490 // TAG_class_type is encoded in DICompositeType format.
491 Value *Elts[] = {
492 GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
493 getNonCompileUnitScope(Context),
494 MDString::get(VMContext, Name),
495 File,
496 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
497 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
498 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
499 ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
500 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
501 DerivedFrom,
502 Elements,
503 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
504 VTableHolder,
505 TemplateParams
506 };
507 DIType R(MDNode::get(VMContext, Elts));
508 assert(R.Verify() && "createClassType should return a verifiable DIType");
509 return R;
510 }
511
512 /// createStructType - Create debugging information entry for a struct.
createStructType(DIDescriptor Context,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Flags,DIType DerivedFrom,DIArray Elements,unsigned RunTimeLang,MDNode * VTableHolder)513 DICompositeType DIBuilder::createStructType(DIDescriptor Context,
514 StringRef Name, DIFile File,
515 unsigned LineNumber,
516 uint64_t SizeInBits,
517 uint64_t AlignInBits,
518 unsigned Flags, DIType DerivedFrom,
519 DIArray Elements,
520 unsigned RunTimeLang,
521 MDNode *VTableHolder) {
522 // TAG_structure_type is encoded in DICompositeType format.
523 Value *Elts[] = {
524 GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
525 getNonCompileUnitScope(Context),
526 MDString::get(VMContext, Name),
527 File,
528 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
529 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
530 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
531 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
532 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
533 DerivedFrom,
534 Elements,
535 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
536 VTableHolder,
537 NULL,
538 };
539 DICompositeType R(MDNode::get(VMContext, Elts));
540 assert(R.Verify() && "createStructType should return a verifiable DIType");
541 return R;
542 }
543
544 /// createUnionType - Create debugging information entry for an union.
createUnionType(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Flags,DIArray Elements,unsigned RunTimeLang)545 DICompositeType DIBuilder::createUnionType(
546 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
547 uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags, DIArray Elements,
548 unsigned RunTimeLang) {
549 // TAG_union_type is encoded in DICompositeType format.
550 Value *Elts[] = {
551 GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
552 getNonCompileUnitScope(Scope),
553 MDString::get(VMContext, Name),
554 File,
555 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
556 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
557 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
558 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
559 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
560 NULL,
561 Elements,
562 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
563 Constant::getNullValue(Type::getInt32Ty(VMContext))
564 };
565 return DICompositeType(MDNode::get(VMContext, Elts));
566 }
567
568 /// createSubroutineType - Create subroutine type.
569 DICompositeType
createSubroutineType(DIFile File,DIArray ParameterTypes)570 DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
571 // TAG_subroutine_type is encoded in DICompositeType format.
572 Value *Elts[] = {
573 GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
574 Constant::getNullValue(Type::getInt32Ty(VMContext)),
575 MDString::get(VMContext, ""),
576 Constant::getNullValue(Type::getInt32Ty(VMContext)),
577 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
578 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
579 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
580 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
581 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
582 NULL,
583 ParameterTypes,
584 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
585 Constant::getNullValue(Type::getInt32Ty(VMContext))
586 };
587 return DICompositeType(MDNode::get(VMContext, Elts));
588 }
589
590 /// createEnumerationType - Create debugging information entry for an
591 /// enumeration.
createEnumerationType(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,DIArray Elements,DIType ClassType)592 DICompositeType DIBuilder::createEnumerationType(
593 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
594 uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
595 DIType ClassType) {
596 // TAG_enumeration_type is encoded in DICompositeType format.
597 Value *Elts[] = {
598 GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
599 getNonCompileUnitScope(Scope),
600 MDString::get(VMContext, Name),
601 File,
602 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
603 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
604 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
605 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
606 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
607 ClassType,
608 Elements,
609 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
610 Constant::getNullValue(Type::getInt32Ty(VMContext))
611 };
612 MDNode *Node = MDNode::get(VMContext, Elts);
613 AllEnumTypes.push_back(Node);
614 return DICompositeType(Node);
615 }
616
617 /// createArrayType - Create debugging information entry for an array.
createArrayType(uint64_t Size,uint64_t AlignInBits,DIType Ty,DIArray Subscripts)618 DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
619 DIType Ty, DIArray Subscripts) {
620 // TAG_array_type is encoded in DICompositeType format.
621 Value *Elts[] = {
622 GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
623 NULL, //TheCU,
624 MDString::get(VMContext, ""),
625 NULL, //TheCU,
626 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
627 ConstantInt::get(Type::getInt64Ty(VMContext), Size),
628 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
629 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
630 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
631 Ty,
632 Subscripts,
633 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
634 Constant::getNullValue(Type::getInt32Ty(VMContext))
635 };
636 return DICompositeType(MDNode::get(VMContext, Elts));
637 }
638
639 /// createVectorType - Create debugging information entry for a vector.
createVectorType(uint64_t Size,uint64_t AlignInBits,DIType Ty,DIArray Subscripts)640 DIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
641 DIType Ty, DIArray Subscripts) {
642
643 // A vector is an array type with the FlagVector flag applied.
644 Value *Elts[] = {
645 GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
646 NULL, //TheCU,
647 MDString::get(VMContext, ""),
648 NULL, //TheCU,
649 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
650 ConstantInt::get(Type::getInt64Ty(VMContext), Size),
651 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
652 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
653 ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector),
654 Ty,
655 Subscripts,
656 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
657 Constant::getNullValue(Type::getInt32Ty(VMContext))
658 };
659 return DIType(MDNode::get(VMContext, Elts));
660 }
661
662 /// createArtificialType - Create a new DIType with "artificial" flag set.
createArtificialType(DIType Ty)663 DIType DIBuilder::createArtificialType(DIType Ty) {
664 if (Ty.isArtificial())
665 return Ty;
666
667 SmallVector<Value *, 9> Elts;
668 MDNode *N = Ty;
669 assert (N && "Unexpected input DIType!");
670 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
671 if (Value *V = N->getOperand(i))
672 Elts.push_back(V);
673 else
674 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
675 }
676
677 unsigned CurFlags = Ty.getFlags();
678 CurFlags = CurFlags | DIType::FlagArtificial;
679
680 // Flags are stored at this slot.
681 Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
682
683 return DIType(MDNode::get(VMContext, Elts));
684 }
685
686 /// createObjectPointerType - Create a new type with both the object pointer
687 /// and artificial flags set.
createObjectPointerType(DIType Ty)688 DIType DIBuilder::createObjectPointerType(DIType Ty) {
689 if (Ty.isObjectPointer())
690 return Ty;
691
692 SmallVector<Value *, 9> Elts;
693 MDNode *N = Ty;
694 assert (N && "Unexpected input DIType!");
695 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
696 if (Value *V = N->getOperand(i))
697 Elts.push_back(V);
698 else
699 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
700 }
701
702 unsigned CurFlags = Ty.getFlags();
703 CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial);
704
705 // Flags are stored at this slot.
706 Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
707
708 return DIType(MDNode::get(VMContext, Elts));
709 }
710
711 /// retainType - Retain DIType in a module even if it is not referenced
712 /// through debug info anchors.
retainType(DIType T)713 void DIBuilder::retainType(DIType T) {
714 AllRetainTypes.push_back(T);
715 }
716
717 /// createUnspecifiedParameter - Create unspeicified type descriptor
718 /// for the subroutine type.
createUnspecifiedParameter()719 DIDescriptor DIBuilder::createUnspecifiedParameter() {
720 Value *Elts[] = {
721 GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
722 };
723 return DIDescriptor(MDNode::get(VMContext, Elts));
724 }
725
726 /// createTemporaryType - Create a temporary forward-declared type.
createTemporaryType()727 DIType DIBuilder::createTemporaryType() {
728 // Give the temporary MDNode a tag. It doesn't matter what tag we
729 // use here as long as DIType accepts it.
730 Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
731 MDNode *Node = MDNode::getTemporary(VMContext, Elts);
732 return DIType(Node);
733 }
734
735 /// createTemporaryType - Create a temporary forward-declared type.
createTemporaryType(DIFile F)736 DIType DIBuilder::createTemporaryType(DIFile F) {
737 // Give the temporary MDNode a tag. It doesn't matter what tag we
738 // use here as long as DIType accepts it.
739 Value *Elts[] = {
740 GetTagConstant(VMContext, DW_TAG_base_type),
741 TheCU,
742 NULL,
743 F
744 };
745 MDNode *Node = MDNode::getTemporary(VMContext, Elts);
746 return DIType(Node);
747 }
748
749 /// createForwardDecl - Create a temporary forward-declared type that
750 /// can be RAUW'd if the full type is seen.
createForwardDecl(unsigned Tag,StringRef Name,DIDescriptor Scope,DIFile F,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint64_t AlignInBits)751 DIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name,
752 DIDescriptor Scope, DIFile F,
753 unsigned Line, unsigned RuntimeLang,
754 uint64_t SizeInBits,
755 uint64_t AlignInBits) {
756 // Create a temporary MDNode.
757 Value *Elts[] = {
758 GetTagConstant(VMContext, Tag),
759 getNonCompileUnitScope(Scope),
760 MDString::get(VMContext, Name),
761 F,
762 ConstantInt::get(Type::getInt32Ty(VMContext), Line),
763 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
764 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
765 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
766 ConstantInt::get(Type::getInt32Ty(VMContext),
767 DIDescriptor::FlagFwdDecl),
768 NULL,
769 DIArray(),
770 ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)
771 };
772 MDNode *Node = MDNode::getTemporary(VMContext, Elts);
773 assert(DIType(Node).Verify() &&
774 "createForwardDecl result should be verifiable");
775 return DIType(Node);
776 }
777
778 /// getOrCreateArray - Get a DIArray, create one if required.
getOrCreateArray(ArrayRef<Value * > Elements)779 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
780 if (Elements.empty()) {
781 Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext));
782 return DIArray(MDNode::get(VMContext, Null));
783 }
784 return DIArray(MDNode::get(VMContext, Elements));
785 }
786
787 /// getOrCreateSubrange - Create a descriptor for a value range. This
788 /// implicitly uniques the values returned.
getOrCreateSubrange(int64_t Lo,int64_t Count)789 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
790 Value *Elts[] = {
791 GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
792 ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
793 ConstantInt::get(Type::getInt64Ty(VMContext), Count)
794 };
795
796 return DISubrange(MDNode::get(VMContext, Elts));
797 }
798
799 /// createGlobalVariable - Create a new descriptor for the specified global.
800 DIGlobalVariable DIBuilder::
createGlobalVariable(StringRef Name,DIFile F,unsigned LineNumber,DIType Ty,bool isLocalToUnit,Value * Val)801 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
802 DIType Ty, bool isLocalToUnit, Value *Val) {
803 Value *Elts[] = {
804 GetTagConstant(VMContext, dwarf::DW_TAG_variable),
805 Constant::getNullValue(Type::getInt32Ty(VMContext)),
806 NULL, // TheCU,
807 MDString::get(VMContext, Name),
808 MDString::get(VMContext, Name),
809 MDString::get(VMContext, Name),
810 F,
811 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
812 Ty,
813 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
814 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
815 Val,
816 DIDescriptor()
817 };
818 MDNode *Node = MDNode::get(VMContext, Elts);
819 AllGVs.push_back(Node);
820 return DIGlobalVariable(Node);
821 }
822
823 /// createStaticVariable - Create a new descriptor for the specified static
824 /// variable.
825 DIGlobalVariable DIBuilder::
createStaticVariable(DIDescriptor Context,StringRef Name,StringRef LinkageName,DIFile F,unsigned LineNumber,DIType Ty,bool isLocalToUnit,Value * Val,MDNode * Decl)826 createStaticVariable(DIDescriptor Context, StringRef Name,
827 StringRef LinkageName, DIFile F, unsigned LineNumber,
828 DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) {
829 Value *Elts[] = {
830 GetTagConstant(VMContext, dwarf::DW_TAG_variable),
831 Constant::getNullValue(Type::getInt32Ty(VMContext)),
832 getNonCompileUnitScope(Context),
833 MDString::get(VMContext, Name),
834 MDString::get(VMContext, Name),
835 MDString::get(VMContext, LinkageName),
836 F,
837 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
838 Ty,
839 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
840 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
841 Val,
842 DIDescriptor(Decl)
843 };
844 MDNode *Node = MDNode::get(VMContext, Elts);
845 AllGVs.push_back(Node);
846 return DIGlobalVariable(Node);
847 }
848
849 /// createVariable - Create a new descriptor for the specified variable.
createLocalVariable(unsigned Tag,DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNo,DIType Ty,bool AlwaysPreserve,unsigned Flags,unsigned ArgNo)850 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
851 StringRef Name, DIFile File,
852 unsigned LineNo, DIType Ty,
853 bool AlwaysPreserve, unsigned Flags,
854 unsigned ArgNo) {
855 DIDescriptor Context(getNonCompileUnitScope(Scope));
856 assert((!Context || Context.Verify()) &&
857 "createLocalVariable should be called with a valid Context");
858 assert(Ty.Verify() &&
859 "createLocalVariable should be called with a valid type");
860 Value *Elts[] = {
861 GetTagConstant(VMContext, Tag),
862 getNonCompileUnitScope(Scope),
863 MDString::get(VMContext, Name),
864 File,
865 ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
866 Ty,
867 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
868 Constant::getNullValue(Type::getInt32Ty(VMContext))
869 };
870 MDNode *Node = MDNode::get(VMContext, Elts);
871 if (AlwaysPreserve) {
872 // The optimizer may remove local variable. If there is an interest
873 // to preserve variable info in such situation then stash it in a
874 // named mdnode.
875 DISubprogram Fn(getDISubprogram(Scope));
876 NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
877 FnLocals->addOperand(Node);
878 }
879 assert(DIVariable(Node).Verify() &&
880 "createLocalVariable should return a verifiable DIVariable");
881 return DIVariable(Node);
882 }
883
884 /// createComplexVariable - Create a new descriptor for the specified variable
885 /// which has a complex address expression for its address.
createComplexVariable(unsigned Tag,DIDescriptor Scope,StringRef Name,DIFile F,unsigned LineNo,DIType Ty,ArrayRef<Value * > Addr,unsigned ArgNo)886 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
887 StringRef Name, DIFile F,
888 unsigned LineNo,
889 DIType Ty, ArrayRef<Value *> Addr,
890 unsigned ArgNo) {
891 SmallVector<Value *, 15> Elts;
892 Elts.push_back(GetTagConstant(VMContext, Tag));
893 Elts.push_back(getNonCompileUnitScope(Scope)),
894 Elts.push_back(MDString::get(VMContext, Name));
895 Elts.push_back(F);
896 Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
897 (LineNo | (ArgNo << 24))));
898 Elts.push_back(Ty);
899 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
900 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
901 Elts.append(Addr.begin(), Addr.end());
902
903 return DIVariable(MDNode::get(VMContext, Elts));
904 }
905
906 /// createFunction - Create a new descriptor for the specified function.
createFunction(DIDescriptor Context,StringRef Name,StringRef LinkageName,DIFile File,unsigned LineNo,DIType Ty,bool isLocalToUnit,bool isDefinition,unsigned ScopeLine,unsigned Flags,bool isOptimized,Function * Fn,MDNode * TParams,MDNode * Decl)907 DISubprogram DIBuilder::createFunction(DIDescriptor Context,
908 StringRef Name,
909 StringRef LinkageName,
910 DIFile File, unsigned LineNo,
911 DIType Ty,
912 bool isLocalToUnit, bool isDefinition,
913 unsigned ScopeLine,
914 unsigned Flags, bool isOptimized,
915 Function *Fn,
916 MDNode *TParams,
917 MDNode *Decl) {
918 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
919 Value *Elts[] = {
920 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
921 Constant::getNullValue(Type::getInt32Ty(VMContext)),
922 getNonCompileUnitScope(Context),
923 MDString::get(VMContext, Name),
924 MDString::get(VMContext, Name),
925 MDString::get(VMContext, LinkageName),
926 File,
927 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
928 Ty,
929 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
930 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
931 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
932 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
933 NULL,
934 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
935 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
936 Fn,
937 TParams,
938 Decl,
939 MDNode::getTemporary(VMContext, TElts),
940 ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
941 };
942 MDNode *Node = MDNode::get(VMContext, Elts);
943
944 // Create a named metadata so that we do not lose this mdnode.
945 if (isDefinition)
946 AllSubprograms.push_back(Node);
947 return DISubprogram(Node);
948 }
949
950 /// createMethod - Create a new descriptor for the specified C++ method.
createMethod(DIDescriptor Context,StringRef Name,StringRef LinkageName,DIFile F,unsigned LineNo,DIType Ty,bool isLocalToUnit,bool isDefinition,unsigned VK,unsigned VIndex,MDNode * VTableHolder,unsigned Flags,bool isOptimized,Function * Fn,MDNode * TParam)951 DISubprogram DIBuilder::createMethod(DIDescriptor Context,
952 StringRef Name,
953 StringRef LinkageName,
954 DIFile F,
955 unsigned LineNo, DIType Ty,
956 bool isLocalToUnit,
957 bool isDefinition,
958 unsigned VK, unsigned VIndex,
959 MDNode *VTableHolder,
960 unsigned Flags,
961 bool isOptimized,
962 Function *Fn,
963 MDNode *TParam) {
964 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
965 Value *Elts[] = {
966 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
967 Constant::getNullValue(Type::getInt32Ty(VMContext)),
968 getNonCompileUnitScope(Context),
969 MDString::get(VMContext, Name),
970 MDString::get(VMContext, Name),
971 MDString::get(VMContext, LinkageName),
972 F,
973 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
974 Ty,
975 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
976 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
977 ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
978 ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
979 VTableHolder,
980 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
981 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
982 Fn,
983 TParam,
984 Constant::getNullValue(Type::getInt32Ty(VMContext)),
985 MDNode::getTemporary(VMContext, TElts),
986 // FIXME: Do we want to use different scope/lines?
987 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
988 };
989 MDNode *Node = MDNode::get(VMContext, Elts);
990 if (isDefinition)
991 AllSubprograms.push_back(Node);
992 return DISubprogram(Node);
993 }
994
995 /// createNameSpace - This creates new descriptor for a namespace
996 /// with the specified parent scope.
createNameSpace(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNo)997 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
998 DIFile File, unsigned LineNo) {
999 Value *Elts[] = {
1000 GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
1001 getNonCompileUnitScope(Scope),
1002 MDString::get(VMContext, Name),
1003 File,
1004 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1005 };
1006 DINameSpace R(MDNode::get(VMContext, Elts));
1007 assert(R.Verify() &&
1008 "createNameSpace should return a verifiable DINameSpace");
1009 return R;
1010 }
1011
1012 /// createLexicalBlockFile - This creates a new MDNode that encapsulates
1013 /// an existing scope with a new filename.
createLexicalBlockFile(DIDescriptor Scope,DIFile File)1014 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
1015 DIFile File) {
1016 Value *Elts[] = {
1017 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1018 Scope,
1019 File
1020 };
1021 DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1022 assert(
1023 R.Verify() &&
1024 "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1025 return R;
1026 }
1027
createLexicalBlock(DIDescriptor Scope,DIFile File,unsigned Line,unsigned Col)1028 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
1029 unsigned Line, unsigned Col) {
1030 // Defeat MDNode uniqing for lexical blocks by using unique id.
1031 static unsigned int unique_id = 0;
1032 Value *Elts[] = {
1033 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1034 getNonCompileUnitScope(Scope),
1035 ConstantInt::get(Type::getInt32Ty(VMContext), Line),
1036 ConstantInt::get(Type::getInt32Ty(VMContext), Col),
1037 File,
1038 ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
1039 };
1040 DILexicalBlock R(MDNode::get(VMContext, Elts));
1041 assert(R.Verify() &&
1042 "createLexicalBlock should return a verifiable DILexicalBlock");
1043 return R;
1044 }
1045
1046 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
insertDeclare(Value * Storage,DIVariable VarInfo,Instruction * InsertBefore)1047 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1048 Instruction *InsertBefore) {
1049 assert(Storage && "no storage passed to dbg.declare");
1050 assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare");
1051 if (!DeclareFn)
1052 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1053
1054 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1055 return CallInst::Create(DeclareFn, Args, "", InsertBefore);
1056 }
1057
1058 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
insertDeclare(Value * Storage,DIVariable VarInfo,BasicBlock * InsertAtEnd)1059 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1060 BasicBlock *InsertAtEnd) {
1061 assert(Storage && "no storage passed to dbg.declare");
1062 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare");
1063 if (!DeclareFn)
1064 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1065
1066 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1067
1068 // If this block already has a terminator then insert this intrinsic
1069 // before the terminator.
1070 if (TerminatorInst *T = InsertAtEnd->getTerminator())
1071 return CallInst::Create(DeclareFn, Args, "", T);
1072 else
1073 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
1074 }
1075
1076 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
insertDbgValueIntrinsic(Value * V,uint64_t Offset,DIVariable VarInfo,Instruction * InsertBefore)1077 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1078 DIVariable VarInfo,
1079 Instruction *InsertBefore) {
1080 assert(V && "no value passed to dbg.value");
1081 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
1082 if (!ValueFn)
1083 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1084
1085 Value *Args[] = { MDNode::get(V->getContext(), V),
1086 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1087 VarInfo };
1088 return CallInst::Create(ValueFn, Args, "", InsertBefore);
1089 }
1090
1091 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
insertDbgValueIntrinsic(Value * V,uint64_t Offset,DIVariable VarInfo,BasicBlock * InsertAtEnd)1092 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1093 DIVariable VarInfo,
1094 BasicBlock *InsertAtEnd) {
1095 assert(V && "no value passed to dbg.value");
1096 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
1097 if (!ValueFn)
1098 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1099
1100 Value *Args[] = { MDNode::get(V->getContext(), V),
1101 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1102 VarInfo };
1103 return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1104 }
1105