CGDebugInfo.cpp revision 21cb712be47ec21ffa314d7c9856160fa4de440a
1//===--- CGDebugInfo.cpp - Emit Debug Information for a Module ------------===//
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 coordinates the debug information generation while generating code.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CGDebugInfo.h"
15#include "CodeGenModule.h"
16#include "clang/AST/ASTContext.h"
17#include "clang/Basic/SourceManager.h"
18#include "clang/Basic/FileManager.h"
19#include "llvm/Constants.h"
20#include "llvm/DerivedTypes.h"
21#include "llvm/Instructions.h"
22#include "llvm/Intrinsics.h"
23#include "llvm/Module.h"
24#include "llvm/ADT/StringExtras.h"
25#include "llvm/ADT/SmallVector.h"
26#include "llvm/CodeGen/MachineModuleInfo.h"
27#include "llvm/Support/Dwarf.h"
28#include "llvm/Support/IRBuilder.h"
29#include "llvm/Target/TargetMachine.h"
30using namespace clang;
31using namespace clang::CodeGen;
32
33CGDebugInfo::CGDebugInfo(CodeGenModule *m)
34: M(m)
35, CurLoc()
36, PrevLoc()
37, CompileUnitCache()
38, TypeCache()
39, StopPointFn(NULL)
40, FuncStartFn(NULL)
41, DeclareFn(NULL)
42, RegionStartFn(NULL)
43, RegionEndFn(NULL)
44, CompileUnitAnchor(NULL)
45, SubprogramAnchor(NULL)
46, GlobalVariableAnchor(NULL)
47, RegionStack()
48, VariableDescList()
49, GlobalVarDescList()
50, EnumDescList()
51, SubrangeDescList()
52, Subprogram(NULL)
53{
54  SR = new llvm::DISerializer();
55  SR->setModule (&M->getModule());
56}
57
58CGDebugInfo::~CGDebugInfo()
59{
60  delete SR;
61
62  // Free CompileUnitCache.
63  for (std::map<unsigned, llvm::CompileUnitDesc *>::iterator I
64       = CompileUnitCache.begin(); I != CompileUnitCache.end(); ++I) {
65    delete I->second;
66  }
67  CompileUnitCache.clear();
68
69  // Free TypeCache.
70  for (std::map<void *, llvm::TypeDesc *>::iterator I
71       = TypeCache.begin(); I != TypeCache.end(); ++I) {
72    delete I->second;
73  }
74  TypeCache.clear();
75
76  // Free region descriptors.
77  for (std::vector<llvm::DebugInfoDesc *>::iterator I
78       = RegionStack.begin(); I != RegionStack.end(); ++I) {
79    delete *I;
80  }
81
82  // Free local var descriptors.
83  for (std::vector<llvm::VariableDesc *>::iterator I
84       = VariableDescList.begin(); I != VariableDescList.end(); ++I) {
85    delete *I;
86  }
87
88  // Free global var descriptors.
89  for (std::vector<llvm::GlobalVariableDesc *>::iterator I
90       = GlobalVarDescList.begin(); I != GlobalVarDescList.end(); ++I) {
91    delete *I;
92  }
93
94  // Free enum constants descriptors.
95  for (std::vector<llvm::EnumeratorDesc *>::iterator I
96       = EnumDescList.begin(); I != EnumDescList.end(); ++I) {
97    delete *I;
98  }
99
100  // Free subrange descriptors.
101  for (std::vector<llvm::SubrangeDesc *>::iterator I
102       = SubrangeDescList.begin(); I != SubrangeDescList.end(); ++I) {
103    delete *I;
104  }
105
106  delete CompileUnitAnchor;
107  delete SubprogramAnchor;
108  delete GlobalVariableAnchor;
109}
110
111void CGDebugInfo::setLocation(SourceLocation loc)
112{
113  SourceManager &SM = M->getContext().getSourceManager();
114  CurLoc = SM.getLogicalLoc(loc);
115}
116
117/// getCastValueFor - Return a llvm representation for a given debug information
118/// descriptor cast to an empty struct pointer.
119llvm::Value *CGDebugInfo::getCastValueFor(llvm::DebugInfoDesc *DD) {
120  return llvm::ConstantExpr::getBitCast(SR->Serialize(DD),
121                                        SR->getEmptyStructPtrType());
122}
123
124/// getValueFor - Return a llvm representation for a given debug information
125/// descriptor.
126llvm::Value *CGDebugInfo::getValueFor(llvm::DebugInfoDesc *DD) {
127  return SR->Serialize(DD);
128}
129
130/// getOrCreateCompileUnit - Get the compile unit from the cache or create a new
131/// one if necessary.
132llvm::CompileUnitDesc
133*CGDebugInfo::getOrCreateCompileUnit(const SourceLocation Loc) {
134
135  // See if this compile unit has been used before.
136  llvm::CompileUnitDesc *&Slot = CompileUnitCache[Loc.getFileID()];
137  if (Slot) return Slot;
138
139  // Create new compile unit.
140  // FIXME: Where to free these?
141  // One way is to iterate over the CompileUnitCache in ~CGDebugInfo.
142  llvm::CompileUnitDesc *Unit = new llvm::CompileUnitDesc();
143
144  // Make sure we have an anchor.
145  if (!CompileUnitAnchor) {
146    CompileUnitAnchor = new llvm::AnchorDesc(Unit);
147  }
148
149  // Get source file information.
150  SourceManager &SM = M->getContext().getSourceManager();
151  const FileEntry *FE = SM.getFileEntryForLoc(Loc);
152  const char *FileName, *DirName;
153  if (FE) {
154    FileName = FE->getName();
155    DirName = FE->getDir()->getName();
156  } else {
157    FileName = SM.getSourceName(Loc);
158    DirName = "";
159  }
160
161  Unit->setAnchor(CompileUnitAnchor);
162  Unit->setFileName(FileName);
163  Unit->setDirectory(DirName);
164
165  // Set up producer name.
166  // FIXME: Do not know how to get clang version yet.
167  Unit->setProducer("clang");
168
169  // Set up Language number.
170  // FIXME: Handle other languages as well.
171  Unit->setLanguage(llvm::dwarf::DW_LANG_C89);
172
173  // Update cache.
174  Slot = Unit;
175
176  return Unit;
177}
178
179
180/// getOrCreateCVRType - Get the CVR qualified type from the cache or create
181/// a new one if necessary.
182llvm::TypeDesc *
183CGDebugInfo::getOrCreateCVRType(QualType type, llvm::CompileUnitDesc *Unit)
184{
185  // We will create a Derived type.
186  llvm::DerivedTypeDesc *DTy = NULL;
187  llvm::TypeDesc *FromTy = NULL;
188
189  if (type.isConstQualified()) {
190    DTy = new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_const_type);
191    type.removeConst();
192    FromTy = getOrCreateType(type, Unit);
193  } else if (type.isVolatileQualified()) {
194    DTy = new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_volatile_type);
195    type.removeVolatile();
196    FromTy = getOrCreateType(type, Unit);
197  } else if (type.isRestrictQualified()) {
198    DTy = new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_restrict_type);
199    type.removeRestrict();
200    FromTy = getOrCreateType(type, Unit);
201  }
202
203  // No need to fill in the Name, Line, Size, Alignment, Offset in case of        // CVR derived types.
204  DTy->setContext(Unit);
205  DTy->setFromType(FromTy);
206
207  return DTy;
208}
209
210
211/// getOrCreateBuiltinType - Get the Basic type from the cache or create a new
212/// one if necessary.
213llvm::TypeDesc *
214CGDebugInfo::getOrCreateBuiltinType(QualType type, llvm::CompileUnitDesc *Unit)
215{
216  assert (type->getTypeClass() == Type::Builtin);
217
218  const BuiltinType *BT = type->getAsBuiltinType();
219
220  unsigned Encoding = 0;
221  switch (BT->getKind())
222  {
223    case BuiltinType::Void:
224      return NULL;
225    case BuiltinType::UChar:
226    case BuiltinType::Char_U:
227      Encoding = llvm::dwarf::DW_ATE_unsigned_char;
228      break;
229    case BuiltinType::Char_S:
230    case BuiltinType::SChar:
231      Encoding = llvm::dwarf::DW_ATE_signed_char;
232      break;
233    case BuiltinType::UShort:
234    case BuiltinType::UInt:
235    case BuiltinType::ULong:
236    case BuiltinType::ULongLong:
237      Encoding = llvm::dwarf::DW_ATE_unsigned;
238      break;
239    case BuiltinType::Short:
240    case BuiltinType::Int:
241    case BuiltinType::Long:
242    case BuiltinType::LongLong:
243      Encoding = llvm::dwarf::DW_ATE_signed;
244      break;
245    case BuiltinType::Bool:
246      Encoding = llvm::dwarf::DW_ATE_boolean;
247      break;
248    case BuiltinType::Float:
249    case BuiltinType::Double:
250      Encoding = llvm::dwarf::DW_ATE_float;
251      break;
252    default:
253      Encoding = llvm::dwarf::DW_ATE_signed;
254      break;
255  }
256
257  // Ty will have contain the resulting type.
258  llvm::BasicTypeDesc *BTy = new llvm::BasicTypeDesc();
259
260  // Get the name and location early to assist debugging.
261  const char *TyName = BT->getName();
262
263  // Bit size, align and offset of the type.
264  uint64_t Size = M->getContext().getTypeSize(type);
265  uint64_t Align = M->getContext().getTypeAlign(type);
266  uint64_t Offset = 0;
267
268  // If the type is defined, fill in the details.
269  if (BTy) {
270    BTy->setContext(Unit);
271    BTy->setName(TyName);
272    BTy->setSize(Size);
273    BTy->setAlign(Align);
274    BTy->setOffset(Offset);
275    BTy->setEncoding(Encoding);
276  }
277
278  return BTy;
279}
280
281llvm::TypeDesc *
282CGDebugInfo::getOrCreatePointerType(QualType type, llvm::CompileUnitDesc *Unit)
283{
284  // type*
285  llvm::DerivedTypeDesc *DTy =
286    new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_pointer_type);
287
288  // Handle the derived type.
289  const PointerType *PTRT = type->getAsPointerType();
290  llvm::TypeDesc *FromTy = getOrCreateType(PTRT->getPointeeType(), Unit);
291
292  // Get the name and location early to assist debugging.
293  SourceManager &SM = M->getContext().getSourceManager();
294  uint64_t Line = SM.getLogicalLineNumber(CurLoc);
295
296  // Bit size, align and offset of the type.
297  uint64_t Size = M->getContext().getTypeSize(type);
298  uint64_t Align = M->getContext().getTypeAlign(type);
299  uint64_t Offset = 0;
300
301  // If the type is defined, fill in the details.
302  if (DTy) {
303    DTy->setContext(Unit);
304    DTy->setLine(Line);
305    DTy->setSize(Size);
306    DTy->setAlign(Align);
307    DTy->setOffset(Offset);
308    DTy->setFromType(FromTy);
309  }
310
311  return DTy;
312}
313
314llvm::TypeDesc *
315CGDebugInfo::getOrCreateTypedefType(QualType type, llvm::CompileUnitDesc *Unit)
316{
317  // typedefs are derived from some other type.
318  llvm::DerivedTypeDesc *DTy =
319    new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_typedef);
320
321  // Handle derived type.
322  const TypedefType *TDT = type->getAsTypedefType();
323  llvm::TypeDesc *FromTy = getOrCreateType(TDT->LookThroughTypedefs(),
324                                               Unit);
325
326  // Get the name and location early to assist debugging.
327  const char *TyName = TDT->getDecl()->getName();
328  SourceManager &SM = M->getContext().getSourceManager();
329  uint64_t Line = SM.getLogicalLineNumber(TDT->getDecl()->getLocation());
330
331  // If the type is defined, fill in the details.
332  if (DTy) {
333    DTy->setContext(Unit);
334    DTy->setFile(getOrCreateCompileUnit(TDT->getDecl()->getLocation()));
335    DTy->setLine(Line);
336    DTy->setName(TyName);
337    DTy->setFromType(FromTy);
338  }
339
340  return DTy;
341}
342
343llvm::TypeDesc *
344CGDebugInfo::getOrCreateFunctionType(QualType type, llvm::CompileUnitDesc *Unit)
345{
346  llvm::CompositeTypeDesc *SubrTy =
347    new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_subroutine_type);
348
349  // Prepare to add the arguments for the subroutine.
350  std::vector<llvm::DebugInfoDesc *> &Elements = SubrTy->getElements();
351
352  // Get result type.
353  const FunctionType *FT = type->getAsFunctionType();
354  llvm::TypeDesc *ArgTy = getOrCreateType(FT->getResultType(), Unit);
355  if (ArgTy) Elements.push_back(ArgTy);
356
357  // Set up remainder of arguments.
358  if (type->getTypeClass() == Type::FunctionProto) {
359    const FunctionTypeProto *FTPro = dyn_cast<FunctionTypeProto>(type);
360    for (unsigned int i =0; i < FTPro->getNumArgs(); i++) {
361      QualType ParamType = FTPro->getArgType(i);
362      ArgTy = getOrCreateType(ParamType, Unit);
363      if (ArgTy) Elements.push_back(ArgTy);
364    }
365  }
366
367  // FIXME: set other fields file, line here.
368  SubrTy->setContext(Unit);
369
370  return SubrTy;
371}
372
373/// getOrCreateRecordType - get structure or union type.
374llvm::TypeDesc *
375CGDebugInfo::getOrCreateRecordType(QualType type, llvm::CompileUnitDesc *Unit)
376{
377  llvm::CompositeTypeDesc *RecType;
378  if(type->isStructureType())
379    RecType = new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_structure_type);
380  else if(type->isUnionType())
381    RecType = new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_union_type);
382  else
383    return NULL;
384
385  RecordDecl *RecDecl = type->getAsRecordType()->getDecl();
386  const ASTRecordLayout &RL = M->getContext().getASTRecordLayout(RecDecl);
387
388  SourceManager &SM = M->getContext().getSourceManager();
389  uint64_t Line = SM.getLogicalLineNumber(RecDecl->getLocation());
390
391  std::vector<llvm::DebugInfoDesc *> &Elements = RecType->getElements();
392
393  // Add the members.
394  int NumMembers = RecDecl->getNumMembers();
395  for (int i = 0; i < NumMembers; i++) {
396    FieldDecl *Member = RecDecl->getMember(i);
397    llvm::TypeDesc *MemberTy = getOrCreateType(Member->getType(), Unit);
398    MemberTy->setOffset(RL.getFieldOffset(i));
399    Elements.push_back(MemberTy);
400  }
401
402  // Fill in the blanks.
403  if(RecType) {
404    RecType->setContext(Unit);
405    RecType->setName(RecDecl->getName());
406    RecType->setFile(getOrCreateCompileUnit(RecDecl->getLocation()));
407    RecType->setLine(Line);
408    RecType->setSize(RL.getSize());
409    RecType->setAlign(RL.getAlignment());
410    RecType->setOffset(0);
411  }
412  return(RecType);
413}
414
415/// getOrCreateEnumType - get Enum type.
416llvm::TypeDesc *
417CGDebugInfo::getOrCreateEnumType(QualType type, llvm::CompileUnitDesc *Unit)
418{
419  llvm::CompositeTypeDesc *EnumTy
420    = new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_enumeration_type);
421
422  EnumType *EType = dyn_cast<EnumType>(type);
423  if (!EType) return(NULL);
424
425  EnumDecl *EDecl = EType->getDecl();
426  SourceManager &SM = M->getContext().getSourceManager();
427  uint64_t Line = SM.getLogicalLineNumber(EDecl->getLocation());
428
429  // Size, align and offset of the type.
430  uint64_t Size = M->getContext().getTypeSize(type);
431  uint64_t Align = M->getContext().getTypeAlign(type);
432
433  // Create descriptors for enum members.
434  std::vector<llvm::DebugInfoDesc *> &Elements = EnumTy->getElements();
435  EnumConstantDecl *ElementList = EDecl->getEnumConstantList();
436  while (ElementList) {
437    llvm::EnumeratorDesc *EnumDesc = new llvm::EnumeratorDesc();
438    // push it to the enum desc list so that we can free it later.
439    EnumDescList.push_back(EnumDesc);
440
441    const char *ElementName = ElementList->getName();
442    uint64_t Value = ElementList->getInitVal().getZExtValue();
443
444    EnumDesc->setName(ElementName);
445    EnumDesc->setValue(Value);
446    Elements.push_back(EnumDesc);
447    if (ElementList->getNextDeclarator())
448      ElementList
449        = dyn_cast<EnumConstantDecl>(ElementList->getNextDeclarator());
450    else
451      break;
452  }
453
454  // Fill in the blanks.
455  if (EnumTy) {
456    EnumTy->setContext(Unit);
457    EnumTy->setName(EDecl->getName());
458    EnumTy->setSize(Size);
459    EnumTy->setAlign(Align);
460    EnumTy->setOffset(0);
461    EnumTy->setFile(getOrCreateCompileUnit(EDecl->getLocation()));
462    EnumTy->setLine(Line);
463  }
464  return EnumTy;
465}
466
467/// getOrCreateArrayType - get or create array types.
468llvm::TypeDesc *
469CGDebugInfo::getOrCreateArrayType(QualType type, llvm::CompileUnitDesc *Unit)
470{
471  llvm::CompositeTypeDesc *ArrayTy
472    = new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_array_type);
473
474  // Size, align and offset of the type.
475  uint64_t Size = M->getContext().getTypeSize(type);
476  uint64_t Align = M->getContext().getTypeAlign(type);
477
478  SourceManager &SM = M->getContext().getSourceManager();
479  uint64_t Line = SM.getLogicalLineNumber(CurLoc);
480
481  // Add the dimensions of the array.
482  std::vector<llvm::DebugInfoDesc *> &Elements = ArrayTy->getElements();
483  do {
484    llvm::SubrangeDesc *Subrange = new llvm::SubrangeDesc();
485
486    // push it back on the subrange desc list so that we can free it later.
487    SubrangeDescList.push_back(Subrange);
488
489    uint64_t Upper = 0;
490    if (type->getTypeClass() == Type::ConstantArray) {
491      const ConstantArrayType *ConstArrTy = type->getAsConstantArrayType();
492      Upper = ConstArrTy->getSize().getZExtValue() - 1;
493    }
494    Subrange->setLo(0);
495    Subrange->setHi(Upper);
496    Elements.push_back(Subrange);
497    type = type->getAsArrayType()->getElementType();
498  } while (type->isArrayType());
499
500  ArrayTy->setFromType(getOrCreateType(type, Unit));
501
502  if (ArrayTy) {
503    ArrayTy->setContext(Unit);
504    ArrayTy->setSize(Size);
505    ArrayTy->setAlign(Align);
506    ArrayTy->setOffset(0);
507    ArrayTy->setFile(getOrCreateCompileUnit(CurLoc));
508    ArrayTy->setLine(Line);
509  }
510  return ArrayTy;
511}
512
513
514/// getOrCreateTaggedType - get or create structure/union/Enum type.
515llvm::TypeDesc *
516CGDebugInfo::getOrCreateTaggedType(QualType type, llvm::CompileUnitDesc *Unit)
517{
518  if (type->isStructureType() || type->isUnionType())
519    return getOrCreateRecordType(type, Unit);
520  else if (type->isEnumeralType())
521    return getOrCreateEnumType(type, Unit);
522  else
523    return NULL;
524}
525
526/// getOrCreateType - Get the type from the cache or create a new
527/// one if necessary.
528llvm::TypeDesc *
529CGDebugInfo::getOrCreateType(QualType type, llvm::CompileUnitDesc *Unit)
530{
531  if (type.isNull())
532    return NULL;
533
534  // Check to see if the compile unit already has created this type.
535  llvm::TypeDesc *&Slot = TypeCache[type.getAsOpaquePtr()];
536  if (Slot) return Slot;
537
538  // We need to check for the CVR qualifiers as the first thing.
539  if (type.getCVRQualifiers()) {
540    Slot = getOrCreateCVRType (type, Unit);
541    return Slot;
542  }
543
544  // Work out details of type.
545  switch(type->getTypeClass()) {
546    case Type::Complex:
547    case Type::Reference:
548    case Type::Vector:
549    case Type::ExtVector:
550    case Type::ASQual:
551    case Type::ObjCInterface:
552    case Type::ObjCQualifiedInterface:
553    case Type::ObjCQualifiedId:
554    case Type::TypeOfExp:
555    case Type::TypeOfTyp:
556    default:
557    {
558      return NULL;
559    }
560
561    case Type::TypeName:
562      Slot = getOrCreateTypedefType(type, Unit);
563      break;
564
565    case Type::FunctionProto:
566    case Type::FunctionNoProto:
567      Slot = getOrCreateFunctionType(type, Unit);
568      break;
569
570    case Type::Builtin:
571      Slot = getOrCreateBuiltinType(type, Unit);
572      break;
573
574    case Type::Pointer:
575      Slot = getOrCreatePointerType(type, Unit);
576      break;
577
578    case Type::Tagged:
579      Slot = getOrCreateTaggedType(type, Unit);
580      break;
581
582    case Type::ConstantArray:
583    case Type::VariableArray:
584    case Type::IncompleteArray:
585      Slot = getOrCreateArrayType(type, Unit);
586      break;
587  }
588
589  return Slot;
590}
591
592/// EmitFunctionStart - Constructs the debug code for entering a function -
593/// "llvm.dbg.func.start.".
594void CGDebugInfo::EmitFunctionStart(const FunctionDecl *FnDecl,
595                                    llvm::Function *Fn,
596                                    llvm::IRBuilder &Builder)
597{
598  // Create subprogram descriptor.
599  Subprogram = new llvm::SubprogramDesc();
600
601  // Make sure we have an anchor.
602  if (!SubprogramAnchor) {
603    SubprogramAnchor = new llvm::AnchorDesc(Subprogram);
604  }
605
606  // Get name information.
607  Subprogram->setName(FnDecl->getName());
608  Subprogram->setFullName(FnDecl->getName());
609
610  // Gather location information.
611  llvm::CompileUnitDesc *Unit = getOrCreateCompileUnit(CurLoc);
612  SourceManager &SM = M->getContext().getSourceManager();
613  uint64_t Loc = SM.getLogicalLineNumber(CurLoc);
614
615  // Get Function Type.
616  QualType type = FnDecl->getResultType();
617  llvm::TypeDesc *SPTy = getOrCreateType(type, Unit);
618
619  Subprogram->setAnchor(SubprogramAnchor);
620  Subprogram->setContext(Unit);
621  Subprogram->setFile(Unit);
622  Subprogram->setLine(Loc);
623  Subprogram->setType(SPTy);
624  Subprogram->setIsStatic(Fn->hasInternalLinkage());
625  Subprogram->setIsDefinition(true);
626
627  // Lazily construct llvm.dbg.func.start.
628  if (!FuncStartFn)
629    FuncStartFn = llvm::Intrinsic::getDeclaration(&M->getModule(),
630                    llvm::Intrinsic::dbg_func_start);
631
632  // Call llvm.dbg.func.start which also implicitly calls llvm.dbg.stoppoint.
633  Builder.CreateCall(FuncStartFn, getCastValueFor(Subprogram), "");
634
635  // Push function on region stack.
636  RegionStack.push_back(Subprogram);
637}
638
639
640void
641CGDebugInfo::EmitStopPoint(llvm::Function *Fn, llvm::IRBuilder &Builder)
642{
643  if (CurLoc.isInvalid() || CurLoc.isMacroID()) return;
644
645  // Don't bother if things are the same as last time.
646  SourceManager &SM = M->getContext().getSourceManager();
647  if (CurLoc == PrevLoc
648       || (SM.getLineNumber(CurLoc) == SM.getLineNumber(PrevLoc)
649           && SM.isFromSameFile(CurLoc, PrevLoc)))
650    return;
651
652  // Update last state.
653  PrevLoc = CurLoc;
654
655  // Get the appropriate compile unit.
656  llvm::CompileUnitDesc *Unit = getOrCreateCompileUnit(CurLoc);
657
658  // Lazily construct llvm.dbg.stoppoint function.
659  if (!StopPointFn)
660    StopPointFn = llvm::Intrinsic::getDeclaration(&M->getModule(),
661                                        llvm::Intrinsic::dbg_stoppoint);
662
663  uint64_t CurLineNo = SM.getLogicalLineNumber(CurLoc);
664  uint64_t ColumnNo = SM.getLogicalColumnNumber(CurLoc);
665
666  // Invoke llvm.dbg.stoppoint
667  Builder.CreateCall3(StopPointFn,
668                      llvm::ConstantInt::get(llvm::Type::Int32Ty, CurLineNo),
669                      llvm::ConstantInt::get(llvm::Type::Int32Ty, ColumnNo),
670                      getCastValueFor(Unit), "");
671}
672
673/// EmitRegionStart- Constructs the debug code for entering a declarative
674/// region - "llvm.dbg.region.start.".
675void CGDebugInfo::EmitRegionStart(llvm::Function *Fn, llvm::IRBuilder &Builder)
676{
677  llvm::BlockDesc *Block = new llvm::BlockDesc();
678  if (RegionStack.size() > 0)
679    Block->setContext(RegionStack.back());
680  RegionStack.push_back(Block);
681
682  // Lazily construct llvm.dbg.region.start function.
683  if (!RegionStartFn)
684    RegionStartFn = llvm::Intrinsic::getDeclaration(&M->getModule(),
685                                llvm::Intrinsic::dbg_region_start);
686
687  // Call llvm.dbg.func.start.
688  Builder.CreateCall(RegionStartFn, getCastValueFor(Block), "");
689}
690
691/// EmitRegionEnd - Constructs the debug code for exiting a declarative
692/// region - "llvm.dbg.region.end."
693void CGDebugInfo::EmitRegionEnd(llvm::Function *Fn, llvm::IRBuilder &Builder)
694{
695  // Lazily construct llvm.dbg.region.end function.
696  if (!RegionEndFn)
697    RegionEndFn =llvm::Intrinsic::getDeclaration(&M->getModule(),
698                                llvm::Intrinsic::dbg_region_end);
699
700  // Provide an region stop point.
701  EmitStopPoint(Fn, Builder);
702
703  // Call llvm.dbg.func.end.
704  llvm::DebugInfoDesc *DID = RegionStack.back();
705  Builder.CreateCall(RegionEndFn, getCastValueFor(DID), "");
706  RegionStack.pop_back();
707}
708
709/// EmitDeclare - Emit local variable declaration debug info.
710void CGDebugInfo::EmitDeclare(const VarDecl *decl, unsigned Tag,
711                              llvm::Value *AI,
712                              llvm::IRBuilder &Builder)
713{
714  // FIXME: If it is a compiler generated temporary then return.
715
716  // Construct llvm.dbg.declare function.
717  if (!DeclareFn)
718    DeclareFn = llvm::Intrinsic::getDeclaration(&M->getModule(),
719                        llvm::Intrinsic::dbg_declare);
720
721  // Get type information.
722  llvm::CompileUnitDesc *Unit = getOrCreateCompileUnit(CurLoc);
723  llvm::TypeDesc *TyDesc = getOrCreateType(decl->getType(), Unit);
724
725  SourceManager &SM = M->getContext().getSourceManager();
726  uint64_t Loc = SM.getLogicalLineNumber(CurLoc);
727
728  // Construct variable.
729  llvm::VariableDesc *Variable = new llvm::VariableDesc(Tag);
730  Variable->setContext(RegionStack.back());
731  Variable->setName(decl->getName());
732  Variable->setFile(Unit);
733  Variable->setLine(Loc);
734  Variable->setType(TyDesc);
735
736  // Push it onto the list so that we can free it.
737  VariableDescList.push_back(Variable);
738
739  // Cast the AllocA result to a {}* for the call to llvm.dbg.declare.
740  // These bit cast instructions will get freed when the basic block is
741  // deleted. So do not need to free them explicity.
742  const llvm::PointerType *EmpPtr = SR->getEmptyStructPtrType();
743  llvm::Value *AllocACast =  new llvm::BitCastInst(AI, EmpPtr, decl->getName(),
744                               Builder.GetInsertBlock());
745
746  // Call llvm.dbg.declare.
747  Builder.CreateCall2(DeclareFn, AllocACast, getCastValueFor(Variable), "");
748}
749
750/// EmitGlobalVariable - Emit information about a global variable.
751void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *GV,
752                                     const VarDecl *decl)
753{
754  // Create global variable debug descriptor.
755  llvm::GlobalVariableDesc *Global = new llvm::GlobalVariableDesc();
756
757  // Push it onto the list so that we can free it.
758  GlobalVarDescList.push_back(Global);
759
760  // Make sure we have an anchor.
761  if (!GlobalVariableAnchor)
762    GlobalVariableAnchor = new llvm::AnchorDesc(Global);
763
764  // Get name information.
765  Global->setName(decl->getName());
766  Global->setFullName(decl->getName());
767
768  llvm::CompileUnitDesc *Unit = getOrCreateCompileUnit(CurLoc);
769  SourceManager &SM = M->getContext().getSourceManager();
770  uint64_t Loc = SM.getLogicalLineNumber(CurLoc);
771
772  llvm::TypeDesc *TyD = getOrCreateType(decl->getType(), Unit);
773
774  // Fill in the Global information.
775  Global->setAnchor(GlobalVariableAnchor);
776  Global->setContext(Unit);
777  Global->setFile(Unit);
778  Global->setLine(Loc);
779  Global->setType(TyD);
780  Global->setIsDefinition(true);
781  Global->setIsStatic(GV->hasInternalLinkage());
782  Global->setGlobalVariable(GV);
783
784  // Make sure global is created if needed.
785  getValueFor(Global);
786}
787
788