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