Keep DIDescriptor methods together.
[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/Module.h"
22 #include "llvm/Analysis/ValueTracking.h"
23 #include "llvm/Support/Dwarf.h"
24 #include "llvm/Support/Streams.h"
25
26 using namespace llvm;
27 using namespace llvm::dwarf;
28
29 //===----------------------------------------------------------------------===//
30 // DIDescriptor
31 //===----------------------------------------------------------------------===//
32
33 /// ValidDebugInfo - Return true if V represents valid debug info value.
34 bool DIDescriptor::ValidDebugInfo(Value *V, CodeGenOpt::Level OptLevel) {
35   if (!V)
36     return false;
37
38   GlobalVariable *GV = dyn_cast<GlobalVariable>(V->stripPointerCasts());
39   if (!GV)
40     return false;
41
42   if (!GV->hasInternalLinkage () && !GV->hasLinkOnceLinkage())
43     return false;
44
45   DIDescriptor DI(GV);
46
47   // Check current version. Allow Version6 for now.
48   unsigned Version = DI.getVersion();
49   if (Version != LLVMDebugVersion && Version != LLVMDebugVersion6)
50     return false;
51
52   unsigned Tag = DI.getTag();
53   switch (Tag) {
54   case DW_TAG_variable:
55     assert(DIVariable(GV).Verify() && "Invalid DebugInfo value");
56     break;
57   case DW_TAG_compile_unit:
58     assert(DICompileUnit(GV).Verify() && "Invalid DebugInfo value");
59     break;
60   case DW_TAG_subprogram:
61     assert(DISubprogram(GV).Verify() && "Invalid DebugInfo value");
62     break;
63   case DW_TAG_lexical_block:
64     // FIXME: This interfers with the quality of generated code during
65     // optimization.
66     if (OptLevel != CodeGenOpt::None)
67       return false;
68     // FALLTHROUGH
69   default:
70     break;
71   }
72
73   return true;
74 }
75
76 DIDescriptor::DIDescriptor(GlobalVariable *GV, unsigned RequiredTag) {
77   DbgGV = GV;
78   
79   // If this is non-null, check to see if the Tag matches. If not, set to null.
80   if (GV && getTag() != RequiredTag)
81     DbgGV = 0;
82 }
83
84 const std::string &
85 DIDescriptor::getStringField(unsigned Elt, std::string &Result) const {
86   if (DbgGV == 0) {
87     Result.clear();
88     return Result;
89   }
90
91   Constant *C = DbgGV->getInitializer();
92   if (C == 0 || Elt >= C->getNumOperands()) {
93     Result.clear();
94     return Result;
95   }
96
97   // Fills in the string if it succeeds
98   if (!GetConstantStringInfo(C->getOperand(Elt), Result))
99     Result.clear();
100
101   return Result;
102 }
103
104 uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const {
105   if (DbgGV == 0) return 0;
106
107   Constant *C = DbgGV->getInitializer();
108   if (C == 0 || Elt >= C->getNumOperands())
109     return 0;
110
111   if (ConstantInt *CI = dyn_cast<ConstantInt>(C->getOperand(Elt)))
112     return CI->getZExtValue();
113   return 0;
114 }
115
116 DIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const {
117   if (DbgGV == 0) return DIDescriptor();
118
119   Constant *C = DbgGV->getInitializer();
120   if (C == 0 || Elt >= C->getNumOperands())
121     return DIDescriptor();
122
123   C = C->getOperand(Elt);
124   return DIDescriptor(dyn_cast<GlobalVariable>(C->stripPointerCasts()));
125 }
126
127 GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const {
128   if (DbgGV == 0) return 0;
129
130   Constant *C = DbgGV->getInitializer();
131   if (C == 0 || Elt >= C->getNumOperands())
132     return 0;
133
134   C = C->getOperand(Elt);
135   return dyn_cast<GlobalVariable>(C->stripPointerCasts());
136 }
137
138 //===----------------------------------------------------------------------===//
139 // Simple Descriptor Constructors and other Methods
140 //===----------------------------------------------------------------------===//
141
142 // Needed by DIVariable::getType().
143 DIType::DIType(GlobalVariable *GV) : DIDescriptor(GV) {
144   if (!GV) return;
145   unsigned tag = getTag();
146   if (tag != dwarf::DW_TAG_base_type && !DIDerivedType::isDerivedType(tag) &&
147       !DICompositeType::isCompositeType(tag))
148     DbgGV = 0;
149 }
150
151 /// isDerivedType - Return true if the specified tag is legal for
152 /// DIDerivedType.
153 bool DIType::isDerivedType(unsigned Tag) {
154   switch (Tag) {
155   case dwarf::DW_TAG_typedef:
156   case dwarf::DW_TAG_pointer_type:
157   case dwarf::DW_TAG_reference_type:
158   case dwarf::DW_TAG_const_type:
159   case dwarf::DW_TAG_volatile_type:
160   case dwarf::DW_TAG_restrict_type:
161   case dwarf::DW_TAG_member:
162   case dwarf::DW_TAG_inheritance:
163     return true;
164   default:
165     // FIXME: Even though it doesn't make sense, CompositeTypes are current
166     // modelled as DerivedTypes, this should return true for them as well.
167     return false;
168   }
169 }
170
171 /// isCompositeType - Return true if the specified tag is legal for
172 /// DICompositeType.
173 bool DIType::isCompositeType(unsigned TAG) {
174   switch (TAG) {
175   case dwarf::DW_TAG_array_type:
176   case dwarf::DW_TAG_structure_type:
177   case dwarf::DW_TAG_union_type:
178   case dwarf::DW_TAG_enumeration_type:
179   case dwarf::DW_TAG_vector_type:
180   case dwarf::DW_TAG_subroutine_type:
181   case dwarf::DW_TAG_class_type:
182     return true;
183   default:
184     return false;
185   }
186 }
187
188 /// isVariable - Return true if the specified tag is legal for DIVariable.
189 bool DIVariable::isVariable(unsigned Tag) {
190   switch (Tag) {
191   case dwarf::DW_TAG_auto_variable:
192   case dwarf::DW_TAG_arg_variable:
193   case dwarf::DW_TAG_return_variable:
194     return true;
195   default:
196     return false;
197   }
198 }
199
200 unsigned DIArray::getNumElements() const {
201   assert (DbgGV && "Invalid DIArray");
202   Constant *C = DbgGV->getInitializer();
203   assert (C && "Invalid DIArray initializer");
204   return C->getNumOperands();
205 }
206
207 /// Verify - Verify that a compile unit is well formed.
208 bool DICompileUnit::Verify() const {
209   if (isNull()) 
210     return false;
211   std::string Res;
212   if (getFilename(Res).empty()) 
213     return false;
214   // It is possible that directory and produce string is empty.
215   return true;
216 }
217
218 /// Verify - Verify that a type descriptor is well formed.
219 bool DIType::Verify() const {
220   if (isNull()) 
221     return false;
222   if (getContext().isNull()) 
223     return false;
224
225   DICompileUnit CU = getCompileUnit();
226   if (!CU.isNull() && !CU.Verify()) 
227     return false;
228   return true;
229 }
230
231 /// Verify - Verify that a composite type descriptor is well formed.
232 bool DICompositeType::Verify() const {
233   if (isNull()) 
234     return false;
235   if (getContext().isNull()) 
236     return false;
237
238   DICompileUnit CU = getCompileUnit();
239   if (!CU.isNull() && !CU.Verify()) 
240     return false;
241   return true;
242 }
243
244 /// Verify - Verify that a subprogram descriptor is well formed.
245 bool DISubprogram::Verify() const {
246   if (isNull())
247     return false;
248   
249   if (getContext().isNull())
250     return false;
251
252   DICompileUnit CU = getCompileUnit();
253   if (!CU.Verify()) 
254     return false;
255
256   DICompositeType Ty = getType();
257   if (!Ty.isNull() && !Ty.Verify())
258     return false;
259   return true;
260 }
261
262 /// Verify - Verify that a global variable descriptor is well formed.
263 bool DIGlobalVariable::Verify() const {
264   if (isNull())
265     return false;
266   
267   if (getContext().isNull())
268     return false;
269
270   DICompileUnit CU = getCompileUnit();
271   if (!CU.isNull() && !CU.Verify()) 
272     return false;
273
274   DIType Ty = getType();
275   if (!Ty.Verify())
276     return false;
277
278   if (!getGlobal())
279     return false;
280
281   return true;
282 }
283
284 /// Verify - Verify that a variable descriptor is well formed.
285 bool DIVariable::Verify() const {
286   if (isNull())
287     return false;
288   
289   if (getContext().isNull())
290     return false;
291
292   DIType Ty = getType();
293   if (!Ty.Verify())
294     return false;
295
296   return true;
297 }
298
299 /// getOriginalTypeSize - If this type is derived from a base type then
300 /// return base type size.
301 uint64_t DIDerivedType::getOriginalTypeSize() const {
302   if (getTag() != dwarf::DW_TAG_member)
303     return getSizeInBits();
304   DIType BT = getTypeDerivedFrom();
305   if (BT.getTag() != dwarf::DW_TAG_base_type)
306     return getSizeInBits();
307   return BT.getSizeInBits();
308 }
309
310 /// describes - Return true if this subprogram provides debugging
311 /// information for the function F.
312 bool DISubprogram::describes(const Function *F) {
313   assert (F && "Invalid function");
314   std::string Name;
315   getLinkageName(Name);
316   if (Name.empty())
317     getName(Name);
318   if (!Name.empty() && (strcmp(Name.c_str(), F->getNameStart()) == false))
319     return true;
320   return false;
321 }
322
323 //===----------------------------------------------------------------------===//
324 // DIDescriptor: dump routines for all descriptors.
325 //===----------------------------------------------------------------------===//
326
327
328 /// dump - Print descriptor.
329 void DIDescriptor::dump() const {
330   cerr << "[" << dwarf::TagString(getTag()) << "] ";
331   cerr << std::hex << "[GV:" << DbgGV << "]" << std::dec;
332 }
333
334 /// dump - Print compile unit.
335 void DICompileUnit::dump() const {
336   if (getLanguage())
337     cerr << " [" << dwarf::LanguageString(getLanguage()) << "] ";
338
339   std::string Res1, Res2;
340   cerr << " [" << getDirectory(Res1) << "/" << getFilename(Res2) << " ]";
341 }
342
343 /// dump - Print type.
344 void DIType::dump() const {
345   if (isNull()) return;
346
347   std::string Res;
348   if (!getName(Res).empty())
349     cerr << " [" << Res << "] ";
350
351   unsigned Tag = getTag();
352   cerr << " [" << dwarf::TagString(Tag) << "] ";
353
354   // TODO : Print context
355   getCompileUnit().dump();
356   cerr << " [" 
357        << getLineNumber() << ", " 
358        << getSizeInBits() << ", "
359        << getAlignInBits() << ", "
360        << getOffsetInBits() 
361        << "] ";
362
363   if (isPrivate()) 
364     cerr << " [private] ";
365   else if (isProtected())
366     cerr << " [protected] ";
367
368   if (isForwardDecl())
369     cerr << " [fwd] ";
370
371   if (isBasicType(Tag))
372     DIBasicType(DbgGV).dump();
373   else if (isDerivedType(Tag))
374     DIDerivedType(DbgGV).dump();
375   else if (isCompositeType(Tag))
376     DICompositeType(DbgGV).dump();
377   else {
378     cerr << "Invalid DIType\n";
379     return;
380   }
381
382   cerr << "\n";
383 }
384
385 /// dump - Print basic type.
386 void DIBasicType::dump() const {
387   cerr << " [" << dwarf::AttributeEncodingString(getEncoding()) << "] ";
388 }
389
390 /// dump - Print derived type.
391 void DIDerivedType::dump() const {
392   cerr << "\n\t Derived From: "; getTypeDerivedFrom().dump();
393 }
394
395 /// dump - Print composite type.
396 void DICompositeType::dump() const {
397   DIArray A = getTypeArray();
398   if (A.isNull())
399     return;
400   cerr << " [" << A.getNumElements() << " elements]";
401 }
402
403 /// dump - Print global.
404 void DIGlobal::dump() const {
405   std::string Res;
406   if (!getName(Res).empty())
407     cerr << " [" << Res << "] ";
408
409   unsigned Tag = getTag();
410   cerr << " [" << dwarf::TagString(Tag) << "] ";
411
412   // TODO : Print context
413   getCompileUnit().dump();
414   cerr << " [" << getLineNumber() << "] ";
415
416   if (isLocalToUnit())
417     cerr << " [local] ";
418
419   if (isDefinition())
420     cerr << " [def] ";
421
422   if (isGlobalVariable(Tag))
423     DIGlobalVariable(DbgGV).dump();
424
425   cerr << "\n";
426 }
427
428 /// dump - Print subprogram.
429 void DISubprogram::dump() const {
430   DIGlobal::dump();
431 }
432
433 /// dump - Print global variable.
434 void DIGlobalVariable::dump() const {
435   cerr << " ["; getGlobal()->dump(); cerr << "] ";
436 }
437
438 /// dump - Print variable.
439 void DIVariable::dump() const {
440   std::string Res;
441   if (!getName(Res).empty())
442     cerr << " [" << Res << "] ";
443
444   getCompileUnit().dump();
445   cerr << " [" << getLineNumber() << "] ";
446   getType().dump();
447   cerr << "\n";
448 }
449
450 //===----------------------------------------------------------------------===//
451 // DIFactory: Basic Helpers
452 //===----------------------------------------------------------------------===//
453
454 DIFactory::DIFactory(Module &m)
455   : M(m), StopPointFn(0), FuncStartFn(0), RegionStartFn(0), RegionEndFn(0),
456     DeclareFn(0) {
457   EmptyStructPtr = PointerType::getUnqual(StructType::get());
458 }
459
460 /// getCastToEmpty - Return this descriptor as a Constant* with type '{}*'.
461 /// This is only valid when the descriptor is non-null.
462 Constant *DIFactory::getCastToEmpty(DIDescriptor D) {
463   if (D.isNull()) return Constant::getNullValue(EmptyStructPtr);
464   return ConstantExpr::getBitCast(D.getGV(), EmptyStructPtr);
465 }
466
467 Constant *DIFactory::GetTagConstant(unsigned TAG) {
468   assert((TAG & LLVMDebugVersionMask) == 0 &&
469          "Tag too large for debug encoding!");
470   return ConstantInt::get(Type::Int32Ty, TAG | LLVMDebugVersion);
471 }
472
473 Constant *DIFactory::GetStringConstant(const std::string &String) {
474   // Check string cache for previous edition.
475   Constant *&Slot = StringCache[String];
476   
477   // Return Constant if previously defined.
478   if (Slot) return Slot;
479   
480   const PointerType *DestTy = PointerType::getUnqual(Type::Int8Ty);
481   
482   // If empty string then use a i8* null instead.
483   if (String.empty())
484     return Slot = ConstantPointerNull::get(DestTy);
485
486   // Construct string as an llvm constant.
487   Constant *ConstStr = ConstantArray::get(String);
488     
489   // Otherwise create and return a new string global.
490   GlobalVariable *StrGV = new GlobalVariable(ConstStr->getType(), true,
491                                              GlobalVariable::InternalLinkage,
492                                              ConstStr, ".str", &M);
493   StrGV->setSection("llvm.metadata");
494   return Slot = ConstantExpr::getBitCast(StrGV, DestTy);
495 }
496
497 //===----------------------------------------------------------------------===//
498 // DIFactory: Primary Constructors
499 //===----------------------------------------------------------------------===//
500
501 /// GetOrCreateArray - Create an descriptor for an array of descriptors. 
502 /// This implicitly uniques the arrays created.
503 DIArray DIFactory::GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys) {
504   SmallVector<Constant*, 16> Elts;
505   
506   for (unsigned i = 0; i != NumTys; ++i)
507     Elts.push_back(getCastToEmpty(Tys[i]));
508   
509   Constant *Init = ConstantArray::get(ArrayType::get(EmptyStructPtr,
510                                                      Elts.size()),
511                                       Elts.data(), Elts.size());
512   // If we already have this array, just return the uniqued version.
513   DIDescriptor &Entry = SimpleConstantCache[Init];
514   if (!Entry.isNull()) return DIArray(Entry.getGV());
515   
516   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
517                                           GlobalValue::InternalLinkage,
518                                           Init, "llvm.dbg.array", &M);
519   GV->setSection("llvm.metadata");
520   Entry = DIDescriptor(GV);
521   return DIArray(GV);
522 }
523
524 /// GetOrCreateSubrange - Create a descriptor for a value range.  This
525 /// implicitly uniques the values returned.
526 DISubrange DIFactory::GetOrCreateSubrange(int64_t Lo, int64_t Hi) {
527   Constant *Elts[] = {
528     GetTagConstant(dwarf::DW_TAG_subrange_type),
529     ConstantInt::get(Type::Int64Ty, Lo),
530     ConstantInt::get(Type::Int64Ty, Hi)
531   };
532   
533   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
534
535   // If we already have this range, just return the uniqued version.
536   DIDescriptor &Entry = SimpleConstantCache[Init];
537   if (!Entry.isNull()) return DISubrange(Entry.getGV());
538   
539   M.addTypeName("llvm.dbg.subrange.type", Init->getType());
540
541   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
542                                           GlobalValue::InternalLinkage,
543                                           Init, "llvm.dbg.subrange", &M);
544   GV->setSection("llvm.metadata");
545   Entry = DIDescriptor(GV);
546   return DISubrange(GV);
547 }
548
549
550
551 /// CreateCompileUnit - Create a new descriptor for the specified compile
552 /// unit.  Note that this does not unique compile units within the module.
553 DICompileUnit DIFactory::CreateCompileUnit(unsigned LangID,
554                                            const std::string &Filename,
555                                            const std::string &Directory,
556                                            const std::string &Producer,
557                                            bool isMain,
558                                            bool isOptimized,
559                                            const char *Flags,
560                                            unsigned RunTimeVer) {
561   Constant *Elts[] = {
562     GetTagConstant(dwarf::DW_TAG_compile_unit),
563     Constant::getNullValue(EmptyStructPtr),
564     ConstantInt::get(Type::Int32Ty, LangID),
565     GetStringConstant(Filename),
566     GetStringConstant(Directory),
567     GetStringConstant(Producer),
568     ConstantInt::get(Type::Int1Ty, isMain),
569     ConstantInt::get(Type::Int1Ty, isOptimized),
570     GetStringConstant(Flags),
571     ConstantInt::get(Type::Int32Ty, RunTimeVer)
572   };
573   
574   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
575   
576   M.addTypeName("llvm.dbg.compile_unit.type", Init->getType());
577   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
578                                           GlobalValue::LinkOnceAnyLinkage,
579                                           Init, "llvm.dbg.compile_unit", &M);
580   GV->setSection("llvm.metadata");
581   return DICompileUnit(GV);
582 }
583
584 /// CreateEnumerator - Create a single enumerator value.
585 DIEnumerator DIFactory::CreateEnumerator(const std::string &Name, uint64_t Val){
586   Constant *Elts[] = {
587     GetTagConstant(dwarf::DW_TAG_enumerator),
588     GetStringConstant(Name),
589     ConstantInt::get(Type::Int64Ty, Val)
590   };
591   
592   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
593   
594   M.addTypeName("llvm.dbg.enumerator.type", Init->getType());
595   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
596                                           GlobalValue::InternalLinkage,
597                                           Init, "llvm.dbg.enumerator", &M);
598   GV->setSection("llvm.metadata");
599   return DIEnumerator(GV);
600 }
601
602
603 /// CreateBasicType - Create a basic type like int, float, etc.
604 DIBasicType DIFactory::CreateBasicType(DIDescriptor Context,
605                                       const std::string &Name,
606                                        DICompileUnit CompileUnit,
607                                        unsigned LineNumber,
608                                        uint64_t SizeInBits,
609                                        uint64_t AlignInBits,
610                                        uint64_t OffsetInBits, unsigned Flags,
611                                        unsigned Encoding) {
612   Constant *Elts[] = {
613     GetTagConstant(dwarf::DW_TAG_base_type),
614     getCastToEmpty(Context),
615     GetStringConstant(Name),
616     getCastToEmpty(CompileUnit),
617     ConstantInt::get(Type::Int32Ty, LineNumber),
618     ConstantInt::get(Type::Int64Ty, SizeInBits),
619     ConstantInt::get(Type::Int64Ty, AlignInBits),
620     ConstantInt::get(Type::Int64Ty, OffsetInBits),
621     ConstantInt::get(Type::Int32Ty, Flags),
622     ConstantInt::get(Type::Int32Ty, Encoding)
623   };
624   
625   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
626   
627   M.addTypeName("llvm.dbg.basictype.type", Init->getType());
628   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
629                                           GlobalValue::InternalLinkage,
630                                           Init, "llvm.dbg.basictype", &M);
631   GV->setSection("llvm.metadata");
632   return DIBasicType(GV);
633 }
634
635 /// CreateDerivedType - Create a derived type like const qualified type,
636 /// pointer, typedef, etc.
637 DIDerivedType DIFactory::CreateDerivedType(unsigned Tag,
638                                            DIDescriptor Context,
639                                            const std::string &Name,
640                                            DICompileUnit CompileUnit,
641                                            unsigned LineNumber,
642                                            uint64_t SizeInBits,
643                                            uint64_t AlignInBits,
644                                            uint64_t OffsetInBits,
645                                            unsigned Flags,
646                                            DIType DerivedFrom) {
647   Constant *Elts[] = {
648     GetTagConstant(Tag),
649     getCastToEmpty(Context),
650     GetStringConstant(Name),
651     getCastToEmpty(CompileUnit),
652     ConstantInt::get(Type::Int32Ty, LineNumber),
653     ConstantInt::get(Type::Int64Ty, SizeInBits),
654     ConstantInt::get(Type::Int64Ty, AlignInBits),
655     ConstantInt::get(Type::Int64Ty, OffsetInBits),
656     ConstantInt::get(Type::Int32Ty, Flags),
657     getCastToEmpty(DerivedFrom)
658   };
659   
660   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
661   
662   M.addTypeName("llvm.dbg.derivedtype.type", Init->getType());
663   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
664                                           GlobalValue::InternalLinkage,
665                                           Init, "llvm.dbg.derivedtype", &M);
666   GV->setSection("llvm.metadata");
667   return DIDerivedType(GV);
668 }
669
670 /// CreateCompositeType - Create a composite type like array, struct, etc.
671 DICompositeType DIFactory::CreateCompositeType(unsigned Tag,
672                                                DIDescriptor Context,
673                                                const std::string &Name,
674                                                DICompileUnit CompileUnit,
675                                                unsigned LineNumber,
676                                                uint64_t SizeInBits,
677                                                uint64_t AlignInBits,
678                                                uint64_t OffsetInBits,
679                                                unsigned Flags,
680                                                DIType DerivedFrom,
681                                                DIArray Elements,
682                                                unsigned RuntimeLang) {
683
684   Constant *Elts[] = {
685     GetTagConstant(Tag),
686     getCastToEmpty(Context),
687     GetStringConstant(Name),
688     getCastToEmpty(CompileUnit),
689     ConstantInt::get(Type::Int32Ty, LineNumber),
690     ConstantInt::get(Type::Int64Ty, SizeInBits),
691     ConstantInt::get(Type::Int64Ty, AlignInBits),
692     ConstantInt::get(Type::Int64Ty, OffsetInBits),
693     ConstantInt::get(Type::Int32Ty, Flags),
694     getCastToEmpty(DerivedFrom),
695     getCastToEmpty(Elements),
696     ConstantInt::get(Type::Int32Ty, RuntimeLang)
697   };
698   
699   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
700   
701   M.addTypeName("llvm.dbg.composite.type", Init->getType());
702   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
703                                           GlobalValue::InternalLinkage,
704                                           Init, "llvm.dbg.composite", &M);
705   GV->setSection("llvm.metadata");
706   return DICompositeType(GV);
707 }
708
709
710 /// CreateSubprogram - Create a new descriptor for the specified subprogram.
711 /// See comments in DISubprogram for descriptions of these fields.  This
712 /// method does not unique the generated descriptors.
713 DISubprogram DIFactory::CreateSubprogram(DIDescriptor Context, 
714                                          const std::string &Name,
715                                          const std::string &DisplayName,
716                                          const std::string &LinkageName,
717                                          DICompileUnit CompileUnit,
718                                          unsigned LineNo, DIType Type,
719                                          bool isLocalToUnit,
720                                          bool isDefinition) {
721
722   Constant *Elts[] = {
723     GetTagConstant(dwarf::DW_TAG_subprogram),
724     Constant::getNullValue(EmptyStructPtr),
725     getCastToEmpty(Context),
726     GetStringConstant(Name),
727     GetStringConstant(DisplayName),
728     GetStringConstant(LinkageName),
729     getCastToEmpty(CompileUnit),
730     ConstantInt::get(Type::Int32Ty, LineNo),
731     getCastToEmpty(Type),
732     ConstantInt::get(Type::Int1Ty, isLocalToUnit),
733     ConstantInt::get(Type::Int1Ty, isDefinition)
734   };
735   
736   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
737   
738   M.addTypeName("llvm.dbg.subprogram.type", Init->getType());
739   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
740                                           GlobalValue::LinkOnceAnyLinkage,
741                                           Init, "llvm.dbg.subprogram", &M);
742   GV->setSection("llvm.metadata");
743   return DISubprogram(GV);
744 }
745
746 /// CreateGlobalVariable - Create a new descriptor for the specified global.
747 DIGlobalVariable
748 DIFactory::CreateGlobalVariable(DIDescriptor Context, const std::string &Name,
749                                 const std::string &DisplayName,
750                                 const std::string &LinkageName,
751                                 DICompileUnit CompileUnit,
752                                 unsigned LineNo, DIType Type,bool isLocalToUnit,
753                                 bool isDefinition, llvm::GlobalVariable *Val) {
754   Constant *Elts[] = {
755     GetTagConstant(dwarf::DW_TAG_variable),
756     Constant::getNullValue(EmptyStructPtr),
757     getCastToEmpty(Context),
758     GetStringConstant(Name),
759     GetStringConstant(DisplayName),
760     GetStringConstant(LinkageName),
761     getCastToEmpty(CompileUnit),
762     ConstantInt::get(Type::Int32Ty, LineNo),
763     getCastToEmpty(Type),
764     ConstantInt::get(Type::Int1Ty, isLocalToUnit),
765     ConstantInt::get(Type::Int1Ty, isDefinition),
766     ConstantExpr::getBitCast(Val, EmptyStructPtr)
767   };
768   
769   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
770   
771   M.addTypeName("llvm.dbg.global_variable.type", Init->getType());
772   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
773                                           GlobalValue::LinkOnceAnyLinkage,
774                                           Init, "llvm.dbg.global_variable", &M);
775   GV->setSection("llvm.metadata");
776   return DIGlobalVariable(GV);
777 }
778
779
780 /// CreateVariable - Create a new descriptor for the specified variable.
781 DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,
782                                      const std::string &Name,
783                                      DICompileUnit CompileUnit, unsigned LineNo,
784                                      DIType Type) {
785   Constant *Elts[] = {
786     GetTagConstant(Tag),
787     getCastToEmpty(Context),
788     GetStringConstant(Name),
789     getCastToEmpty(CompileUnit),
790     ConstantInt::get(Type::Int32Ty, LineNo),
791     getCastToEmpty(Type)
792   };
793   
794   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
795   
796   M.addTypeName("llvm.dbg.variable.type", Init->getType());
797   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
798                                           GlobalValue::InternalLinkage,
799                                           Init, "llvm.dbg.variable", &M);
800   GV->setSection("llvm.metadata");
801   return DIVariable(GV);
802 }
803
804
805 /// CreateBlock - This creates a descriptor for a lexical block with the
806 /// specified parent context.
807 DIBlock DIFactory::CreateBlock(DIDescriptor Context) {
808   Constant *Elts[] = {
809     GetTagConstant(dwarf::DW_TAG_lexical_block),
810     getCastToEmpty(Context)
811   };
812   
813   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
814   
815   M.addTypeName("llvm.dbg.block.type", Init->getType());
816   GlobalVariable *GV = new GlobalVariable(Init->getType(), true,
817                                           GlobalValue::InternalLinkage,
818                                           Init, "llvm.dbg.block", &M);
819   GV->setSection("llvm.metadata");
820   return DIBlock(GV);
821 }
822
823
824 //===----------------------------------------------------------------------===//
825 // DIFactory: Routines for inserting code into a function
826 //===----------------------------------------------------------------------===//
827
828 /// InsertStopPoint - Create a new llvm.dbg.stoppoint intrinsic invocation,
829 /// inserting it at the end of the specified basic block.
830 void DIFactory::InsertStopPoint(DICompileUnit CU, unsigned LineNo,
831                                 unsigned ColNo, BasicBlock *BB) {
832   
833   // Lazily construct llvm.dbg.stoppoint function.
834   if (!StopPointFn)
835     StopPointFn = llvm::Intrinsic::getDeclaration(&M, 
836                                               llvm::Intrinsic::dbg_stoppoint);
837   
838   // Invoke llvm.dbg.stoppoint
839   Value *Args[] = {
840     llvm::ConstantInt::get(llvm::Type::Int32Ty, LineNo),
841     llvm::ConstantInt::get(llvm::Type::Int32Ty, ColNo),
842     getCastToEmpty(CU)
843   };
844   CallInst::Create(StopPointFn, Args, Args+3, "", BB);
845 }
846
847 /// InsertSubprogramStart - Create a new llvm.dbg.func.start intrinsic to
848 /// mark the start of the specified subprogram.
849 void DIFactory::InsertSubprogramStart(DISubprogram SP, BasicBlock *BB) {
850   // Lazily construct llvm.dbg.func.start.
851   if (!FuncStartFn)
852     FuncStartFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_func_start);
853   
854   // Call llvm.dbg.func.start which also implicitly sets a stoppoint.
855   CallInst::Create(FuncStartFn, getCastToEmpty(SP), "", BB);
856 }
857
858 /// InsertRegionStart - Insert a new llvm.dbg.region.start intrinsic call to
859 /// mark the start of a region for the specified scoping descriptor.
860 void DIFactory::InsertRegionStart(DIDescriptor D, BasicBlock *BB) {
861   // Lazily construct llvm.dbg.region.start function.
862   if (!RegionStartFn)
863     RegionStartFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_region_start);
864
865   // Call llvm.dbg.func.start.
866   CallInst::Create(RegionStartFn, getCastToEmpty(D), "", BB);
867 }
868
869 /// InsertRegionEnd - Insert a new llvm.dbg.region.end intrinsic call to
870 /// mark the end of a region for the specified scoping descriptor.
871 void DIFactory::InsertRegionEnd(DIDescriptor D, BasicBlock *BB) {
872   // Lazily construct llvm.dbg.region.end function.
873   if (!RegionEndFn)
874     RegionEndFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_region_end);
875
876   // Call llvm.dbg.region.end.
877   CallInst::Create(RegionEndFn, getCastToEmpty(D), "", BB);
878 }
879
880 /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
881 void DIFactory::InsertDeclare(Value *Storage, DIVariable D, BasicBlock *BB) {
882   // Cast the storage to a {}* for the call to llvm.dbg.declare.
883   Storage = new BitCastInst(Storage, EmptyStructPtr, "", BB);
884   
885   if (!DeclareFn)
886     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
887
888   Value *Args[] = { Storage, getCastToEmpty(D) };
889   CallInst::Create(DeclareFn, Args, Args+2, "", BB);
890 }
891
892 namespace llvm {
893   /// findStopPoint - Find the stoppoint coressponding to this instruction, that
894   /// is the stoppoint that dominates this instruction.
895   const DbgStopPointInst *findStopPoint(const Instruction *Inst) {
896     if (const DbgStopPointInst *DSI = dyn_cast<DbgStopPointInst>(Inst))
897       return DSI;
898
899     const BasicBlock *BB = Inst->getParent();
900     BasicBlock::const_iterator I = Inst, B;
901     while (BB) {
902       B = BB->begin();
903
904       // A BB consisting only of a terminator can't have a stoppoint.
905       while (I != B) {
906         --I;
907         if (const DbgStopPointInst *DSI = dyn_cast<DbgStopPointInst>(I))
908           return DSI;
909       }
910
911       // This BB didn't have a stoppoint: if there is only one predecessor, look
912       // for a stoppoint there. We could use getIDom(), but that would require
913       // dominator info.
914       BB = I->getParent()->getUniquePredecessor();
915       if (BB)
916         I = BB->getTerminator();
917     }
918
919     return 0;
920   }
921
922   /// findBBStopPoint - Find the stoppoint corresponding to first real
923   /// (non-debug intrinsic) instruction in this Basic Block, and return the
924   /// stoppoint for it.
925   const DbgStopPointInst *findBBStopPoint(const BasicBlock *BB) {
926     for(BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
927       if (const DbgStopPointInst *DSI = dyn_cast<DbgStopPointInst>(I))
928         return DSI;
929
930     // Fallback to looking for stoppoint of unique predecessor. Useful if this
931     // BB contains no stoppoints, but unique predecessor does.
932     BB = BB->getUniquePredecessor();
933     if (BB)
934       return findStopPoint(BB->getTerminator());
935
936     return 0;
937   }
938
939   Value *findDbgGlobalDeclare(GlobalVariable *V) {
940     const Module *M = V->getParent();
941     const Type *Ty = M->getTypeByName("llvm.dbg.global_variable.type");
942     if (!Ty) return 0;
943
944     Ty = PointerType::get(Ty, 0);
945
946     Value *Val = V->stripPointerCasts();
947     for (Value::use_iterator I = Val->use_begin(), E = Val->use_end();
948          I != E; ++I) {
949       if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I)) {
950         if (CE->getOpcode() == Instruction::BitCast) {
951           Value *VV = CE;
952
953           while (VV->hasOneUse())
954             VV = *VV->use_begin();
955
956           if (VV->getType() == Ty)
957             return VV;
958         }
959       }
960     }
961     
962     if (Val->getType() == Ty)
963       return Val;
964
965     return 0;
966   }
967
968   /// Finds the llvm.dbg.declare intrinsic corresponding to this value if any.
969   /// It looks through pointer casts too.
970   const DbgDeclareInst *findDbgDeclare(const Value *V, bool stripCasts) {
971     if (stripCasts) {
972       V = V->stripPointerCasts();
973
974       // Look for the bitcast.
975       for (Value::use_const_iterator I = V->use_begin(), E =V->use_end();
976             I != E; ++I)
977         if (isa<BitCastInst>(I))
978           return findDbgDeclare(*I, false);
979
980       return 0;
981     }
982
983     // Find llvm.dbg.declare among uses of the instruction.
984     for (Value::use_const_iterator I = V->use_begin(), E =V->use_end();
985           I != E; ++I)
986       if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(I))
987         return DDI;
988
989     return 0;
990   }
991
992   bool getLocationInfo(const Value *V, std::string &DisplayName,
993                        std::string &Type, unsigned &LineNo, std::string &File,
994                        std::string &Dir) {
995     DICompileUnit Unit;
996     DIType TypeD;
997
998     if (GlobalVariable *GV = dyn_cast<GlobalVariable>(const_cast<Value*>(V))) {
999       Value *DIGV = findDbgGlobalDeclare(GV);
1000       if (!DIGV) return false;
1001       DIGlobalVariable Var(cast<GlobalVariable>(DIGV));
1002
1003       Var.getDisplayName(DisplayName);
1004       LineNo = Var.getLineNumber();
1005       Unit = Var.getCompileUnit();
1006       TypeD = Var.getType();
1007     } else {
1008       const DbgDeclareInst *DDI = findDbgDeclare(V);
1009       if (!DDI) return false;
1010       DIVariable Var(cast<GlobalVariable>(DDI->getVariable()));
1011
1012       Var.getName(DisplayName);
1013       LineNo = Var.getLineNumber();
1014       Unit = Var.getCompileUnit();
1015       TypeD = Var.getType();
1016     }
1017
1018     TypeD.getName(Type);
1019     Unit.getFilename(File);
1020     Unit.getDirectory(Dir);
1021     return true;
1022   }
1023
1024   /// CollectDebugInfoAnchors - Collect debugging information anchors.
1025   void CollectDebugInfoAnchors(Module &M,
1026                                SmallVector<GlobalVariable *, 2> &CUs,
1027                                SmallVector<GlobalVariable *, 4> &GVs,
1028                                SmallVector<GlobalVariable *, 4> &SPs) {
1029
1030     for (Module::global_iterator GVI = M.global_begin(), E = M.global_end();
1031        GVI != E; GVI++) {
1032       GlobalVariable *GV = GVI;
1033       if (GV->hasName() && strncmp(GV->getNameStart(), "llvm.dbg", 8) == 0
1034           && GV->isConstant() && GV->hasInitializer()) {
1035         DICompileUnit C(GV);
1036         if (C.isNull() == false) {
1037           CUs.push_back(GV);
1038           continue;
1039         }
1040         DIGlobalVariable G(GV);
1041         if (G.isNull() == false) {
1042           GVs.push_back(GV);
1043           continue;
1044         }
1045         DISubprogram S(GV);
1046         if (S.isNull() == false) {
1047           SPs.push_back(GV);
1048           continue;
1049         }
1050       }
1051     }
1052   }
1053 }