TargetRegistry: Change AsmPrinter constructor to be typed as returning an
[oota-llvm.git] / lib / Analysis / DebugInfo.cpp
1 //===--- DebugInfo.cpp - Debug Information Helper Classes -----------------===//
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 helper classes used to build and interpret debug
11 // information in LLVM IR form.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/Analysis/DebugInfo.h"
16 #include "llvm/Constants.h"
17 #include "llvm/DerivedTypes.h"
18 #include "llvm/Intrinsics.h"
19 #include "llvm/IntrinsicInst.h"
20 #include "llvm/Instructions.h"
21 #include "llvm/LLVMContext.h"
22 #include "llvm/Module.h"
23 #include "llvm/Analysis/ValueTracking.h"
24 #include "llvm/Support/Dwarf.h"
25 #include "llvm/Support/DebugLoc.h"
26 #include "llvm/Support/Streams.h"
27
28 using namespace llvm;
29 using namespace llvm::dwarf;
30
31 //===----------------------------------------------------------------------===//
32 // DIDescriptor
33 //===----------------------------------------------------------------------===//
34
35 /// ValidDebugInfo - Return true if V represents valid debug info value.
36 bool DIDescriptor::ValidDebugInfo(Value *V, CodeGenOpt::Level OptLevel) {
37   if (!V)
38     return false;
39
40   GlobalVariable *GV = dyn_cast<GlobalVariable>(V->stripPointerCasts());
41   if (!GV)
42     return false;
43
44   if (!GV->hasInternalLinkage () && !GV->hasLinkOnceLinkage())
45     return false;
46
47   DIDescriptor DI(GV);
48
49   // Check current version. Allow Version6 for now.
50   unsigned Version = DI.getVersion();
51   if (Version != LLVMDebugVersion && Version != LLVMDebugVersion6)
52     return false;
53
54   unsigned Tag = DI.getTag();
55   switch (Tag) {
56   case DW_TAG_variable:
57     assert(DIVariable(GV).Verify() && "Invalid DebugInfo value");
58     break;
59   case DW_TAG_compile_unit:
60     assert(DICompileUnit(GV).Verify() && "Invalid DebugInfo value");
61     break;
62   case DW_TAG_subprogram:
63     assert(DISubprogram(GV).Verify() && "Invalid DebugInfo value");
64     break;
65   case DW_TAG_lexical_block:
66     // FIXME: This interfers with the quality of generated code during
67     // optimization.
68     if (OptLevel != CodeGenOpt::None)
69       return false;
70     // FALLTHROUGH
71   default:
72     break;
73   }
74
75   return true;
76 }
77
78 DIDescriptor::DIDescriptor(GlobalVariable *GV, unsigned RequiredTag) {
79   DbgGV = GV;
80   
81   // If this is non-null, check to see if the Tag matches. If not, set to null.
82   if (GV && getTag() != RequiredTag)
83     DbgGV = 0;
84 }
85
86 const std::string &
87 DIDescriptor::getStringField(unsigned Elt, std::string &Result) const {
88   if (DbgGV == 0) {
89     Result.clear();
90     return Result;
91   }
92
93   Constant *C = DbgGV->getInitializer();
94   if (C == 0 || Elt >= C->getNumOperands()) {
95     Result.clear();
96     return Result;
97   }
98
99   // Fills in the string if it succeeds
100   if (!GetConstantStringInfo(C->getOperand(Elt), Result))
101     Result.clear();
102
103   return Result;
104 }
105
106 uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const {
107   if (DbgGV == 0) return 0;
108   if (!DbgGV->hasInitializer()) return 0;
109
110   Constant *C = DbgGV->getInitializer();
111   if (C == 0 || Elt >= C->getNumOperands())
112     return 0;
113
114   if (ConstantInt *CI = dyn_cast<ConstantInt>(C->getOperand(Elt)))
115     return CI->getZExtValue();
116   return 0;
117 }
118
119 DIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const {
120   if (DbgGV == 0) return DIDescriptor();
121
122   Constant *C = DbgGV->getInitializer();
123   if (C == 0 || Elt >= C->getNumOperands())
124     return DIDescriptor();
125
126   C = C->getOperand(Elt);
127   return DIDescriptor(dyn_cast<GlobalVariable>(C->stripPointerCasts()));
128 }
129
130 GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const {
131   if (DbgGV == 0) return 0;
132
133   Constant *C = DbgGV->getInitializer();
134   if (C == 0 || Elt >= C->getNumOperands())
135     return 0;
136
137   C = C->getOperand(Elt);
138   return dyn_cast<GlobalVariable>(C->stripPointerCasts());
139 }
140
141 //===----------------------------------------------------------------------===//
142 // Simple Descriptor Constructors and other Methods
143 //===----------------------------------------------------------------------===//
144
145 // Needed by DIVariable::getType().
146 DIType::DIType(GlobalVariable *GV) : DIDescriptor(GV) {
147   if (!GV) return;
148   unsigned tag = getTag();
149   if (tag != dwarf::DW_TAG_base_type && !DIDerivedType::isDerivedType(tag) &&
150       !DICompositeType::isCompositeType(tag))
151     DbgGV = 0;
152 }
153
154 /// isDerivedType - Return true if the specified tag is legal for
155 /// DIDerivedType.
156 bool DIType::isDerivedType(unsigned Tag) {
157   switch (Tag) {
158   case dwarf::DW_TAG_typedef:
159   case dwarf::DW_TAG_pointer_type:
160   case dwarf::DW_TAG_reference_type:
161   case dwarf::DW_TAG_const_type:
162   case dwarf::DW_TAG_volatile_type:
163   case dwarf::DW_TAG_restrict_type:
164   case dwarf::DW_TAG_member:
165   case dwarf::DW_TAG_inheritance:
166     return true;
167   default:
168     // FIXME: Even though it doesn't make sense, CompositeTypes are current
169     // modelled as DerivedTypes, this should return true for them as well.
170     return false;
171   }
172 }
173
174 /// isCompositeType - Return true if the specified tag is legal for
175 /// DICompositeType.
176 bool DIType::isCompositeType(unsigned TAG) {
177   switch (TAG) {
178   case dwarf::DW_TAG_array_type:
179   case dwarf::DW_TAG_structure_type:
180   case dwarf::DW_TAG_union_type:
181   case dwarf::DW_TAG_enumeration_type:
182   case dwarf::DW_TAG_vector_type:
183   case dwarf::DW_TAG_subroutine_type:
184   case dwarf::DW_TAG_class_type:
185     return true;
186   default:
187     return false;
188   }
189 }
190
191 /// isVariable - Return true if the specified tag is legal for DIVariable.
192 bool DIVariable::isVariable(unsigned Tag) {
193   switch (Tag) {
194   case dwarf::DW_TAG_auto_variable:
195   case dwarf::DW_TAG_arg_variable:
196   case dwarf::DW_TAG_return_variable:
197     return true;
198   default:
199     return false;
200   }
201 }
202
203 unsigned DIArray::getNumElements() const {
204   assert (DbgGV && "Invalid DIArray");
205   Constant *C = DbgGV->getInitializer();
206   assert (C && "Invalid DIArray initializer");
207   return C->getNumOperands();
208 }
209
210 /// replaceAllUsesWith - Replace all uses of debug info referenced by
211 /// this descriptor. After this completes, the current debug info value
212 /// is erased.
213 void DIDerivedType::replaceAllUsesWith(DIDescriptor &D) {
214   if (isNull())
215     return;
216
217   assert (!D.isNull() && "Can not replace with null");
218   getGV()->replaceAllUsesWith(D.getGV());
219   getGV()->eraseFromParent();
220 }
221
222 /// Verify - Verify that a compile unit is well formed.
223 bool DICompileUnit::Verify() const {
224   if (isNull()) 
225     return false;
226   std::string Res;
227   if (getFilename(Res).empty()) 
228     return false;
229   // It is possible that directory and produce string is empty.
230   return true;
231 }
232
233 /// Verify - Verify that a type descriptor is well formed.
234 bool DIType::Verify() const {
235   if (isNull()) 
236     return false;
237   if (getContext().isNull()) 
238     return false;
239
240   DICompileUnit CU = getCompileUnit();
241   if (!CU.isNull() && !CU.Verify()) 
242     return false;
243   return true;
244 }
245
246 /// Verify - Verify that a composite type descriptor is well formed.
247 bool DICompositeType::Verify() const {
248   if (isNull()) 
249     return false;
250   if (getContext().isNull()) 
251     return false;
252
253   DICompileUnit CU = getCompileUnit();
254   if (!CU.isNull() && !CU.Verify()) 
255     return false;
256   return true;
257 }
258
259 /// Verify - Verify that a subprogram descriptor is well formed.
260 bool DISubprogram::Verify() const {
261   if (isNull())
262     return false;
263   
264   if (getContext().isNull())
265     return false;
266
267   DICompileUnit CU = getCompileUnit();
268   if (!CU.Verify()) 
269     return false;
270
271   DICompositeType Ty = getType();
272   if (!Ty.isNull() && !Ty.Verify())
273     return false;
274   return true;
275 }
276
277 /// Verify - Verify that a global variable descriptor is well formed.
278 bool DIGlobalVariable::Verify() const {
279   if (isNull())
280     return false;
281   
282   if (getContext().isNull())
283     return false;
284
285   DICompileUnit CU = getCompileUnit();
286   if (!CU.isNull() && !CU.Verify()) 
287     return false;
288
289   DIType Ty = getType();
290   if (!Ty.Verify())
291     return false;
292
293   if (!getGlobal())
294     return false;
295
296   return true;
297 }
298
299 /// Verify - Verify that a variable descriptor is well formed.
300 bool DIVariable::Verify() const {
301   if (isNull())
302     return false;
303   
304   if (getContext().isNull())
305     return false;
306
307   DIType Ty = getType();
308   if (!Ty.Verify())
309     return false;
310
311   return true;
312 }
313
314 /// getOriginalTypeSize - If this type is derived from a base type then
315 /// return base type size.
316 uint64_t DIDerivedType::getOriginalTypeSize() const {
317   if (getTag() != dwarf::DW_TAG_member)
318     return getSizeInBits();
319   DIType BT = getTypeDerivedFrom();
320   if (BT.getTag() != dwarf::DW_TAG_base_type)
321     return getSizeInBits();
322   return BT.getSizeInBits();
323 }
324
325 /// describes - Return true if this subprogram provides debugging
326 /// information for the function F.
327 bool DISubprogram::describes(const Function *F) {
328   assert (F && "Invalid function");
329   std::string Name;
330   getLinkageName(Name);
331   if (Name.empty())
332     getName(Name);
333   if (F->getName() == Name)
334     return true;
335   return false;
336 }
337
338 //===----------------------------------------------------------------------===//
339 // DIDescriptor: dump routines for all descriptors.
340 //===----------------------------------------------------------------------===//
341
342
343 /// dump - Print descriptor.
344 void DIDescriptor::dump() const {
345   cerr << "[" << dwarf::TagString(getTag()) << "] ";
346   cerr << std::hex << "[GV:" << DbgGV << "]" << std::dec;
347 }
348
349 /// dump - Print compile unit.
350 void DICompileUnit::dump() const {
351   if (getLanguage())
352     cerr << " [" << dwarf::LanguageString(getLanguage()) << "] ";
353
354   std::string Res1, Res2;
355   cerr << " [" << getDirectory(Res1) << "/" << getFilename(Res2) << " ]";
356 }
357
358 /// dump - Print type.
359 void DIType::dump() const {
360   if (isNull()) return;
361
362   std::string Res;
363   if (!getName(Res).empty())
364     cerr << " [" << Res << "] ";
365
366   unsigned Tag = getTag();
367   cerr << " [" << dwarf::TagString(Tag) << "] ";
368
369   // TODO : Print context
370   getCompileUnit().dump();
371   cerr << " [" 
372        << getLineNumber() << ", " 
373        << getSizeInBits() << ", "
374        << getAlignInBits() << ", "
375        << getOffsetInBits() 
376        << "] ";
377
378   if (isPrivate()) 
379     cerr << " [private] ";
380   else if (isProtected())
381     cerr << " [protected] ";
382
383   if (isForwardDecl())
384     cerr << " [fwd] ";
385
386   if (isBasicType(Tag))
387     DIBasicType(DbgGV).dump();
388   else if (isDerivedType(Tag))
389     DIDerivedType(DbgGV).dump();
390   else if (isCompositeType(Tag))
391     DICompositeType(DbgGV).dump();
392   else {
393     cerr << "Invalid DIType\n";
394     return;
395   }
396
397   cerr << "\n";
398 }
399
400 /// dump - Print basic type.
401 void DIBasicType::dump() const {
402   cerr << " [" << dwarf::AttributeEncodingString(getEncoding()) << "] ";
403 }
404
405 /// dump - Print derived type.
406 void DIDerivedType::dump() const {
407   cerr << "\n\t Derived From: "; getTypeDerivedFrom().dump();
408 }
409
410 /// dump - Print composite type.
411 void DICompositeType::dump() const {
412   DIArray A = getTypeArray();
413   if (A.isNull())
414     return;
415   cerr << " [" << A.getNumElements() << " elements]";
416 }
417
418 /// dump - Print global.
419 void DIGlobal::dump() const {
420   std::string Res;
421   if (!getName(Res).empty())
422     cerr << " [" << Res << "] ";
423
424   unsigned Tag = getTag();
425   cerr << " [" << dwarf::TagString(Tag) << "] ";
426
427   // TODO : Print context
428   getCompileUnit().dump();
429   cerr << " [" << getLineNumber() << "] ";
430
431   if (isLocalToUnit())
432     cerr << " [local] ";
433
434   if (isDefinition())
435     cerr << " [def] ";
436
437   if (isGlobalVariable(Tag))
438     DIGlobalVariable(DbgGV).dump();
439
440   cerr << "\n";
441 }
442
443 /// dump - Print subprogram.
444 void DISubprogram::dump() const {
445   DIGlobal::dump();
446 }
447
448 /// dump - Print global variable.
449 void DIGlobalVariable::dump() const {
450   cerr << " ["; getGlobal()->dump(); cerr << "] ";
451 }
452
453 /// dump - Print variable.
454 void DIVariable::dump() const {
455   std::string Res;
456   if (!getName(Res).empty())
457     cerr << " [" << Res << "] ";
458
459   getCompileUnit().dump();
460   cerr << " [" << getLineNumber() << "] ";
461   getType().dump();
462   cerr << "\n";
463 }
464
465 //===----------------------------------------------------------------------===//
466 // DIFactory: Basic Helpers
467 //===----------------------------------------------------------------------===//
468
469 DIFactory::DIFactory(Module &m)
470   : M(m), VMContext(M.getContext()), StopPointFn(0), FuncStartFn(0), 
471     RegionStartFn(0), RegionEndFn(0),
472     DeclareFn(0) {
473   EmptyStructPtr = PointerType::getUnqual(StructType::get(VMContext));
474 }
475
476 /// getCastToEmpty - Return this descriptor as a Constant* with type '{}*'.
477 /// This is only valid when the descriptor is non-null.
478 Constant *DIFactory::getCastToEmpty(DIDescriptor D) {
479   if (D.isNull()) return llvm::Constant::getNullValue(EmptyStructPtr);
480   return ConstantExpr::getBitCast(D.getGV(), EmptyStructPtr);
481 }
482
483 Constant *DIFactory::GetTagConstant(unsigned TAG) {
484   assert((TAG & LLVMDebugVersionMask) == 0 &&
485          "Tag too large for debug encoding!");
486   return ConstantInt::get(Type::getInt32Ty(VMContext), TAG | LLVMDebugVersion);
487 }
488
489 Constant *DIFactory::GetStringConstant(const std::string &String) {
490   // Check string cache for previous edition.
491   Constant *&Slot = StringCache[String];
492   
493   // Return Constant if previously defined.
494   if (Slot) return Slot;
495   
496   const PointerType *DestTy = PointerType::getUnqual(Type::getInt8Ty(VMContext));
497   
498   // If empty string then use a i8* null instead.
499   if (String.empty())
500     return Slot = ConstantPointerNull::get(DestTy);
501
502   // Construct string as an llvm constant.
503   Constant *ConstStr = ConstantArray::get(VMContext, String);
504     
505   // Otherwise create and return a new string global.
506   GlobalVariable *StrGV = new GlobalVariable(M, ConstStr->getType(), true,
507                                              GlobalVariable::InternalLinkage,
508                                              ConstStr, ".str");
509   StrGV->setSection("llvm.metadata");
510   return Slot = ConstantExpr::getBitCast(StrGV, DestTy);
511 }
512
513 //===----------------------------------------------------------------------===//
514 // DIFactory: Primary Constructors
515 //===----------------------------------------------------------------------===//
516
517 /// GetOrCreateArray - Create an descriptor for an array of descriptors. 
518 /// This implicitly uniques the arrays created.
519 DIArray DIFactory::GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys) {
520   SmallVector<Constant*, 16> Elts;
521   
522   for (unsigned i = 0; i != NumTys; ++i)
523     Elts.push_back(getCastToEmpty(Tys[i]));
524   
525   Constant *Init = ConstantArray::get(ArrayType::get(EmptyStructPtr,
526                                                      Elts.size()),
527                                       Elts.data(), Elts.size());
528   // If we already have this array, just return the uniqued version.
529   DIDescriptor &Entry = SimpleConstantCache[Init];
530   if (!Entry.isNull()) return DIArray(Entry.getGV());
531
532   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
533                                           GlobalValue::InternalLinkage,
534                                           Init, "llvm.dbg.array");
535   GV->setSection("llvm.metadata");
536   Entry = DIDescriptor(GV);
537   return DIArray(GV);
538 }
539
540 /// GetOrCreateSubrange - Create a descriptor for a value range.  This
541 /// implicitly uniques the values returned.
542 DISubrange DIFactory::GetOrCreateSubrange(int64_t Lo, int64_t Hi) {
543   Constant *Elts[] = {
544     GetTagConstant(dwarf::DW_TAG_subrange_type),
545     ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
546     ConstantInt::get(Type::getInt64Ty(VMContext), Hi)
547   };
548   
549   Constant *Init = ConstantStruct::get(VMContext, Elts,
550                                        sizeof(Elts)/sizeof(Elts[0]));
551
552   // If we already have this range, just return the uniqued version.
553   DIDescriptor &Entry = SimpleConstantCache[Init];
554   if (!Entry.isNull()) return DISubrange(Entry.getGV());
555   
556   M.addTypeName("llvm.dbg.subrange.type", Init->getType());
557
558   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
559                                           GlobalValue::InternalLinkage,
560                                           Init, "llvm.dbg.subrange");
561   GV->setSection("llvm.metadata");
562   Entry = DIDescriptor(GV);
563   return DISubrange(GV);
564 }
565
566
567
568 /// CreateCompileUnit - Create a new descriptor for the specified compile
569 /// unit.  Note that this does not unique compile units within the module.
570 DICompileUnit DIFactory::CreateCompileUnit(unsigned LangID,
571                                            const std::string &Filename,
572                                            const std::string &Directory,
573                                            const std::string &Producer,
574                                            bool isMain,
575                                            bool isOptimized,
576                                            const char *Flags,
577                                            unsigned RunTimeVer) {
578   Constant *Elts[] = {
579     GetTagConstant(dwarf::DW_TAG_compile_unit),
580     llvm::Constant::getNullValue(EmptyStructPtr),
581     ConstantInt::get(Type::getInt32Ty(VMContext), LangID),
582     GetStringConstant(Filename),
583     GetStringConstant(Directory),
584     GetStringConstant(Producer),
585     ConstantInt::get(Type::getInt1Ty(VMContext), isMain),
586     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
587     GetStringConstant(Flags),
588     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer)
589   };
590   
591   Constant *Init = ConstantStruct::get(VMContext, Elts,
592                                        sizeof(Elts)/sizeof(Elts[0]));
593   
594   M.addTypeName("llvm.dbg.compile_unit.type", Init->getType());
595   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
596                                           GlobalValue::LinkOnceAnyLinkage,
597                                           Init, "llvm.dbg.compile_unit");
598   GV->setSection("llvm.metadata");
599   return DICompileUnit(GV);
600 }
601
602 /// CreateEnumerator - Create a single enumerator value.
603 DIEnumerator DIFactory::CreateEnumerator(const std::string &Name, uint64_t Val){
604   Constant *Elts[] = {
605     GetTagConstant(dwarf::DW_TAG_enumerator),
606     GetStringConstant(Name),
607     ConstantInt::get(Type::getInt64Ty(VMContext), Val)
608   };
609   
610   Constant *Init = ConstantStruct::get(VMContext, Elts,
611                                        sizeof(Elts)/sizeof(Elts[0]));
612   
613   M.addTypeName("llvm.dbg.enumerator.type", Init->getType());
614   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
615                                           GlobalValue::InternalLinkage,
616                                           Init, "llvm.dbg.enumerator");
617   GV->setSection("llvm.metadata");
618   return DIEnumerator(GV);
619 }
620
621
622 /// CreateBasicType - Create a basic type like int, float, etc.
623 DIBasicType DIFactory::CreateBasicType(DIDescriptor Context,
624                                       const std::string &Name,
625                                        DICompileUnit CompileUnit,
626                                        unsigned LineNumber,
627                                        uint64_t SizeInBits,
628                                        uint64_t AlignInBits,
629                                        uint64_t OffsetInBits, unsigned Flags,
630                                        unsigned Encoding) {
631   Constant *Elts[] = {
632     GetTagConstant(dwarf::DW_TAG_base_type),
633     getCastToEmpty(Context),
634     GetStringConstant(Name),
635     getCastToEmpty(CompileUnit),
636     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
637     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
638     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
639     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
640     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
641     ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
642   };
643   
644   Constant *Init = ConstantStruct::get(VMContext, Elts,
645                                        sizeof(Elts)/sizeof(Elts[0]));
646   
647   M.addTypeName("llvm.dbg.basictype.type", Init->getType());
648   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
649                                           GlobalValue::InternalLinkage,
650                                           Init, "llvm.dbg.basictype");
651   GV->setSection("llvm.metadata");
652   return DIBasicType(GV);
653 }
654
655 /// CreateDerivedType - Create a derived type like const qualified type,
656 /// pointer, typedef, etc.
657 DIDerivedType DIFactory::CreateDerivedType(unsigned Tag,
658                                            DIDescriptor Context,
659                                            const std::string &Name,
660                                            DICompileUnit CompileUnit,
661                                            unsigned LineNumber,
662                                            uint64_t SizeInBits,
663                                            uint64_t AlignInBits,
664                                            uint64_t OffsetInBits,
665                                            unsigned Flags,
666                                            DIType DerivedFrom) {
667   Constant *Elts[] = {
668     GetTagConstant(Tag),
669     getCastToEmpty(Context),
670     GetStringConstant(Name),
671     getCastToEmpty(CompileUnit),
672     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
673     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
674     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
675     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
676     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
677     getCastToEmpty(DerivedFrom)
678   };
679   
680   Constant *Init = ConstantStruct::get(VMContext, Elts,
681                                        sizeof(Elts)/sizeof(Elts[0]));
682   
683   M.addTypeName("llvm.dbg.derivedtype.type", Init->getType());
684   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
685                                           GlobalValue::InternalLinkage,
686                                           Init, "llvm.dbg.derivedtype");
687   GV->setSection("llvm.metadata");
688   return DIDerivedType(GV);
689 }
690
691 /// CreateCompositeType - Create a composite type like array, struct, etc.
692 DICompositeType DIFactory::CreateCompositeType(unsigned Tag,
693                                                DIDescriptor Context,
694                                                const std::string &Name,
695                                                DICompileUnit CompileUnit,
696                                                unsigned LineNumber,
697                                                uint64_t SizeInBits,
698                                                uint64_t AlignInBits,
699                                                uint64_t OffsetInBits,
700                                                unsigned Flags,
701                                                DIType DerivedFrom,
702                                                DIArray Elements,
703                                                unsigned RuntimeLang) {
704
705   Constant *Elts[] = {
706     GetTagConstant(Tag),
707     getCastToEmpty(Context),
708     GetStringConstant(Name),
709     getCastToEmpty(CompileUnit),
710     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
711     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
712     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
713     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
714     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
715     getCastToEmpty(DerivedFrom),
716     getCastToEmpty(Elements),
717     ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)
718   };
719   
720   Constant *Init = ConstantStruct::get(VMContext, Elts,
721                                        sizeof(Elts)/sizeof(Elts[0]));
722   
723   M.addTypeName("llvm.dbg.composite.type", Init->getType());
724   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
725                                           GlobalValue::InternalLinkage,
726                                           Init, "llvm.dbg.composite");
727   GV->setSection("llvm.metadata");
728   return DICompositeType(GV);
729 }
730
731
732 /// CreateSubprogram - Create a new descriptor for the specified subprogram.
733 /// See comments in DISubprogram for descriptions of these fields.  This
734 /// method does not unique the generated descriptors.
735 DISubprogram DIFactory::CreateSubprogram(DIDescriptor Context, 
736                                          const std::string &Name,
737                                          const std::string &DisplayName,
738                                          const std::string &LinkageName,
739                                          DICompileUnit CompileUnit,
740                                          unsigned LineNo, DIType Type,
741                                          bool isLocalToUnit,
742                                          bool isDefinition) {
743
744   Constant *Elts[] = {
745     GetTagConstant(dwarf::DW_TAG_subprogram),
746     llvm::Constant::getNullValue(EmptyStructPtr),
747     getCastToEmpty(Context),
748     GetStringConstant(Name),
749     GetStringConstant(DisplayName),
750     GetStringConstant(LinkageName),
751     getCastToEmpty(CompileUnit),
752     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
753     getCastToEmpty(Type),
754     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
755     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition)
756   };
757   
758   Constant *Init = ConstantStruct::get(VMContext, Elts,
759                                        sizeof(Elts)/sizeof(Elts[0]));
760   
761   M.addTypeName("llvm.dbg.subprogram.type", Init->getType());
762   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
763                                           GlobalValue::LinkOnceAnyLinkage,
764                                           Init, "llvm.dbg.subprogram");
765   GV->setSection("llvm.metadata");
766   return DISubprogram(GV);
767 }
768
769 /// CreateGlobalVariable - Create a new descriptor for the specified global.
770 DIGlobalVariable
771 DIFactory::CreateGlobalVariable(DIDescriptor Context, const std::string &Name,
772                                 const std::string &DisplayName,
773                                 const std::string &LinkageName,
774                                 DICompileUnit CompileUnit,
775                                 unsigned LineNo, DIType Type,bool isLocalToUnit,
776                                 bool isDefinition, llvm::GlobalVariable *Val) {
777   Constant *Elts[] = {
778     GetTagConstant(dwarf::DW_TAG_variable),
779     llvm::Constant::getNullValue(EmptyStructPtr),
780     getCastToEmpty(Context),
781     GetStringConstant(Name),
782     GetStringConstant(DisplayName),
783     GetStringConstant(LinkageName),
784     getCastToEmpty(CompileUnit),
785     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
786     getCastToEmpty(Type),
787     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
788     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
789     ConstantExpr::getBitCast(Val, EmptyStructPtr)
790   };
791   
792   Constant *Init = ConstantStruct::get(VMContext, Elts,
793                                        sizeof(Elts)/sizeof(Elts[0]));
794   
795   M.addTypeName("llvm.dbg.global_variable.type", Init->getType());
796   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
797                                           GlobalValue::LinkOnceAnyLinkage,
798                                           Init, "llvm.dbg.global_variable");
799   GV->setSection("llvm.metadata");
800   return DIGlobalVariable(GV);
801 }
802
803
804 /// CreateVariable - Create a new descriptor for the specified variable.
805 DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,
806                                      const std::string &Name,
807                                      DICompileUnit CompileUnit, unsigned LineNo,
808                                      DIType Type) {
809   Constant *Elts[] = {
810     GetTagConstant(Tag),
811     getCastToEmpty(Context),
812     GetStringConstant(Name),
813     getCastToEmpty(CompileUnit),
814     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
815     getCastToEmpty(Type)
816   };
817   
818   Constant *Init = ConstantStruct::get(VMContext, Elts,
819                                        sizeof(Elts)/sizeof(Elts[0]));
820   
821   M.addTypeName("llvm.dbg.variable.type", Init->getType());
822   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
823                                           GlobalValue::InternalLinkage,
824                                           Init, "llvm.dbg.variable");
825   GV->setSection("llvm.metadata");
826   return DIVariable(GV);
827 }
828
829
830 /// CreateBlock - This creates a descriptor for a lexical block with the
831 /// specified parent VMContext.
832 DIBlock DIFactory::CreateBlock(DIDescriptor Context) {
833   Constant *Elts[] = {
834     GetTagConstant(dwarf::DW_TAG_lexical_block),
835     getCastToEmpty(Context)
836   };
837   
838   Constant *Init = ConstantStruct::get(VMContext, Elts,
839                                        sizeof(Elts)/sizeof(Elts[0]));
840   
841   M.addTypeName("llvm.dbg.block.type", Init->getType());
842   GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true,
843                                           GlobalValue::InternalLinkage,
844                                           Init, "llvm.dbg.block");
845   GV->setSection("llvm.metadata");
846   return DIBlock(GV);
847 }
848
849
850 //===----------------------------------------------------------------------===//
851 // DIFactory: Routines for inserting code into a function
852 //===----------------------------------------------------------------------===//
853
854 /// InsertStopPoint - Create a new llvm.dbg.stoppoint intrinsic invocation,
855 /// inserting it at the end of the specified basic block.
856 void DIFactory::InsertStopPoint(DICompileUnit CU, unsigned LineNo,
857                                 unsigned ColNo, BasicBlock *BB) {
858   
859   // Lazily construct llvm.dbg.stoppoint function.
860   if (!StopPointFn)
861     StopPointFn = llvm::Intrinsic::getDeclaration(&M, 
862                                               llvm::Intrinsic::dbg_stoppoint);
863   
864   // Invoke llvm.dbg.stoppoint
865   Value *Args[] = {
866     ConstantInt::get(llvm::Type::getInt32Ty(VMContext), LineNo),
867     ConstantInt::get(llvm::Type::getInt32Ty(VMContext), ColNo),
868     getCastToEmpty(CU)
869   };
870   CallInst::Create(StopPointFn, Args, Args+3, "", BB);
871 }
872
873 /// InsertSubprogramStart - Create a new llvm.dbg.func.start intrinsic to
874 /// mark the start of the specified subprogram.
875 void DIFactory::InsertSubprogramStart(DISubprogram SP, BasicBlock *BB) {
876   // Lazily construct llvm.dbg.func.start.
877   if (!FuncStartFn)
878     FuncStartFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_func_start);
879   
880   // Call llvm.dbg.func.start which also implicitly sets a stoppoint.
881   CallInst::Create(FuncStartFn, getCastToEmpty(SP), "", BB);
882 }
883
884 /// InsertRegionStart - Insert a new llvm.dbg.region.start intrinsic call to
885 /// mark the start of a region for the specified scoping descriptor.
886 void DIFactory::InsertRegionStart(DIDescriptor D, BasicBlock *BB) {
887   // Lazily construct llvm.dbg.region.start function.
888   if (!RegionStartFn)
889     RegionStartFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_region_start);
890
891   // Call llvm.dbg.func.start.
892   CallInst::Create(RegionStartFn, getCastToEmpty(D), "", BB);
893 }
894
895 /// InsertRegionEnd - Insert a new llvm.dbg.region.end intrinsic call to
896 /// mark the end of a region for the specified scoping descriptor.
897 void DIFactory::InsertRegionEnd(DIDescriptor D, BasicBlock *BB) {
898   // Lazily construct llvm.dbg.region.end function.
899   if (!RegionEndFn)
900     RegionEndFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_region_end);
901
902   // Call llvm.dbg.region.end.
903   CallInst::Create(RegionEndFn, getCastToEmpty(D), "", BB);
904 }
905
906 /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
907 void DIFactory::InsertDeclare(Value *Storage, DIVariable D, BasicBlock *BB) {
908   // Cast the storage to a {}* for the call to llvm.dbg.declare.
909   Storage = new BitCastInst(Storage, EmptyStructPtr, "", BB);
910   
911   if (!DeclareFn)
912     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
913
914   Value *Args[] = { Storage, getCastToEmpty(D) };
915   CallInst::Create(DeclareFn, Args, Args+2, "", BB);
916 }
917
918 //===----------------------------------------------------------------------===//
919 // DebugInfoFinder implementations.
920 //===----------------------------------------------------------------------===//
921
922 /// processModule - Process entire module and collect debug info.
923 void DebugInfoFinder::processModule(Module &M) {
924   
925   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
926     for (Function::iterator FI = (*I).begin(), FE = (*I).end(); FI != FE; ++FI)
927       for (BasicBlock::iterator BI = (*FI).begin(), BE = (*FI).end(); BI != BE;
928            ++BI) {
929         if (DbgStopPointInst *SPI = dyn_cast<DbgStopPointInst>(BI))
930           processStopPoint(SPI);
931         else if (DbgFuncStartInst *FSI = dyn_cast<DbgFuncStartInst>(BI))
932           processFuncStart(FSI);
933         else if (DbgRegionStartInst *DRS = dyn_cast<DbgRegionStartInst>(BI))
934           processRegionStart(DRS);
935         else if (DbgRegionEndInst *DRE = dyn_cast<DbgRegionEndInst>(BI))
936           processRegionEnd(DRE);
937         else if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(BI))
938           processDeclare(DDI);
939       }
940   
941   for (Module::global_iterator GVI = M.global_begin(), GVE = M.global_end();
942        GVI != GVE; ++GVI) {
943     GlobalVariable *GV = GVI;
944     if (!GV->hasName() || !GV->isConstant() 
945         || strcmp(GV->getName().data(), "llvm.dbg.global_variable")
946         || !GV->hasInitializer())
947       continue;
948     DIGlobalVariable DIG(GV);
949     if (addGlobalVariable(DIG)) {
950       addCompileUnit(DIG.getCompileUnit());
951       processType(DIG.getType());
952     }
953   }
954 }
955     
956 /// processType - Process DIType.
957 void DebugInfoFinder::processType(DIType DT) {
958   if (!addType(DT))
959     return;
960
961   addCompileUnit(DT.getCompileUnit());
962   if (DT.isCompositeType(DT.getTag())) {
963     DICompositeType DCT(DT.getGV());
964     processType(DCT.getTypeDerivedFrom());
965     DIArray DA = DCT.getTypeArray();
966     if (!DA.isNull())
967       for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) {
968         DIDescriptor D = DA.getElement(i);
969         DIType TypeE = DIType(D.getGV());
970         if (!TypeE.isNull())
971           processType(TypeE);
972         else 
973           processSubprogram(DISubprogram(D.getGV()));
974       }
975   } else if (DT.isDerivedType(DT.getTag())) {
976     DIDerivedType DDT(DT.getGV());
977     if (!DDT.isNull()) 
978       processType(DDT.getTypeDerivedFrom());
979   }
980 }
981
982 /// processSubprogram - Process DISubprogram.
983 void DebugInfoFinder::processSubprogram(DISubprogram SP) {
984   if (SP.isNull())
985     return;
986   if (!addSubprogram(SP))
987     return;
988   addCompileUnit(SP.getCompileUnit());
989   processType(SP.getType());
990 }
991
992 /// processStopPoint - Process DbgStopPointInst.
993 void DebugInfoFinder::processStopPoint(DbgStopPointInst *SPI) {
994   GlobalVariable *Context = dyn_cast<GlobalVariable>(SPI->getContext());
995   addCompileUnit(DICompileUnit(Context));
996 }
997
998 /// processFuncStart - Process DbgFuncStartInst.
999 void DebugInfoFinder::processFuncStart(DbgFuncStartInst *FSI) {
1000   GlobalVariable *SP = dyn_cast<GlobalVariable>(FSI->getSubprogram());
1001   processSubprogram(DISubprogram(SP));
1002 }
1003
1004 /// processRegionStart - Process DbgRegionStart.
1005 void DebugInfoFinder::processRegionStart(DbgRegionStartInst *DRS) {
1006   GlobalVariable *SP = dyn_cast<GlobalVariable>(DRS->getContext());
1007   processSubprogram(DISubprogram(SP));
1008 }
1009
1010 /// processRegionEnd - Process DbgRegionEnd.
1011 void DebugInfoFinder::processRegionEnd(DbgRegionEndInst *DRE) {
1012   GlobalVariable *SP = dyn_cast<GlobalVariable>(DRE->getContext());
1013   processSubprogram(DISubprogram(SP));
1014 }
1015
1016 /// processDeclare - Process DbgDeclareInst.
1017 void DebugInfoFinder::processDeclare(DbgDeclareInst *DDI) {
1018   DIVariable DV(cast<GlobalVariable>(DDI->getVariable()));
1019   if (DV.isNull())
1020     return;
1021
1022   if (!NodesSeen.insert(DV.getGV()))
1023     return;
1024
1025   addCompileUnit(DV.getCompileUnit());
1026   processType(DV.getType());
1027 }
1028
1029 /// addType - Add type into Tys.
1030 bool DebugInfoFinder::addType(DIType DT) {
1031   if (DT.isNull())
1032     return false;
1033
1034   if (!NodesSeen.insert(DT.getGV()))
1035     return false;
1036
1037   TYs.push_back(DT.getGV());
1038   return true;
1039 }
1040
1041 /// addCompileUnit - Add compile unit into CUs.
1042 bool DebugInfoFinder::addCompileUnit(DICompileUnit CU) {
1043   if (CU.isNull())
1044     return false;
1045
1046   if (!NodesSeen.insert(CU.getGV()))
1047     return false;
1048
1049   CUs.push_back(CU.getGV());
1050   return true;
1051 }
1052     
1053 /// addGlobalVariable - Add global variable into GVs.
1054 bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) {
1055   if (DIG.isNull())
1056     return false;
1057
1058   if (!NodesSeen.insert(DIG.getGV()))
1059     return false;
1060
1061   GVs.push_back(DIG.getGV());
1062   return true;
1063 }
1064
1065 // addSubprogram - Add subprgoram into SPs.
1066 bool DebugInfoFinder::addSubprogram(DISubprogram SP) {
1067   if (SP.isNull())
1068     return false;
1069   
1070   if (!NodesSeen.insert(SP.getGV()))
1071     return false;
1072
1073   SPs.push_back(SP.getGV());
1074   return true;
1075 }
1076
1077 namespace llvm {
1078   /// findStopPoint - Find the stoppoint coressponding to this instruction, that
1079   /// is the stoppoint that dominates this instruction.
1080   const DbgStopPointInst *findStopPoint(const Instruction *Inst) {
1081     if (const DbgStopPointInst *DSI = dyn_cast<DbgStopPointInst>(Inst))
1082       return DSI;
1083
1084     const BasicBlock *BB = Inst->getParent();
1085     BasicBlock::const_iterator I = Inst, B;
1086     while (BB) {
1087       B = BB->begin();
1088
1089       // A BB consisting only of a terminator can't have a stoppoint.
1090       while (I != B) {
1091         --I;
1092         if (const DbgStopPointInst *DSI = dyn_cast<DbgStopPointInst>(I))
1093           return DSI;
1094       }
1095
1096       // This BB didn't have a stoppoint: if there is only one predecessor, look
1097       // for a stoppoint there. We could use getIDom(), but that would require
1098       // dominator info.
1099       BB = I->getParent()->getUniquePredecessor();
1100       if (BB)
1101         I = BB->getTerminator();
1102     }
1103
1104     return 0;
1105   }
1106
1107   /// findBBStopPoint - Find the stoppoint corresponding to first real
1108   /// (non-debug intrinsic) instruction in this Basic Block, and return the
1109   /// stoppoint for it.
1110   const DbgStopPointInst *findBBStopPoint(const BasicBlock *BB) {
1111     for(BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
1112       if (const DbgStopPointInst *DSI = dyn_cast<DbgStopPointInst>(I))
1113         return DSI;
1114
1115     // Fallback to looking for stoppoint of unique predecessor. Useful if this
1116     // BB contains no stoppoints, but unique predecessor does.
1117     BB = BB->getUniquePredecessor();
1118     if (BB)
1119       return findStopPoint(BB->getTerminator());
1120
1121     return 0;
1122   }
1123
1124   Value *findDbgGlobalDeclare(GlobalVariable *V) {
1125     const Module *M = V->getParent();
1126     
1127     const Type *Ty = M->getTypeByName("llvm.dbg.global_variable.type");
1128     if (!Ty) return 0;
1129
1130     Ty = PointerType::get(Ty, 0);
1131
1132     Value *Val = V->stripPointerCasts();
1133     for (Value::use_iterator I = Val->use_begin(), E = Val->use_end();
1134          I != E; ++I) {
1135       if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I)) {
1136         if (CE->getOpcode() == Instruction::BitCast) {
1137           Value *VV = CE;
1138
1139           while (VV->hasOneUse())
1140             VV = *VV->use_begin();
1141
1142           if (VV->getType() == Ty)
1143             return VV;
1144         }
1145       }
1146     }
1147     
1148     if (Val->getType() == Ty)
1149       return Val;
1150
1151     return 0;
1152   }
1153
1154   /// Finds the llvm.dbg.declare intrinsic corresponding to this value if any.
1155   /// It looks through pointer casts too.
1156   const DbgDeclareInst *findDbgDeclare(const Value *V, bool stripCasts) {
1157     if (stripCasts) {
1158       V = V->stripPointerCasts();
1159
1160       // Look for the bitcast.
1161       for (Value::use_const_iterator I = V->use_begin(), E =V->use_end();
1162             I != E; ++I)
1163         if (isa<BitCastInst>(I))
1164           return findDbgDeclare(*I, false);
1165
1166       return 0;
1167     }
1168
1169     // Find llvm.dbg.declare among uses of the instruction.
1170     for (Value::use_const_iterator I = V->use_begin(), E =V->use_end();
1171           I != E; ++I)
1172       if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(I))
1173         return DDI;
1174
1175     return 0;
1176   }
1177
1178   bool getLocationInfo(const Value *V, std::string &DisplayName,
1179                        std::string &Type, unsigned &LineNo, std::string &File,
1180                        std::string &Dir) {
1181     DICompileUnit Unit;
1182     DIType TypeD;
1183
1184     if (GlobalVariable *GV = dyn_cast<GlobalVariable>(const_cast<Value*>(V))) {
1185       Value *DIGV = findDbgGlobalDeclare(GV);
1186       if (!DIGV) return false;
1187       DIGlobalVariable Var(cast<GlobalVariable>(DIGV));
1188
1189       Var.getDisplayName(DisplayName);
1190       LineNo = Var.getLineNumber();
1191       Unit = Var.getCompileUnit();
1192       TypeD = Var.getType();
1193     } else {
1194       const DbgDeclareInst *DDI = findDbgDeclare(V);
1195       if (!DDI) return false;
1196       DIVariable Var(cast<GlobalVariable>(DDI->getVariable()));
1197
1198       Var.getName(DisplayName);
1199       LineNo = Var.getLineNumber();
1200       Unit = Var.getCompileUnit();
1201       TypeD = Var.getType();
1202     }
1203
1204     TypeD.getName(Type);
1205     Unit.getFilename(File);
1206     Unit.getDirectory(Dir);
1207     return true;
1208   }
1209
1210   /// isValidDebugInfoIntrinsic - Return true if SPI is a valid debug 
1211   /// info intrinsic.
1212   bool isValidDebugInfoIntrinsic(DbgStopPointInst &SPI, 
1213                                  CodeGenOpt::Level OptLev) {
1214     return DIDescriptor::ValidDebugInfo(SPI.getContext(), OptLev);
1215   }
1216
1217   /// isValidDebugInfoIntrinsic - Return true if FSI is a valid debug 
1218   /// info intrinsic.
1219   bool isValidDebugInfoIntrinsic(DbgFuncStartInst &FSI,
1220                                  CodeGenOpt::Level OptLev) {
1221     return DIDescriptor::ValidDebugInfo(FSI.getSubprogram(), OptLev);
1222   }
1223
1224   /// isValidDebugInfoIntrinsic - Return true if RSI is a valid debug 
1225   /// info intrinsic.
1226   bool isValidDebugInfoIntrinsic(DbgRegionStartInst &RSI,
1227                                  CodeGenOpt::Level OptLev) {
1228     return DIDescriptor::ValidDebugInfo(RSI.getContext(), OptLev);
1229   }
1230
1231   /// isValidDebugInfoIntrinsic - Return true if REI is a valid debug 
1232   /// info intrinsic.
1233   bool isValidDebugInfoIntrinsic(DbgRegionEndInst &REI,
1234                                  CodeGenOpt::Level OptLev) {
1235     return DIDescriptor::ValidDebugInfo(REI.getContext(), OptLev);
1236   }
1237
1238
1239   /// isValidDebugInfoIntrinsic - Return true if DI is a valid debug 
1240   /// info intrinsic.
1241   bool isValidDebugInfoIntrinsic(DbgDeclareInst &DI,
1242                                  CodeGenOpt::Level OptLev) {
1243     return DIDescriptor::ValidDebugInfo(DI.getVariable(), OptLev);
1244   }
1245
1246   /// ExtractDebugLocation - Extract debug location information 
1247   /// from llvm.dbg.stoppoint intrinsic.
1248   DebugLoc ExtractDebugLocation(DbgStopPointInst &SPI,
1249                                 DebugLocTracker &DebugLocInfo) {
1250     DebugLoc DL;
1251     Value *Context = SPI.getContext();
1252
1253     // If this location is already tracked then use it.
1254     DebugLocTuple Tuple(cast<GlobalVariable>(Context), SPI.getLine(), 
1255                         SPI.getColumn());
1256     DenseMap<DebugLocTuple, unsigned>::iterator II
1257       = DebugLocInfo.DebugIdMap.find(Tuple);
1258     if (II != DebugLocInfo.DebugIdMap.end())
1259       return DebugLoc::get(II->second);
1260
1261     // Add a new location entry.
1262     unsigned Id = DebugLocInfo.DebugLocations.size();
1263     DebugLocInfo.DebugLocations.push_back(Tuple);
1264     DebugLocInfo.DebugIdMap[Tuple] = Id;
1265     
1266     return DebugLoc::get(Id);
1267   }
1268
1269   /// ExtractDebugLocation - Extract debug location information 
1270   /// from llvm.dbg.func_start intrinsic.
1271   DebugLoc ExtractDebugLocation(DbgFuncStartInst &FSI,
1272                                 DebugLocTracker &DebugLocInfo) {
1273     DebugLoc DL;
1274     Value *SP = FSI.getSubprogram();
1275
1276     DISubprogram Subprogram(cast<GlobalVariable>(SP));
1277     unsigned Line = Subprogram.getLineNumber();
1278     DICompileUnit CU(Subprogram.getCompileUnit());
1279
1280     // If this location is already tracked then use it.
1281     DebugLocTuple Tuple(CU.getGV(), Line, /* Column */ 0);
1282     DenseMap<DebugLocTuple, unsigned>::iterator II
1283       = DebugLocInfo.DebugIdMap.find(Tuple);
1284     if (II != DebugLocInfo.DebugIdMap.end())
1285       return DebugLoc::get(II->second);
1286
1287     // Add a new location entry.
1288     unsigned Id = DebugLocInfo.DebugLocations.size();
1289     DebugLocInfo.DebugLocations.push_back(Tuple);
1290     DebugLocInfo.DebugIdMap[Tuple] = Id;
1291     
1292     return DebugLoc::get(Id);
1293   }
1294
1295   /// isInlinedFnStart - Return true if FSI is starting an inlined function.
1296   bool isInlinedFnStart(DbgFuncStartInst &FSI, const Function *CurrentFn) {
1297     DISubprogram Subprogram(cast<GlobalVariable>(FSI.getSubprogram()));
1298     if (Subprogram.describes(CurrentFn))
1299       return false;
1300
1301     return true;
1302   }
1303
1304   /// isInlinedFnEnd - Return true if REI is ending an inlined function.
1305   bool isInlinedFnEnd(DbgRegionEndInst &REI, const Function *CurrentFn) {
1306     DISubprogram Subprogram(cast<GlobalVariable>(REI.getContext()));
1307     if (Subprogram.isNull() || Subprogram.describes(CurrentFn))
1308       return false;
1309
1310     return true;
1311   }
1312
1313 }