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