CGDebugInfo.cpp revision 32ea35fee916ed73fe343bad2de9a609eb2cca38
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, RegionStack()
47, Subprogram(NULL)
48{
49  SR = new llvm::DISerializer();
50  SR->setModule (&M->getModule());
51}
52
53CGDebugInfo::~CGDebugInfo()
54{
55  delete SR;
56
57  // Free CompileUnitCache.
58  for (std::map<unsigned, llvm::CompileUnitDesc *>::iterator I
59       = CompileUnitCache.begin(); I != CompileUnitCache.end(); ++I) {
60    delete I->second;
61  }
62  CompileUnitCache.clear();
63
64  // Free TypeCache.
65  for (std::map<void *, llvm::TypeDesc *>::iterator I
66       = TypeCache.begin(); I != TypeCache.end(); ++I) {
67    delete I->second;
68  }
69  TypeCache.clear();
70
71  for (std::vector<llvm::DebugInfoDesc *>::iterator I
72       = RegionStack.begin(); I != RegionStack.end(); ++I) {
73    delete *I;
74  }
75
76  delete CompileUnitAnchor;
77  delete SubprogramAnchor;
78}
79
80void CGDebugInfo::setLocation(SourceLocation loc)
81{
82  SourceManager &SM = M->getContext().getSourceManager();
83  CurLoc = SM.getLogicalLoc(loc);
84}
85
86/// getCastValueFor - Return a llvm representation for a given debug information
87/// descriptor cast to an empty struct pointer.
88llvm::Value *CGDebugInfo::getCastValueFor(llvm::DebugInfoDesc *DD) {
89  return llvm::ConstantExpr::getBitCast(SR->Serialize(DD),
90                                        SR->getEmptyStructPtrType());
91}
92
93/// getValueFor - Return a llvm representation for a given debug information
94/// descriptor.
95llvm::Value *CGDebugInfo::getValueFor(llvm::DebugInfoDesc *DD) {
96  return SR->Serialize(DD);
97}
98
99/// getOrCreateCompileUnit - Get the compile unit from the cache or create a new
100/// one if necessary.
101llvm::CompileUnitDesc
102*CGDebugInfo::getOrCreateCompileUnit(const SourceLocation Loc) {
103
104  // See if this compile unit has been used before.
105  llvm::CompileUnitDesc *&Slot = CompileUnitCache[Loc.getFileID()];
106  if (Slot) return Slot;
107
108  // Create new compile unit.
109  // FIXME: Where to free these?
110  // One way is to iterate over the CompileUnitCache in ~CGDebugInfo.
111  llvm::CompileUnitDesc *Unit = new llvm::CompileUnitDesc();
112
113  // Make sure we have an anchor.
114  if (!CompileUnitAnchor) {
115    CompileUnitAnchor = new llvm::AnchorDesc(Unit);
116  }
117
118  // Get source file information.
119  SourceManager &SM = M->getContext().getSourceManager();
120  const FileEntry *FE = SM.getFileEntryForLoc(Loc);
121  const char *FileName, *DirName;
122  if (FE) {
123    FileName = FE->getName();
124    DirName = FE->getDir()->getName();
125  } else {
126    FileName = SM.getSourceName(Loc);
127    DirName = "";
128  }
129
130  Unit->setAnchor(CompileUnitAnchor);
131  Unit->setFileName(FileName);
132  Unit->setDirectory(DirName);
133
134  // Set up producer name.
135  // FIXME: Do not know how to get clang version yet.
136  Unit->setProducer("clang");
137
138  // Set up Language number.
139  // FIXME: Handle other languages as well.
140  Unit->setLanguage(llvm::dwarf::DW_LANG_C89);
141
142  // Update cache.
143  Slot = Unit;
144
145  return Unit;
146}
147
148
149llvm::TypeDesc *
150CGDebugInfo::getOrCreateCVRType(QualType type, llvm::CompileUnitDesc *Unit)
151{
152  // We will create a Derived type.
153  llvm::DerivedTypeDesc *DTy = NULL;
154  llvm::TypeDesc *FromTy = NULL;
155
156  if (type.isConstQualified()) {
157    DTy = new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_const_type);
158    type.removeConst();
159    FromTy = getOrCreateType(type, Unit);
160  } else if (type.isVolatileQualified()) {
161    DTy = new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_volatile_type);
162    type.removeVolatile();
163    FromTy = getOrCreateType(type, Unit);
164  } else if (type.isRestrictQualified()) {
165    DTy = new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_restrict_type);
166    type.removeRestrict();
167    FromTy = getOrCreateType(type, Unit);
168  }
169
170  // No need to fill in the Name, Line, Size, Alignment, Offset in case of        // CVR derived types.
171  DTy->setContext(Unit);
172  DTy->setFromType(FromTy);
173
174  return DTy;
175}
176
177
178/// getOrCreateType - Get the Basic type from the cache or create a new
179/// one if necessary.
180llvm::TypeDesc *
181CGDebugInfo::getOrCreateBuiltinType(QualType type, llvm::CompileUnitDesc *Unit)
182{
183  assert (type->getTypeClass() == Type::Builtin);
184
185  const BuiltinType *BT = type->getAsBuiltinType();
186
187  unsigned Encoding = 0;
188  switch (BT->getKind())
189  {
190    case BuiltinType::Void:
191      return NULL;
192    case BuiltinType::UChar:
193    case BuiltinType::Char_U:
194      Encoding = llvm::dwarf::DW_ATE_unsigned_char;
195      break;
196    case BuiltinType::Char_S:
197    case BuiltinType::SChar:
198      Encoding = llvm::dwarf::DW_ATE_signed_char;
199      break;
200    case BuiltinType::UShort:
201    case BuiltinType::UInt:
202    case BuiltinType::ULong:
203    case BuiltinType::ULongLong:
204      Encoding = llvm::dwarf::DW_ATE_unsigned;
205      break;
206    case BuiltinType::Short:
207    case BuiltinType::Int:
208    case BuiltinType::Long:
209    case BuiltinType::LongLong:
210      Encoding = llvm::dwarf::DW_ATE_signed;
211      break;
212    case BuiltinType::Bool:
213      Encoding = llvm::dwarf::DW_ATE_boolean;
214      break;
215    case BuiltinType::Float:
216    case BuiltinType::Double:
217      Encoding = llvm::dwarf::DW_ATE_float;
218      break;
219    default:
220      Encoding = llvm::dwarf::DW_ATE_signed;
221      break;
222  }
223
224  // Ty will have contain the resulting type.
225  llvm::BasicTypeDesc *BTy = new llvm::BasicTypeDesc();
226
227  // Get the name and location early to assist debugging.
228  const char *TyName = BT->getName();
229
230  // Bit size, align and offset of the type.
231  uint64_t Size = M->getContext().getTypeSize(type);
232  uint64_t Align = M->getContext().getTypeAlign(type);
233  uint64_t Offset = 0;
234
235  // If the type is defined, fill in the details.
236  if (BTy) {
237    BTy->setContext(Unit);
238    BTy->setName(TyName);
239    BTy->setSize(Size);
240    BTy->setAlign(Align);
241    BTy->setOffset(Offset);
242    BTy->setEncoding(Encoding);
243  }
244
245  return BTy;
246}
247
248llvm::TypeDesc *
249CGDebugInfo::getOrCreatePointerType(QualType type, llvm::CompileUnitDesc *Unit)
250{
251  // type*
252  llvm::DerivedTypeDesc *DTy =
253    new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_pointer_type);
254
255  // Handle the derived type.
256  const PointerType *PTRT = type->getAsPointerType();
257  llvm::TypeDesc *FromTy = getOrCreateType(PTRT->getPointeeType(), Unit);
258
259  // Get the name and location early to assist debugging.
260  SourceManager &SM = M->getContext().getSourceManager();
261  uint64_t Line = SM.getLogicalLineNumber(CurLoc);
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 (DTy) {
270    DTy->setContext(Unit);
271    DTy->setLine(Line);
272    DTy->setSize(Size);
273    DTy->setAlign(Align);
274    DTy->setOffset(Offset);
275    DTy->setFromType(FromTy);
276  }
277
278  return DTy;
279}
280
281llvm::TypeDesc *
282CGDebugInfo::getOrCreateTypedefType(QualType type, llvm::CompileUnitDesc *Unit)
283{
284  // typedefs are derived from some other type.
285  llvm::DerivedTypeDesc *DTy =
286    new llvm::DerivedTypeDesc(llvm::dwarf::DW_TAG_typedef);
287
288  // Handle derived type.
289  const TypedefType *TDT = type->getAsTypedefType();
290  llvm::TypeDesc *FromTy = getOrCreateType(TDT->LookThroughTypedefs(),
291                                               Unit);
292
293  // Get the name and location early to assist debugging.
294  const char *TyName = TDT->getDecl()->getName();
295  SourceManager &SM = M->getContext().getSourceManager();
296  uint64_t Line = SM.getLogicalLineNumber(TDT->getDecl()->getLocation());
297
298  // If the type is defined, fill in the details.
299  if (DTy) {
300    DTy->setContext(Unit);
301    DTy->setFile(getOrCreateCompileUnit(TDT->getDecl()->getLocation()));
302    DTy->setLine(Line);
303    DTy->setName(TyName);
304    DTy->setFromType(FromTy);
305  }
306
307  return DTy;
308}
309
310llvm::TypeDesc *
311CGDebugInfo::getOrCreateFunctionType(QualType type, llvm::CompileUnitDesc *Unit)
312{
313  llvm::CompositeTypeDesc *SubrTy =
314    new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_subroutine_type);
315
316  // Prepare to add the arguments for the subroutine.
317  std::vector<llvm::DebugInfoDesc *> &Elements = SubrTy->getElements();
318
319  // Get result type.
320  const FunctionType *FT = type->getAsFunctionType();
321  llvm::TypeDesc *ArgTy = getOrCreateType(FT->getResultType(), Unit);
322  if (ArgTy) Elements.push_back(ArgTy);
323
324  // Set up remainder of arguments.
325  if (type->getTypeClass() == Type::FunctionProto) {
326    const FunctionTypeProto *FTPro = dyn_cast<FunctionTypeProto>(type);
327    for (unsigned int i =0; i < FTPro->getNumArgs(); i++) {
328      QualType ParamType = FTPro->getArgType(i);
329      ArgTy = getOrCreateType(ParamType, Unit);
330      if (ArgTy) Elements.push_back(ArgTy);
331    }
332  }
333
334  // FIXME: set other fields file, line here.
335  SubrTy->setContext(Unit);
336
337  return SubrTy;
338}
339
340
341
342/// getOrCreateType - Get the type from the cache or create a new
343/// one if necessary.
344llvm::TypeDesc *
345CGDebugInfo::getOrCreateType(QualType type, llvm::CompileUnitDesc *Unit)
346{
347  // TODO: Re-enable once we can generate all types
348  return 0;
349  if (type.isNull())
350    return NULL;
351
352  // Check to see if the compile unit already has created this type.
353  llvm::TypeDesc *&Slot = TypeCache[type.getAsOpaquePtr()];
354  if (Slot) return Slot;
355
356  // We need to check for the CVR qualifiers as the first thing.
357  if (type.getCVRQualifiers()) {
358    Slot = getOrCreateCVRType (type, Unit);
359    return Slot;
360  }
361
362  // Work out details of type.
363  switch(type->getTypeClass()) {
364    case Type::Complex:
365    case Type::Reference:
366    case Type::ConstantArray:
367    case Type::VariableArray:
368    case Type::IncompleteArray:
369    case Type::Vector:
370    case Type::ExtVector:
371    case Type::Tagged:
372    case Type::ASQual:
373    case Type::ObjCInterface:
374    case Type::ObjCQualifiedInterface:
375    case Type::ObjCQualifiedId:
376    case Type::TypeOfExp:
377    case Type::TypeOfTyp:
378    default:
379    {
380      assert (0 && "Unsupported type");
381      return NULL;
382    }
383
384    case Type::TypeName:
385      Slot = getOrCreateTypedefType(type, Unit);
386      break;
387
388    case Type::FunctionProto:
389    case Type::FunctionNoProto:
390      Slot = getOrCreateFunctionType(type, Unit);
391      break;
392
393    case Type::Builtin:
394      Slot = getOrCreateBuiltinType(type, Unit);
395      break;
396
397    case Type::Pointer:
398      Slot = getOrCreatePointerType(type, Unit);
399      break;
400  }
401
402  return Slot;
403}
404
405/// EmitFunctionStart - Constructs the debug code for entering a function -
406/// "llvm.dbg.func.start.".
407void CGDebugInfo::EmitFunctionStart(const FunctionDecl *FnDecl,
408                                    llvm::Function *Fn,
409                                    llvm::IRBuilder &Builder)
410{
411  // Create subprogram descriptor.
412  Subprogram = new llvm::SubprogramDesc();
413
414  // Make sure we have an anchor.
415  if (!SubprogramAnchor) {
416    SubprogramAnchor = new llvm::AnchorDesc(Subprogram);
417  }
418
419  // Get name information.
420  Subprogram->setName(FnDecl->getName());
421  Subprogram->setFullName(FnDecl->getName());
422
423  // Gather location information.
424  llvm::CompileUnitDesc *Unit = getOrCreateCompileUnit(CurLoc);
425  SourceManager &SM = M->getContext().getSourceManager();
426  uint64_t Loc = SM.getLogicalLineNumber(CurLoc);
427
428  // Get Function Type.
429  QualType type = FnDecl->getResultType();
430  llvm::TypeDesc *SPTy = getOrCreateType(type, Unit);
431
432  Subprogram->setAnchor(SubprogramAnchor);
433  Subprogram->setContext(Unit);
434  Subprogram->setFile(Unit);
435  Subprogram->setLine(Loc);
436  Subprogram->setType(SPTy);
437  Subprogram->setIsStatic(Fn->hasInternalLinkage());
438  Subprogram->setIsDefinition(true);
439
440  // Lazily construct llvm.dbg.func.start.
441  if (!FuncStartFn)
442    FuncStartFn = llvm::Intrinsic::getDeclaration(&M->getModule(),
443                    llvm::Intrinsic::dbg_func_start);
444
445  // Call llvm.dbg.func.start which also implicitly calls llvm.dbg.stoppoint.
446  Builder.CreateCall(FuncStartFn, getCastValueFor(Subprogram), "");
447
448  // Push function on region stack.
449  RegionStack.push_back(Subprogram);
450}
451
452
453void
454CGDebugInfo::EmitStopPoint(llvm::Function *Fn, llvm::IRBuilder &Builder)
455{
456  if (CurLoc.isInvalid() || CurLoc.isMacroID()) return;
457
458  // Don't bother if things are the same as last time.
459  SourceManager &SM = M->getContext().getSourceManager();
460  if (CurLoc == PrevLoc
461       || (SM.getLineNumber(CurLoc) == SM.getLineNumber(PrevLoc)
462           && SM.isFromSameFile(CurLoc, PrevLoc)))
463    return;
464
465  // Update last state.
466  PrevLoc = CurLoc;
467
468  // Get the appropriate compile unit.
469  llvm::CompileUnitDesc *Unit = getOrCreateCompileUnit(CurLoc);
470
471  // Lazily construct llvm.dbg.stoppoint function.
472  if (!StopPointFn)
473    StopPointFn = llvm::Intrinsic::getDeclaration(&M->getModule(),
474                                        llvm::Intrinsic::dbg_stoppoint);
475
476  uint64_t CurLineNo = SM.getLogicalLineNumber(CurLoc);
477  uint64_t ColumnNo = SM.getLogicalColumnNumber(CurLoc);
478
479  // Invoke llvm.dbg.stoppoint
480  Builder.CreateCall3(StopPointFn,
481                      llvm::ConstantInt::get(llvm::Type::Int32Ty, CurLineNo),
482                      llvm::ConstantInt::get(llvm::Type::Int32Ty, ColumnNo),
483                      getCastValueFor(Unit), "");
484}
485
486/// EmitRegionStart- Constructs the debug code for entering a declarative
487/// region - "llvm.dbg.region.start.".
488void CGDebugInfo::EmitRegionStart(llvm::Function *Fn, llvm::IRBuilder &Builder)
489{
490  llvm::BlockDesc *Block = new llvm::BlockDesc();
491  if (RegionStack.size() > 0)
492    Block->setContext(RegionStack.back());
493  RegionStack.push_back(Block);
494
495  // Lazily construct llvm.dbg.region.start function.
496  if (!RegionStartFn)
497    RegionStartFn = llvm::Intrinsic::getDeclaration(&M->getModule(),
498                                llvm::Intrinsic::dbg_region_start);
499
500  // Call llvm.dbg.func.start.
501  Builder.CreateCall(RegionStartFn, getCastValueFor(Block), "");
502}
503
504/// EmitRegionEnd - Constructs the debug code for exiting a declarative
505/// region - "llvm.dbg.region.end."
506void CGDebugInfo::EmitRegionEnd(llvm::Function *Fn, llvm::IRBuilder &Builder)
507{
508  // Lazily construct llvm.dbg.region.end function.
509  if (!RegionEndFn)
510    RegionEndFn =llvm::Intrinsic::getDeclaration(&M->getModule(),
511                                llvm::Intrinsic::dbg_region_end);
512
513  // Provide an region stop point.
514  EmitStopPoint(Fn, Builder);
515
516  // Call llvm.dbg.func.end.
517  llvm::DebugInfoDesc *DID = RegionStack.back();
518  Builder.CreateCall(RegionEndFn, getCastValueFor(DID), "");
519  RegionStack.pop_back();
520}
521
522