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