CGDebugInfo.cpp revision 33e4e70c8c0a17e0ccb7465d96556b077a68ecb1
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 "CodeGenFunction.h"
16#include "CodeGenModule.h"
17#include "clang/AST/ASTContext.h"
18#include "clang/AST/DeclFriend.h"
19#include "clang/AST/DeclObjC.h"
20#include "clang/AST/DeclTemplate.h"
21#include "clang/AST/Expr.h"
22#include "clang/AST/RecordLayout.h"
23#include "clang/Basic/SourceManager.h"
24#include "clang/Basic/FileManager.h"
25#include "clang/Basic/Version.h"
26#include "clang/Frontend/CodeGenOptions.h"
27#include "llvm/Constants.h"
28#include "llvm/DerivedTypes.h"
29#include "llvm/Instructions.h"
30#include "llvm/Intrinsics.h"
31#include "llvm/Module.h"
32#include "llvm/ADT/StringExtras.h"
33#include "llvm/ADT/SmallVector.h"
34#include "llvm/Support/Dwarf.h"
35#include "llvm/System/Path.h"
36#include "llvm/Target/TargetMachine.h"
37using namespace clang;
38using namespace clang::CodeGen;
39
40CGDebugInfo::CGDebugInfo(CodeGenModule &CGM)
41  : CGM(CGM), DebugFactory(CGM.getModule()),
42    BlockLiteralGenericSet(false) {
43  CreateCompileUnit();
44}
45
46CGDebugInfo::~CGDebugInfo() {
47  assert(RegionStack.empty() && "Region stack mismatch, stack not empty!");
48}
49
50void CGDebugInfo::setLocation(SourceLocation Loc) {
51  if (Loc.isValid())
52    CurLoc = CGM.getContext().getSourceManager().getInstantiationLoc(Loc);
53}
54
55/// getContextDescriptor - Get context info for the decl.
56llvm::DIDescriptor CGDebugInfo::getContextDescriptor(const Decl *Context,
57                                              llvm::DIDescriptor &CompileUnit) {
58  if (!Context)
59    return CompileUnit;
60
61  llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator
62    I = RegionMap.find(Context);
63  if (I != RegionMap.end())
64    return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(&*I->second));
65
66  // Check namespace.
67  if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context))
68    return llvm::DIDescriptor(getOrCreateNameSpace(NSDecl, CompileUnit));
69
70  if (const RecordDecl *RDecl = dyn_cast<RecordDecl>(Context)) {
71    if (!RDecl->isDependentType()) {
72      llvm::DIType Ty = getOrCreateType(CGM.getContext().getTypeDeclType(RDecl),
73                                        llvm::DIFile(CompileUnit));
74      return llvm::DIDescriptor(Ty);
75    }
76  }
77  return CompileUnit;
78}
79
80/// getFunctionName - Get function name for the given FunctionDecl. If the
81/// name is constructred on demand (e.g. C++ destructor) then the name
82/// is stored on the side.
83llvm::StringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) {
84  assert (FD && "Invalid FunctionDecl!");
85  IdentifierInfo *FII = FD->getIdentifier();
86  if (FII)
87    return FII->getName();
88
89  // Otherwise construct human readable name for debug info.
90  std::string NS = FD->getNameAsString();
91
92  // Copy this name on the side and use its reference.
93  char *StrPtr = DebugInfoNames.Allocate<char>(NS.length());
94  memcpy(StrPtr, NS.data(), NS.length());
95  return llvm::StringRef(StrPtr, NS.length());
96}
97
98llvm::StringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) {
99  llvm::SmallString<256> MethodName;
100  llvm::raw_svector_ostream OS(MethodName);
101  OS << (OMD->isInstanceMethod() ? '-' : '+') << '[';
102  const DeclContext *DC = OMD->getDeclContext();
103  if (const ObjCImplementationDecl *OID =
104      dyn_cast<const ObjCImplementationDecl>(DC)) {
105     OS << OID->getName();
106  } else if (const ObjCInterfaceDecl *OID =
107             dyn_cast<const ObjCInterfaceDecl>(DC)) {
108      OS << OID->getName();
109  } else if (const ObjCCategoryImplDecl *OCD =
110             dyn_cast<const ObjCCategoryImplDecl>(DC)){
111      OS << ((NamedDecl *)OCD)->getIdentifier()->getNameStart() << '(' <<
112          OCD->getIdentifier()->getNameStart() << ')';
113  }
114  OS << ' ' << OMD->getSelector().getAsString() << ']';
115
116  char *StrPtr = DebugInfoNames.Allocate<char>(OS.tell());
117  memcpy(StrPtr, MethodName.begin(), OS.tell());
118  return llvm::StringRef(StrPtr, OS.tell());
119}
120
121/// getClassName - Get class name including template argument list.
122llvm::StringRef
123CGDebugInfo::getClassName(RecordDecl *RD) {
124  ClassTemplateSpecializationDecl *Spec
125    = dyn_cast<ClassTemplateSpecializationDecl>(RD);
126  if (!Spec)
127    return RD->getName();
128
129  const TemplateArgument *Args;
130  unsigned NumArgs;
131  std::string Buffer;
132  if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) {
133    const TemplateSpecializationType *TST =
134      cast<TemplateSpecializationType>(TAW->getType());
135    Args = TST->getArgs();
136    NumArgs = TST->getNumArgs();
137  } else {
138    const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
139    Args = TemplateArgs.data();
140    NumArgs = TemplateArgs.size();
141  }
142  Buffer = RD->getIdentifier()->getNameStart();
143  PrintingPolicy Policy(CGM.getLangOptions());
144  Buffer += TemplateSpecializationType::PrintTemplateArgumentList(Args,
145                                                                  NumArgs,
146                                                                  Policy);
147
148  // Copy this name on the side and use its reference.
149  char *StrPtr = DebugInfoNames.Allocate<char>(Buffer.length());
150  memcpy(StrPtr, Buffer.data(), Buffer.length());
151  return llvm::StringRef(StrPtr, Buffer.length());
152}
153
154/// getOrCreateFile - Get the file debug info descriptor for the input location.
155llvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
156  SourceManager &SM = CGM.getContext().getSourceManager();
157  PresumedLoc PLoc = SM.getPresumedLoc(Loc);
158
159  if (PLoc.isInvalid())
160    // If the location is not valid then use main input file.
161    return DebugFactory.CreateFile(TheCU.getFilename(), TheCU.getDirectory(),
162                                   TheCU);
163
164  // Cache the results.
165  const char *fname = PLoc.getFilename();
166  llvm::DenseMap<const char *, llvm::WeakVH>::iterator it =
167    DIFileCache.find(fname);
168
169  if (it != DIFileCache.end()) {
170    // Verify that the information still exists.
171    if (&*it->second)
172      return llvm::DIFile(cast<llvm::MDNode>(it->second));
173  }
174
175  llvm::DIFile F = DebugFactory.CreateFile(PLoc.getFilename(),
176                                           getCurrentDirname(), TheCU);
177
178  DIFileCache[fname] = F;
179  return F;
180
181}
182
183/// getOrCreateMainFile - Get the file info for main compile unit.
184llvm::DIFile CGDebugInfo::getOrCreateMainFile() {
185  return DebugFactory.CreateFile(TheCU.getFilename(), TheCU.getDirectory(),
186                                 TheCU);
187}
188
189/// getLineNumber - Get line number for the location. If location is invalid
190/// then use current location.
191unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) {
192  assert (CurLoc.isValid() && "Invalid current location!");
193  SourceManager &SM = CGM.getContext().getSourceManager();
194  PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
195  return PLoc.isValid()? PLoc.getLine() : 0;
196}
197
198/// getColumnNumber - Get column number for the location. If location is
199/// invalid then use current location.
200unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc) {
201  assert (CurLoc.isValid() && "Invalid current location!");
202  SourceManager &SM = CGM.getContext().getSourceManager();
203  PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
204  return PLoc.isValid()? PLoc.getColumn() : 0;
205}
206
207llvm::StringRef CGDebugInfo::getCurrentDirname() {
208  if (!CWDName.empty())
209    return CWDName;
210  char *CompDirnamePtr = NULL;
211  llvm::sys::Path CWD = llvm::sys::Path::GetCurrentDirectory();
212  CompDirnamePtr = DebugInfoNames.Allocate<char>(CWD.size());
213  memcpy(CompDirnamePtr, CWD.c_str(), CWD.size());
214  return CWDName = llvm::StringRef(CompDirnamePtr, CWD.size());
215}
216
217/// CreateCompileUnit - Create new compile unit.
218void CGDebugInfo::CreateCompileUnit() {
219
220  // Get absolute path name.
221  SourceManager &SM = CGM.getContext().getSourceManager();
222  std::string MainFileName = CGM.getCodeGenOpts().MainFileName;
223  if (MainFileName.empty())
224    MainFileName = "<unknown>";
225
226  // The main file name provided via the "-main-file-name" option contains just
227  // the file name itself with no path information. This file name may have had
228  // a relative path, so we look into the actual file entry for the main
229  // file to determine the real absolute path for the file.
230  std::string MainFileDir;
231  if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
232    MainFileDir = MainFile->getDir()->getName();
233    if (MainFileDir != ".")
234      MainFileName = MainFileDir + "/" + MainFileName;
235  }
236
237  // Save filename string.
238  char *FilenamePtr = DebugInfoNames.Allocate<char>(MainFileName.length());
239  memcpy(FilenamePtr, MainFileName.c_str(), MainFileName.length());
240  llvm::StringRef Filename(FilenamePtr, MainFileName.length());
241
242  unsigned LangTag;
243  const LangOptions &LO = CGM.getLangOptions();
244  if (LO.CPlusPlus) {
245    if (LO.ObjC1)
246      LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus;
247    else
248      LangTag = llvm::dwarf::DW_LANG_C_plus_plus;
249  } else if (LO.ObjC1) {
250    LangTag = llvm::dwarf::DW_LANG_ObjC;
251  } else if (LO.C99) {
252    LangTag = llvm::dwarf::DW_LANG_C99;
253  } else {
254    LangTag = llvm::dwarf::DW_LANG_C89;
255  }
256
257  std::string Producer = getClangFullVersion();
258
259  // Figure out which version of the ObjC runtime we have.
260  unsigned RuntimeVers = 0;
261  if (LO.ObjC1)
262    RuntimeVers = LO.ObjCNonFragileABI ? 2 : 1;
263
264  // Create new compile unit.
265  TheCU = DebugFactory.CreateCompileUnit(
266    LangTag, Filename, getCurrentDirname(),
267    Producer, true,
268    LO.Optimize, CGM.getCodeGenOpts().DwarfDebugFlags, RuntimeVers);
269}
270
271/// CreateType - Get the Basic type from the cache or create a new
272/// one if necessary.
273llvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) {
274  unsigned Encoding = 0;
275  const char *BTName = NULL;
276  switch (BT->getKind()) {
277  default:
278  case BuiltinType::Void:
279    return llvm::DIType();
280  case BuiltinType::ObjCClass:
281    return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type,
282                                            TheCU, "objc_class",
283                                            getOrCreateMainFile(), 0, 0, 0,
284                                            0, llvm::DIDescriptor::FlagFwdDecl,
285                                            llvm::DIType(), llvm::DIArray());
286  case BuiltinType::ObjCId: {
287    // typedef struct objc_class *Class;
288    // typedef struct objc_object {
289    //  Class isa;
290    // } *id;
291
292    llvm::DIType OCTy =
293      DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type,
294                                       TheCU, "objc_class",
295                                       getOrCreateMainFile(), 0, 0, 0, 0,
296                                       llvm::DIDescriptor::FlagFwdDecl,
297                                       llvm::DIType(), llvm::DIArray());
298    unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
299
300    llvm::DIType ISATy =
301      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type,
302                                     TheCU, "", getOrCreateMainFile(),
303                                     0, Size, 0, 0, 0, OCTy);
304
305    llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
306
307    llvm::DIType FieldTy =
308      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, TheCU,
309                                     "isa", getOrCreateMainFile(),
310                                     0,Size, 0, 0, 0, ISATy);
311    EltTys.push_back(FieldTy);
312    llvm::DIArray Elements =
313      DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
314
315    return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type,
316                                            TheCU, "objc_object",
317                                            getOrCreateMainFile(),
318                                            0, 0, 0, 0, 0,
319                                            llvm::DIType(), Elements);
320  }
321  case BuiltinType::UChar:
322  case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break;
323  case BuiltinType::Char_S:
324  case BuiltinType::SChar: Encoding = llvm::dwarf::DW_ATE_signed_char; break;
325  case BuiltinType::UShort:
326  case BuiltinType::UInt:
327  case BuiltinType::ULong:
328  case BuiltinType::ULongLong: Encoding = llvm::dwarf::DW_ATE_unsigned; break;
329  case BuiltinType::Short:
330  case BuiltinType::Int:
331  case BuiltinType::Long:
332  case BuiltinType::LongLong:  Encoding = llvm::dwarf::DW_ATE_signed; break;
333  case BuiltinType::Bool:      Encoding = llvm::dwarf::DW_ATE_boolean; break;
334  case BuiltinType::Float:
335  case BuiltinType::LongDouble:
336  case BuiltinType::Double:    Encoding = llvm::dwarf::DW_ATE_float; break;
337  }
338
339  switch (BT->getKind()) {
340  case BuiltinType::Long:      BTName = "long int"; break;
341  case BuiltinType::LongLong:  BTName = "long long int"; break;
342  case BuiltinType::ULong:     BTName = "long unsigned int"; break;
343  case BuiltinType::ULongLong: BTName = "long long unsigned int"; break;
344  default:
345    BTName = BT->getName(CGM.getContext().getLangOptions());
346    break;
347  }
348  // Bit size, align and offset of the type.
349  uint64_t Size = CGM.getContext().getTypeSize(BT);
350  uint64_t Align = CGM.getContext().getTypeAlign(BT);
351  uint64_t Offset = 0;
352  llvm::DIType DbgTy =
353    DebugFactory.CreateBasicType(TheCU, BTName, getOrCreateMainFile(),
354                                 0, Size, Align, Offset, /*flags*/ 0, Encoding);
355  return DbgTy;
356}
357
358llvm::DIType CGDebugInfo::CreateType(const ComplexType *Ty,
359                                     llvm::DIFile Unit) {
360  // Bit size, align and offset of the type.
361  unsigned Encoding = llvm::dwarf::DW_ATE_complex_float;
362  if (Ty->isComplexIntegerType())
363    Encoding = llvm::dwarf::DW_ATE_lo_user;
364
365  uint64_t Size = CGM.getContext().getTypeSize(Ty);
366  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
367  uint64_t Offset = 0;
368
369  llvm::DIType DbgTy =
370    DebugFactory.CreateBasicType(TheCU, "complex", getOrCreateMainFile(),
371                                 0, Size, Align, Offset, /*flags*/ 0, Encoding);
372  return DbgTy;
373}
374
375/// CreateCVRType - Get the qualified type from the cache or create
376/// a new one if necessary.
377llvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit) {
378  QualifierCollector Qc;
379  const Type *T = Qc.strip(Ty);
380
381  // Ignore these qualifiers for now.
382  Qc.removeObjCGCAttr();
383  Qc.removeAddressSpace();
384
385  // We will create one Derived type for one qualifier and recurse to handle any
386  // additional ones.
387  unsigned Tag;
388  if (Qc.hasConst()) {
389    Tag = llvm::dwarf::DW_TAG_const_type;
390    Qc.removeConst();
391  } else if (Qc.hasVolatile()) {
392    Tag = llvm::dwarf::DW_TAG_volatile_type;
393    Qc.removeVolatile();
394  } else if (Qc.hasRestrict()) {
395    Tag = llvm::dwarf::DW_TAG_restrict_type;
396    Qc.removeRestrict();
397  } else {
398    assert(Qc.empty() && "Unknown type qualifier for debug info");
399    return getOrCreateType(QualType(T, 0), Unit);
400  }
401
402  llvm::DIType FromTy = getOrCreateType(Qc.apply(T), Unit);
403
404  // No need to fill in the Name, Line, Size, Alignment, Offset in case of
405  // CVR derived types.
406  llvm::DIType DbgTy =
407    DebugFactory.CreateDerivedType(Tag, Unit, "", Unit,
408                                   0, 0, 0, 0, 0, FromTy);
409  return DbgTy;
410}
411
412llvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty,
413                                     llvm::DIFile Unit) {
414  llvm::DIType DbgTy =
415    CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
416                          Ty->getPointeeType(), Unit);
417  return DbgTy;
418}
419
420llvm::DIType CGDebugInfo::CreateType(const PointerType *Ty,
421                                     llvm::DIFile Unit) {
422  return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
423                               Ty->getPointeeType(), Unit);
424}
425
426/// CreatePointeeType - Create PointTee type. If Pointee is a record
427/// then emit record's fwd if debug info size reduction is enabled.
428llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy,
429                                            llvm::DIFile Unit) {
430  if (!CGM.getCodeGenOpts().LimitDebugInfo)
431    return getOrCreateType(PointeeTy, Unit);
432
433  if (const RecordType *RTy = dyn_cast<RecordType>(PointeeTy)) {
434    RecordDecl *RD = RTy->getDecl();
435    unsigned RTag;
436    if (RD->isStruct())
437      RTag = llvm::dwarf::DW_TAG_structure_type;
438    else if (RD->isUnion())
439      RTag = llvm::dwarf::DW_TAG_union_type;
440    else {
441      assert(RD->isClass() && "Unknown RecordType!");
442      RTag = llvm::dwarf::DW_TAG_class_type;
443    }
444
445    llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation());
446    unsigned Line = getLineNumber(RD->getLocation());
447    llvm::DIDescriptor FDContext =
448      getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
449
450    return
451      DebugFactory.CreateCompositeType(RTag, FDContext, RD->getName(),
452                                       DefUnit, Line, 0, 0, 0,
453                                       llvm::DIType::FlagFwdDecl,
454                                       llvm::DIType(), llvm::DIArray());
455  }
456  return getOrCreateType(PointeeTy, Unit);
457
458}
459
460llvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag,
461                                                const Type *Ty,
462                                                QualType PointeeTy,
463                                                llvm::DIFile Unit) {
464  // Bit size, align and offset of the type.
465
466  // Size is always the size of a pointer. We can't use getTypeSize here
467  // because that does not return the correct value for references.
468  uint64_t Size =
469    CGM.getContext().Target.getPointerWidth(PointeeTy.getAddressSpace());
470  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
471
472  return DebugFactory.CreateDerivedType(Tag, Unit, "", Unit,
473                                        0, Size, Align, 0, 0,
474                                        CreatePointeeType(PointeeTy, Unit));
475
476}
477
478llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty,
479                                     llvm::DIFile Unit) {
480  if (BlockLiteralGenericSet)
481    return BlockLiteralGeneric;
482
483  unsigned Tag = llvm::dwarf::DW_TAG_structure_type;
484
485  llvm::SmallVector<llvm::DIDescriptor, 5> EltTys;
486
487  llvm::DIType FieldTy;
488
489  QualType FType;
490  uint64_t FieldSize, FieldOffset;
491  unsigned FieldAlign;
492
493  llvm::DIArray Elements;
494  llvm::DIType EltTy, DescTy;
495
496  FieldOffset = 0;
497  FType = CGM.getContext().UnsignedLongTy;
498  EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset));
499  EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset));
500
501  Elements = DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
502  EltTys.clear();
503
504  unsigned Flags = llvm::DIDescriptor::FlagAppleBlock;
505  unsigned LineNo = getLineNumber(CurLoc);
506
507  EltTy = DebugFactory.CreateCompositeType(Tag, Unit, "__block_descriptor",
508                                           Unit, LineNo, FieldOffset, 0, 0,
509                                           Flags, llvm::DIType(), Elements);
510
511  // Bit size, align and offset of the type.
512  uint64_t Size = CGM.getContext().getTypeSize(Ty);
513  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
514
515  DescTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type,
516                                          Unit, "", Unit,
517                                          LineNo, Size, Align, 0, 0, EltTy);
518
519  FieldOffset = 0;
520  FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
521  EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset));
522  FType = CGM.getContext().IntTy;
523  EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset));
524  EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset));
525  FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
526  EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset));
527
528  FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
529  FieldTy = DescTy;
530  FieldSize = CGM.getContext().getTypeSize(Ty);
531  FieldAlign = CGM.getContext().getTypeAlign(Ty);
532  FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
533                                           "__descriptor", Unit,
534                                           LineNo, FieldSize, FieldAlign,
535                                           FieldOffset, 0, FieldTy);
536  EltTys.push_back(FieldTy);
537
538  FieldOffset += FieldSize;
539  Elements = DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
540
541  EltTy = DebugFactory.CreateCompositeType(Tag, Unit, "__block_literal_generic",
542                                           Unit, LineNo, FieldOffset, 0, 0,
543                                           Flags, llvm::DIType(), Elements);
544
545  BlockLiteralGenericSet = true;
546  BlockLiteralGeneric
547    = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, Unit,
548                                     "", Unit,
549                                     LineNo, Size, Align, 0, 0, EltTy);
550  return BlockLiteralGeneric;
551}
552
553llvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty,
554                                     llvm::DIFile Unit) {
555  // Typedefs are derived from some other type.  If we have a typedef of a
556  // typedef, make sure to emit the whole chain.
557  llvm::DIType Src = getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit);
558
559  // We don't set size information, but do specify where the typedef was
560  // declared.
561  unsigned Line = getLineNumber(Ty->getDecl()->getLocation());
562
563  llvm::DIDescriptor TyContext
564    = getContextDescriptor(dyn_cast<Decl>(Ty->getDecl()->getDeclContext()),
565                           Unit);
566  llvm::DIType DbgTy =
567    DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_typedef,
568                                   TyContext,
569                                   Ty->getDecl()->getName(), Unit,
570                                   Line, 0, 0, 0, 0, Src);
571  return DbgTy;
572}
573
574llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty,
575                                     llvm::DIFile Unit) {
576  llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
577
578  // Add the result type at least.
579  EltTys.push_back(getOrCreateType(Ty->getResultType(), Unit));
580
581  // Set up remainder of arguments if there is a prototype.
582  // FIXME: IF NOT, HOW IS THIS REPRESENTED?  llvm-gcc doesn't represent '...'!
583  if (isa<FunctionNoProtoType>(Ty))
584    EltTys.push_back(DebugFactory.CreateUnspecifiedParameter());
585  else if (const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(Ty)) {
586    for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
587      EltTys.push_back(getOrCreateType(FTP->getArgType(i), Unit));
588  }
589
590  llvm::DIArray EltTypeArray =
591    DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
592
593  llvm::DIType DbgTy =
594    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
595                                     Unit, "", Unit,
596                                     0, 0, 0, 0, 0,
597                                     llvm::DIType(), EltTypeArray);
598  return DbgTy;
599}
600
601/// CollectRecordFields - A helper function to collect debug info for
602/// record fields. This is used while creating debug info entry for a Record.
603void CGDebugInfo::
604CollectRecordFields(const RecordDecl *RD, llvm::DIFile Unit,
605                    llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys) {
606  unsigned FieldNo = 0;
607  const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
608  for (RecordDecl::field_iterator I = RD->field_begin(),
609                                  E = RD->field_end();
610       I != E; ++I, ++FieldNo) {
611    FieldDecl *Field = *I;
612    llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit);
613    llvm::StringRef FieldName = Field->getName();
614
615    // Ignore unnamed fields. Do not ignore unnamed records.
616    if (FieldName.empty() && !isa<RecordType>(Field->getType()))
617      continue;
618
619    // Get the location for the field.
620    llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation());
621    unsigned FieldLine = getLineNumber(Field->getLocation());
622    QualType FType = Field->getType();
623    uint64_t FieldSize = 0;
624    unsigned FieldAlign = 0;
625    if (!FType->isIncompleteArrayType()) {
626
627      // Bit size, align and offset of the type.
628      FieldSize = CGM.getContext().getTypeSize(FType);
629      Expr *BitWidth = Field->getBitWidth();
630      if (BitWidth)
631        FieldSize = BitWidth->EvaluateAsInt(CGM.getContext()).getZExtValue();
632      FieldAlign =  CGM.getContext().getTypeAlign(FType);
633    }
634
635    uint64_t FieldOffset = RL.getFieldOffset(FieldNo);
636
637    unsigned Flags = 0;
638    AccessSpecifier Access = I->getAccess();
639    if (Access == clang::AS_private)
640      Flags |= llvm::DIDescriptor::FlagPrivate;
641    else if (Access == clang::AS_protected)
642      Flags |= llvm::DIDescriptor::FlagProtected;
643
644    // Create a DW_TAG_member node to remember the offset of this field in the
645    // struct.  FIXME: This is an absolutely insane way to capture this
646    // information.  When we gut debug info, this should be fixed.
647    FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
648                                             FieldName, FieldDefUnit,
649                                             FieldLine, FieldSize, FieldAlign,
650                                             FieldOffset, Flags, FieldTy);
651    EltTys.push_back(FieldTy);
652  }
653}
654
655/// getOrCreateMethodType - CXXMethodDecl's type is a FunctionType. This
656/// function type is not updated to include implicit "this" pointer. Use this
657/// routine to get a method type which includes "this" pointer.
658llvm::DIType
659CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method,
660                                   llvm::DIFile Unit) {
661  llvm::DIType FnTy
662    = getOrCreateType(QualType(Method->getType()->getAs<FunctionProtoType>(),
663                               0),
664                      Unit);
665
666  // Add "this" pointer.
667
668  llvm::DIArray Args = llvm::DICompositeType(FnTy).getTypeArray();
669  assert (Args.getNumElements() && "Invalid number of arguments!");
670
671  llvm::SmallVector<llvm::DIDescriptor, 16> Elts;
672
673  // First element is always return type. For 'void' functions it is NULL.
674  Elts.push_back(Args.getElement(0));
675
676  if (!Method->isStatic())
677  {
678        // "this" pointer is always first argument.
679        ASTContext &Context = CGM.getContext();
680        QualType ThisPtr =
681          Context.getPointerType(Context.getTagDeclType(Method->getParent()));
682        llvm::DIType ThisPtrType =
683          DebugFactory.CreateArtificialType(getOrCreateType(ThisPtr, Unit));
684
685        TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType;
686        Elts.push_back(ThisPtrType);
687    }
688
689  // Copy rest of the arguments.
690  for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i)
691    Elts.push_back(Args.getElement(i));
692
693  llvm::DIArray EltTypeArray =
694    DebugFactory.GetOrCreateArray(Elts.data(), Elts.size());
695
696  return
697    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
698                                     Unit, "", Unit,
699                                     0, 0, 0, 0, 0,
700                                     llvm::DIType(), EltTypeArray);
701}
702
703/// isFunctionLocalClass - Return true if CXXRecordDecl is defined
704/// inside a function.
705static bool isFunctionLocalClass(const CXXRecordDecl *RD) {
706  if (const CXXRecordDecl *NRD =
707      dyn_cast<CXXRecordDecl>(RD->getDeclContext()))
708    return isFunctionLocalClass(NRD);
709  else if (isa<FunctionDecl>(RD->getDeclContext()))
710    return true;
711  return false;
712
713}
714/// CreateCXXMemberFunction - A helper function to create a DISubprogram for
715/// a single member function GlobalDecl.
716llvm::DISubprogram
717CGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method,
718                                     llvm::DIFile Unit,
719                                     llvm::DIType RecordTy) {
720  bool IsCtorOrDtor =
721    isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method);
722
723  llvm::StringRef MethodName = getFunctionName(Method);
724  llvm::DIType MethodTy = getOrCreateMethodType(Method, Unit);
725
726  // Since a single ctor/dtor corresponds to multiple functions, it doesn't
727  // make sense to give a single ctor/dtor a linkage name.
728  llvm::StringRef MethodLinkageName;
729  if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent()))
730    MethodLinkageName = CGM.getMangledName(Method);
731
732  // Get the location for the method.
733  llvm::DIFile MethodDefUnit = getOrCreateFile(Method->getLocation());
734  unsigned MethodLine = getLineNumber(Method->getLocation());
735
736  // Collect virtual method info.
737  llvm::DIType ContainingType;
738  unsigned Virtuality = 0;
739  unsigned VIndex = 0;
740
741  if (Method->isVirtual()) {
742    if (Method->isPure())
743      Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual;
744    else
745      Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual;
746
747    // It doesn't make sense to give a virtual destructor a vtable index,
748    // since a single destructor has two entries in the vtable.
749    if (!isa<CXXDestructorDecl>(Method))
750      VIndex = CGM.getVTables().getMethodVTableIndex(Method);
751    ContainingType = RecordTy;
752  }
753
754  unsigned Flags = 0;
755  if (Method->isImplicit())
756    Flags |= llvm::DIDescriptor::FlagArtificial;
757  AccessSpecifier Access = Method->getAccess();
758  if (Access == clang::AS_private)
759    Flags |= llvm::DIDescriptor::FlagPrivate;
760  else if (Access == clang::AS_protected)
761    Flags |= llvm::DIDescriptor::FlagProtected;
762  if (const CXXConstructorDecl *CXXC = dyn_cast<CXXConstructorDecl>(Method)) {
763    if (CXXC->isExplicit())
764      Flags |= llvm::DIDescriptor::FlagExplicit;
765  } else if (const CXXConversionDecl *CXXC =
766             dyn_cast<CXXConversionDecl>(Method)) {
767    if (CXXC->isExplicit())
768      Flags |= llvm::DIDescriptor::FlagExplicit;
769  }
770  if (Method->hasPrototype())
771    Flags |= llvm::DIDescriptor::FlagPrototyped;
772
773  llvm::DISubprogram SP =
774    DebugFactory.CreateSubprogram(RecordTy , MethodName, MethodName,
775                                  MethodLinkageName,
776                                  MethodDefUnit, MethodLine,
777                                  MethodTy, /*isLocalToUnit=*/false,
778                                  /* isDefinition=*/ false,
779                                  Virtuality, VIndex, ContainingType,
780                                  Flags,
781                                  CGM.getLangOptions().Optimize);
782
783  // Don't cache ctors or dtors since we have to emit multiple functions for
784  // a single ctor or dtor.
785  if (!IsCtorOrDtor && Method->isThisDeclarationADefinition())
786    SPCache[Method] = llvm::WeakVH(SP);
787
788  return SP;
789}
790
791/// CollectCXXMemberFunctions - A helper function to collect debug info for
792/// C++ member functions.This is used while creating debug info entry for
793/// a Record.
794void CGDebugInfo::
795CollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit,
796                          llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys,
797                          llvm::DIType RecordTy) {
798  for(CXXRecordDecl::method_iterator I = RD->method_begin(),
799        E = RD->method_end(); I != E; ++I) {
800    const CXXMethodDecl *Method = *I;
801
802    if (Method->isImplicit() && !Method->isUsed())
803      continue;
804
805    EltTys.push_back(CreateCXXMemberFunction(Method, Unit, RecordTy));
806  }
807}
808
809/// CollectCXXFriends - A helper function to collect debug info for
810/// C++ base classes. This is used while creating debug info entry for
811/// a Record.
812void CGDebugInfo::
813CollectCXXFriends(const CXXRecordDecl *RD, llvm::DIFile Unit,
814                llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys,
815                llvm::DIType RecordTy) {
816
817  for (CXXRecordDecl::friend_iterator BI =  RD->friend_begin(),
818         BE = RD->friend_end(); BI != BE; ++BI) {
819
820    TypeSourceInfo *TInfo = (*BI)->getFriendType();
821    if(TInfo)
822    {
823        llvm::DIType Ty = getOrCreateType(TInfo->getType(), Unit);
824
825            llvm::DIType DTy =
826          DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_friend,
827                                         RecordTy, llvm::StringRef(),
828                                         Unit, 0, 0, 0,
829                                         0, 0, Ty);
830
831        EltTys.push_back(DTy);
832    }
833
834  }
835}
836
837/// CollectCXXBases - A helper function to collect debug info for
838/// C++ base classes. This is used while creating debug info entry for
839/// a Record.
840void CGDebugInfo::
841CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit,
842                llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys,
843                llvm::DIType RecordTy) {
844
845  const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
846  for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(),
847         BE = RD->bases_end(); BI != BE; ++BI) {
848    unsigned BFlags = 0;
849    uint64_t BaseOffset;
850
851    const CXXRecordDecl *Base =
852      cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl());
853
854    if (BI->isVirtual()) {
855      // virtual base offset offset is -ve. The code generator emits dwarf
856      // expression where it expects +ve number.
857      BaseOffset = 0 - CGM.getVTables().getVirtualBaseOffsetOffset(RD, Base);
858      BFlags = llvm::DIDescriptor::FlagVirtual;
859    } else
860      BaseOffset = RL.getBaseClassOffsetInBits(Base);
861
862    AccessSpecifier Access = BI->getAccessSpecifier();
863    if (Access == clang::AS_private)
864      BFlags |= llvm::DIDescriptor::FlagPrivate;
865    else if (Access == clang::AS_protected)
866      BFlags |= llvm::DIDescriptor::FlagProtected;
867
868    llvm::DIType DTy =
869      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_inheritance,
870                                     RecordTy, llvm::StringRef(),
871                                     Unit, 0, 0, 0,
872                                     BaseOffset, BFlags,
873                                     getOrCreateType(BI->getType(),
874                                                     Unit));
875    EltTys.push_back(DTy);
876  }
877}
878
879/// getOrCreateVTablePtrType - Return debug info descriptor for vtable.
880llvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) {
881  if (VTablePtrType.isValid())
882    return VTablePtrType;
883
884  ASTContext &Context = CGM.getContext();
885
886  /* Function type */
887  llvm::DIDescriptor STy = getOrCreateType(Context.IntTy, Unit);
888  llvm::DIArray SElements = DebugFactory.GetOrCreateArray(&STy, 1);
889  llvm::DIType SubTy =
890    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
891                                     Unit, "", Unit,
892                                     0, 0, 0, 0, 0, llvm::DIType(), SElements);
893
894  unsigned Size = Context.getTypeSize(Context.VoidPtrTy);
895  llvm::DIType vtbl_ptr_type
896    = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type,
897                                     Unit, "__vtbl_ptr_type", Unit,
898                                     0, Size, 0, 0, 0, SubTy);
899
900  VTablePtrType =
901    DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type,
902                                   Unit, "", Unit,
903                                   0, Size, 0, 0, 0, vtbl_ptr_type);
904  return VTablePtrType;
905}
906
907/// getVTableName - Get vtable name for the given Class.
908llvm::StringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) {
909  // Otherwise construct gdb compatible name name.
910  std::string Name = "_vptr$" + RD->getNameAsString();
911
912  // Copy this name on the side and use its reference.
913  char *StrPtr = DebugInfoNames.Allocate<char>(Name.length());
914  memcpy(StrPtr, Name.data(), Name.length());
915  return llvm::StringRef(StrPtr, Name.length());
916}
917
918
919/// CollectVTableInfo - If the C++ class has vtable info then insert appropriate
920/// debug info entry in EltTys vector.
921void CGDebugInfo::
922CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit,
923                  llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys) {
924  const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
925
926  // If there is a primary base then it will hold vtable info.
927  if (RL.getPrimaryBase())
928    return;
929
930  // If this class is not dynamic then there is not any vtable info to collect.
931  if (!RD->isDynamicClass())
932    return;
933
934  unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
935  llvm::DIType VPTR
936    = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
937                                     getVTableName(RD), Unit,
938                                     0, Size, 0, 0, 0,
939                                     getOrCreateVTablePtrType(Unit));
940  EltTys.push_back(VPTR);
941}
942
943/// getOrCreateRecordType - Emit record type's standalone debug info.
944llvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy,
945                                                SourceLocation Loc) {
946  llvm::DIType T =  getOrCreateType(RTy, getOrCreateFile(Loc));
947  DebugFactory.RecordType(T);
948  return T;
949}
950
951/// CreateType - get structure or union type.
952llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty,
953                                     llvm::DIFile Unit) {
954  RecordDecl *RD = Ty->getDecl();
955
956  unsigned Tag;
957  if (RD->isStruct())
958    Tag = llvm::dwarf::DW_TAG_structure_type;
959  else if (RD->isUnion())
960    Tag = llvm::dwarf::DW_TAG_union_type;
961  else {
962    assert(RD->isClass() && "Unknown RecordType!");
963    Tag = llvm::dwarf::DW_TAG_class_type;
964  }
965
966  // Get overall information about the record type for the debug info.
967  llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation());
968  unsigned Line = getLineNumber(RD->getLocation());
969
970  // Records and classes and unions can all be recursive.  To handle them, we
971  // first generate a debug descriptor for the struct as a forward declaration.
972  // Then (if it is a definition) we go through and get debug info for all of
973  // its members.  Finally, we create a descriptor for the complete type (which
974  // may refer to the forward decl if the struct is recursive) and replace all
975  // uses of the forward declaration with the final definition.
976  llvm::DIDescriptor FDContext =
977    getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
978
979  // If this is just a forward declaration, construct an appropriately
980  // marked node and just return it.
981  if (!RD->getDefinition()) {
982    llvm::DICompositeType FwdDecl =
983      DebugFactory.CreateCompositeType(Tag, FDContext, RD->getName(),
984                                       DefUnit, Line, 0, 0, 0,
985                                       llvm::DIDescriptor::FlagFwdDecl,
986                                       llvm::DIType(), llvm::DIArray());
987
988      return FwdDecl;
989  }
990
991  llvm::DIType FwdDecl = DebugFactory.CreateTemporaryType();
992
993  llvm::MDNode *MN = FwdDecl;
994  llvm::TrackingVH<llvm::MDNode> FwdDeclNode = MN;
995  // Otherwise, insert it into the TypeCache so that recursive uses will find
996  // it.
997  TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl;
998  // Push the struct on region stack.
999  RegionStack.push_back(FwdDeclNode);
1000  RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl);
1001
1002  // Convert all the elements.
1003  llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
1004
1005  const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
1006  if (CXXDecl) {
1007    CollectCXXBases(CXXDecl, Unit, EltTys, FwdDecl);
1008    CollectVTableInfo(CXXDecl, Unit, EltTys);
1009  }
1010
1011  // Collect static variables with initializers.
1012  for (RecordDecl::decl_iterator I = RD->decls_begin(), E = RD->decls_end();
1013       I != E; ++I)
1014    if (const VarDecl *V = dyn_cast<VarDecl>(*I)) {
1015      if (const Expr *Init = V->getInit()) {
1016        Expr::EvalResult Result;
1017        if (Init->Evaluate(Result, CGM.getContext()) && Result.Val.isInt()) {
1018          llvm::ConstantInt *CI
1019            = llvm::ConstantInt::get(CGM.getLLVMContext(), Result.Val.getInt());
1020
1021          // Create the descriptor for static variable.
1022          llvm::DIFile VUnit = getOrCreateFile(V->getLocation());
1023          llvm::StringRef VName = V->getName();
1024          llvm::DIType VTy = getOrCreateType(V->getType(), VUnit);
1025          // Do not use DIGlobalVariable for enums.
1026          if (VTy.getTag() != llvm::dwarf::DW_TAG_enumeration_type) {
1027            DebugFactory.CreateGlobalVariable(FwdDecl, VName, VName, VName, VUnit,
1028                                              getLineNumber(V->getLocation()),
1029                                              VTy, true, true, CI);
1030          }
1031        }
1032      }
1033    }
1034
1035  CollectRecordFields(RD, Unit, EltTys);
1036  llvm::MDNode *ContainingType = NULL;
1037  if (CXXDecl) {
1038    CollectCXXMemberFunctions(CXXDecl, Unit, EltTys, FwdDecl);
1039    CollectCXXFriends(CXXDecl, Unit, EltTys, FwdDecl);
1040
1041    // A class's primary base or the class itself contains the vtable.
1042    const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
1043    if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) {
1044      // Seek non virtual primary base root.
1045      while (1) {
1046        const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase);
1047        const CXXRecordDecl *PBT = BRL.getPrimaryBase();
1048        if (PBT && !BRL.getPrimaryBaseWasVirtual())
1049          PBase = PBT;
1050        else
1051          break;
1052      }
1053      ContainingType =
1054        getOrCreateType(QualType(PBase->getTypeForDecl(), 0), Unit);
1055    }
1056    else if (CXXDecl->isDynamicClass())
1057      ContainingType = FwdDecl;
1058  }
1059
1060  llvm::DIArray Elements =
1061    DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
1062
1063  // Bit size, align and offset of the type.
1064  uint64_t Size = CGM.getContext().getTypeSize(Ty);
1065  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
1066
1067  RegionStack.pop_back();
1068  llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator RI =
1069    RegionMap.find(Ty->getDecl());
1070  if (RI != RegionMap.end())
1071    RegionMap.erase(RI);
1072
1073  llvm::DIDescriptor RDContext =
1074    getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
1075
1076  llvm::StringRef RDName = RD->getName();
1077  // If this is a class, include the template arguments also.
1078  if (Tag == llvm::dwarf::DW_TAG_class_type)
1079    RDName = getClassName(RD);
1080
1081  llvm::DICompositeType RealDecl =
1082    DebugFactory.CreateCompositeType(Tag, RDContext,
1083                                     RDName,
1084                                     DefUnit, Line, Size, Align, 0, 0,
1085                                     llvm::DIType(), Elements,
1086                                     0, ContainingType);
1087
1088  // Now that we have a real decl for the struct, replace anything using the
1089  // old decl with the new one.  This will recursively update the debug info.
1090  llvm::DIType(FwdDeclNode).replaceAllUsesWith(RealDecl);
1091  RegionMap[RD] = llvm::WeakVH(RealDecl);
1092  return RealDecl;
1093}
1094
1095/// CreateType - get objective-c object type.
1096llvm::DIType CGDebugInfo::CreateType(const ObjCObjectType *Ty,
1097                                     llvm::DIFile Unit) {
1098  // Ignore protocols.
1099  return getOrCreateType(Ty->getBaseType(), Unit);
1100}
1101
1102/// CreateType - get objective-c interface type.
1103llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty,
1104                                     llvm::DIFile Unit) {
1105  ObjCInterfaceDecl *ID = Ty->getDecl();
1106  unsigned Tag = llvm::dwarf::DW_TAG_structure_type;
1107
1108  // Get overall information about the record type for the debug info.
1109  llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation());
1110  unsigned Line = getLineNumber(ID->getLocation());
1111  unsigned RuntimeLang = TheCU.getLanguage();
1112
1113  // If this is just a forward declaration, return a special forward-declaration
1114  // debug type.
1115  if (ID->isForwardDecl()) {
1116    llvm::DICompositeType FwdDecl =
1117      DebugFactory.CreateCompositeType(Tag, Unit, ID->getName(),
1118                                       DefUnit, Line, 0, 0, 0, 0,
1119                                       llvm::DIType(), llvm::DIArray(),
1120                                       RuntimeLang);
1121    return FwdDecl;
1122  }
1123
1124  // To handle recursive interface, we
1125  // first generate a debug descriptor for the struct as a forward declaration.
1126  // Then (if it is a definition) we go through and get debug info for all of
1127  // its members.  Finally, we create a descriptor for the complete type (which
1128  // may refer to the forward decl if the struct is recursive) and replace all
1129  // uses of the forward declaration with the final definition.
1130  llvm::DIType FwdDecl = DebugFactory.CreateTemporaryType();
1131
1132  llvm::MDNode *MN = FwdDecl;
1133  llvm::TrackingVH<llvm::MDNode> FwdDeclNode = MN;
1134  // Otherwise, insert it into the TypeCache so that recursive uses will find
1135  // it.
1136  TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl;
1137  // Push the struct on region stack.
1138  RegionStack.push_back(FwdDeclNode);
1139  RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl);
1140
1141  // Convert all the elements.
1142  llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
1143
1144  ObjCInterfaceDecl *SClass = ID->getSuperClass();
1145  if (SClass) {
1146    llvm::DIType SClassTy =
1147      getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit);
1148    llvm::DIType InhTag =
1149      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_inheritance,
1150                                     Unit, "", Unit, 0, 0, 0,
1151                                     0 /* offset */, 0, SClassTy);
1152    EltTys.push_back(InhTag);
1153  }
1154
1155  const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID);
1156
1157  unsigned FieldNo = 0;
1158  for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field;
1159       Field = Field->getNextIvar(), ++FieldNo) {
1160    llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit);
1161
1162    llvm::StringRef FieldName = Field->getName();
1163
1164    // Ignore unnamed fields.
1165    if (FieldName.empty())
1166      continue;
1167
1168    // Get the location for the field.
1169    llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation());
1170    unsigned FieldLine = getLineNumber(Field->getLocation());
1171    QualType FType = Field->getType();
1172    uint64_t FieldSize = 0;
1173    unsigned FieldAlign = 0;
1174
1175    if (!FType->isIncompleteArrayType()) {
1176
1177      // Bit size, align and offset of the type.
1178      FieldSize = CGM.getContext().getTypeSize(FType);
1179      Expr *BitWidth = Field->getBitWidth();
1180      if (BitWidth)
1181        FieldSize = BitWidth->EvaluateAsInt(CGM.getContext()).getZExtValue();
1182
1183      FieldAlign =  CGM.getContext().getTypeAlign(FType);
1184    }
1185
1186    uint64_t FieldOffset = RL.getFieldOffset(FieldNo);
1187
1188    unsigned Flags = 0;
1189    if (Field->getAccessControl() == ObjCIvarDecl::Protected)
1190      Flags = llvm::DIDescriptor::FlagProtected;
1191    else if (Field->getAccessControl() == ObjCIvarDecl::Private)
1192      Flags = llvm::DIDescriptor::FlagPrivate;
1193
1194    // Create a DW_TAG_member node to remember the offset of this field in the
1195    // struct.  FIXME: This is an absolutely insane way to capture this
1196    // information.  When we gut debug info, this should be fixed.
1197    FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
1198                                             FieldName, FieldDefUnit,
1199                                             FieldLine, FieldSize, FieldAlign,
1200                                             FieldOffset, Flags, FieldTy);
1201    EltTys.push_back(FieldTy);
1202  }
1203
1204  llvm::DIArray Elements =
1205    DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
1206
1207  RegionStack.pop_back();
1208  llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator RI =
1209    RegionMap.find(Ty->getDecl());
1210  if (RI != RegionMap.end())
1211    RegionMap.erase(RI);
1212
1213  // Bit size, align and offset of the type.
1214  uint64_t Size = CGM.getContext().getTypeSize(Ty);
1215  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
1216
1217  llvm::DICompositeType RealDecl =
1218    DebugFactory.CreateCompositeType(Tag, Unit, ID->getName(), DefUnit,
1219                                     Line, Size, Align, 0, 0, llvm::DIType(),
1220                                     Elements, RuntimeLang);
1221
1222  // Now that we have a real decl for the struct, replace anything using the
1223  // old decl with the new one.  This will recursively update the debug info.
1224  llvm::DIType(FwdDeclNode).replaceAllUsesWith(RealDecl);
1225  RegionMap[ID] = llvm::WeakVH(RealDecl);
1226
1227  return RealDecl;
1228}
1229
1230llvm::DIType CGDebugInfo::CreateType(const EnumType *Ty,
1231                                     llvm::DIFile Unit) {
1232  return CreateEnumType(Ty->getDecl(), Unit);
1233
1234}
1235
1236llvm::DIType CGDebugInfo::CreateType(const TagType *Ty,
1237                                     llvm::DIFile Unit) {
1238  if (const RecordType *RT = dyn_cast<RecordType>(Ty))
1239    return CreateType(RT, Unit);
1240  else if (const EnumType *ET = dyn_cast<EnumType>(Ty))
1241    return CreateType(ET, Unit);
1242
1243  return llvm::DIType();
1244}
1245
1246llvm::DIType CGDebugInfo::CreateType(const VectorType *Ty,
1247                                     llvm::DIFile Unit) {
1248  llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit);
1249  uint64_t NumElems = Ty->getNumElements();
1250  if (NumElems > 0)
1251    --NumElems;
1252
1253  llvm::DIDescriptor Subscript = DebugFactory.GetOrCreateSubrange(0, NumElems);
1254  llvm::DIArray SubscriptArray = DebugFactory.GetOrCreateArray(&Subscript, 1);
1255
1256  uint64_t Size = CGM.getContext().getTypeSize(Ty);
1257  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
1258
1259  return
1260    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_vector_type,
1261                                     Unit, "", Unit,
1262                                     0, Size, Align, 0, 0,
1263                                     ElementTy,  SubscriptArray);
1264}
1265
1266llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty,
1267                                     llvm::DIFile Unit) {
1268  uint64_t Size;
1269  uint64_t Align;
1270
1271
1272  // FIXME: make getTypeAlign() aware of VLAs and incomplete array types
1273  if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(Ty)) {
1274    Size = 0;
1275    Align =
1276      CGM.getContext().getTypeAlign(CGM.getContext().getBaseElementType(VAT));
1277  } else if (Ty->isIncompleteArrayType()) {
1278    Size = 0;
1279    Align = CGM.getContext().getTypeAlign(Ty->getElementType());
1280  } else {
1281    // Size and align of the whole array, not the element type.
1282    Size = CGM.getContext().getTypeSize(Ty);
1283    Align = CGM.getContext().getTypeAlign(Ty);
1284  }
1285
1286  // Add the dimensions of the array.  FIXME: This loses CV qualifiers from
1287  // interior arrays, do we care?  Why aren't nested arrays represented the
1288  // obvious/recursive way?
1289  llvm::SmallVector<llvm::DIDescriptor, 8> Subscripts;
1290  QualType EltTy(Ty, 0);
1291  if (Ty->isIncompleteArrayType())
1292    EltTy = Ty->getElementType();
1293  else {
1294    while ((Ty = dyn_cast<ArrayType>(EltTy))) {
1295      uint64_t Upper = 0;
1296      if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty))
1297        if (CAT->getSize().getZExtValue())
1298          Upper = CAT->getSize().getZExtValue() - 1;
1299      // FIXME: Verify this is right for VLAs.
1300      Subscripts.push_back(DebugFactory.GetOrCreateSubrange(0, Upper));
1301      EltTy = Ty->getElementType();
1302    }
1303  }
1304
1305  llvm::DIArray SubscriptArray =
1306    DebugFactory.GetOrCreateArray(Subscripts.data(), Subscripts.size());
1307
1308  llvm::DIType DbgTy =
1309    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_array_type,
1310                                     Unit, "", Unit,
1311                                     0, Size, Align, 0, 0,
1312                                     getOrCreateType(EltTy, Unit),
1313                                     SubscriptArray);
1314  return DbgTy;
1315}
1316
1317llvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty,
1318                                     llvm::DIFile Unit) {
1319  return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type,
1320                               Ty, Ty->getPointeeType(), Unit);
1321}
1322
1323llvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty,
1324                                     llvm::DIFile U) {
1325  QualType PointerDiffTy = CGM.getContext().getPointerDiffType();
1326  llvm::DIType PointerDiffDITy = getOrCreateType(PointerDiffTy, U);
1327
1328  if (!Ty->getPointeeType()->isFunctionType()) {
1329    // We have a data member pointer type.
1330    return PointerDiffDITy;
1331  }
1332
1333  // We have a member function pointer type. Treat it as a struct with two
1334  // ptrdiff_t members.
1335  std::pair<uint64_t, unsigned> Info = CGM.getContext().getTypeInfo(Ty);
1336
1337  uint64_t FieldOffset = 0;
1338  llvm::DIDescriptor ElementTypes[2];
1339
1340  // FIXME: This should probably be a function type instead.
1341  ElementTypes[0] =
1342    DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, U,
1343                                   "ptr", U, 0,
1344                                   Info.first, Info.second, FieldOffset, 0,
1345                                   PointerDiffDITy);
1346  FieldOffset += Info.first;
1347
1348  ElementTypes[1] =
1349    DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, U,
1350                                   "ptr", U, 0,
1351                                   Info.first, Info.second, FieldOffset, 0,
1352                                   PointerDiffDITy);
1353
1354  llvm::DIArray Elements =
1355    DebugFactory.GetOrCreateArray(&ElementTypes[0],
1356                                  llvm::array_lengthof(ElementTypes));
1357
1358  return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type,
1359                                          U, llvm::StringRef("test"),
1360                                          U, 0, FieldOffset,
1361                                          0, 0, 0, llvm::DIType(), Elements);
1362}
1363
1364/// CreateEnumType - get enumeration type.
1365llvm::DIType CGDebugInfo::CreateEnumType(const EnumDecl *ED, llvm::DIFile Unit){
1366  llvm::SmallVector<llvm::DIDescriptor, 32> Enumerators;
1367
1368  // Create DIEnumerator elements for each enumerator.
1369  for (EnumDecl::enumerator_iterator
1370         Enum = ED->enumerator_begin(), EnumEnd = ED->enumerator_end();
1371       Enum != EnumEnd; ++Enum) {
1372    Enumerators.push_back(DebugFactory.CreateEnumerator(Enum->getName(),
1373                                            Enum->getInitVal().getZExtValue()));
1374  }
1375
1376  // Return a CompositeType for the enum itself.
1377  llvm::DIArray EltArray =
1378    DebugFactory.GetOrCreateArray(Enumerators.data(), Enumerators.size());
1379
1380  llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation());
1381  unsigned Line = getLineNumber(ED->getLocation());
1382  uint64_t Size = 0;
1383  uint64_t Align = 0;
1384  if (!ED->getTypeForDecl()->isIncompleteType()) {
1385    Size = CGM.getContext().getTypeSize(ED->getTypeForDecl());
1386    Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl());
1387  }
1388  llvm::DIDescriptor EnumContext =
1389    getContextDescriptor(dyn_cast<Decl>(ED->getDeclContext()), Unit);
1390  llvm::DIType DbgTy =
1391    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_enumeration_type,
1392                                     EnumContext, ED->getName(),
1393                                     DefUnit, Line, Size, Align, 0, 0,
1394                                     llvm::DIType(), EltArray);
1395  return DbgTy;
1396}
1397
1398static QualType UnwrapTypeForDebugInfo(QualType T) {
1399  do {
1400    QualType LastT = T;
1401    switch (T->getTypeClass()) {
1402    default:
1403      return T;
1404    case Type::TemplateSpecialization:
1405      T = cast<TemplateSpecializationType>(T)->desugar();
1406      break;
1407    case Type::TypeOfExpr: {
1408      TypeOfExprType *Ty = cast<TypeOfExprType>(T);
1409      T = Ty->getUnderlyingExpr()->getType();
1410      break;
1411    }
1412    case Type::TypeOf:
1413      T = cast<TypeOfType>(T)->getUnderlyingType();
1414      break;
1415    case Type::Decltype:
1416      T = cast<DecltypeType>(T)->getUnderlyingType();
1417      break;
1418    case Type::Elaborated:
1419      T = cast<ElaboratedType>(T)->getNamedType();
1420      break;
1421    case Type::SubstTemplateTypeParm:
1422      T = cast<SubstTemplateTypeParmType>(T)->getReplacementType();
1423      break;
1424    }
1425
1426    assert(T != LastT && "Type unwrapping failed to unwrap!");
1427    if (T == LastT)
1428      return T;
1429  } while (true);
1430
1431  return T;
1432}
1433
1434/// getOrCreateType - Get the type from the cache or create a new
1435/// one if necessary.
1436llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty,
1437                                          llvm::DIFile Unit) {
1438  if (Ty.isNull())
1439    return llvm::DIType();
1440
1441  // Unwrap the type as needed for debug information.
1442  Ty = UnwrapTypeForDebugInfo(Ty);
1443
1444  // Check for existing entry.
1445  llvm::DenseMap<void *, llvm::WeakVH>::iterator it =
1446    TypeCache.find(Ty.getAsOpaquePtr());
1447  if (it != TypeCache.end()) {
1448    // Verify that the debug info still exists.
1449    if (&*it->second)
1450      return llvm::DIType(cast<llvm::MDNode>(it->second));
1451  }
1452
1453  // Otherwise create the type.
1454  llvm::DIType Res = CreateTypeNode(Ty, Unit);
1455
1456  // And update the type cache.
1457  TypeCache[Ty.getAsOpaquePtr()] = Res;
1458  return Res;
1459}
1460
1461/// CreateTypeNode - Create a new debug type node.
1462llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty,
1463                                         llvm::DIFile Unit) {
1464  // Handle qualifiers, which recursively handles what they refer to.
1465  if (Ty.hasLocalQualifiers())
1466    return CreateQualifiedType(Ty, Unit);
1467
1468  const char *Diag = 0;
1469
1470  // Work out details of type.
1471  switch (Ty->getTypeClass()) {
1472#define TYPE(Class, Base)
1473#define ABSTRACT_TYPE(Class, Base)
1474#define NON_CANONICAL_TYPE(Class, Base)
1475#define DEPENDENT_TYPE(Class, Base) case Type::Class:
1476#include "clang/AST/TypeNodes.def"
1477    assert(false && "Dependent types cannot show up in debug information");
1478
1479  // FIXME: Handle these.
1480  case Type::ExtVector:
1481    return llvm::DIType();
1482
1483  case Type::Vector:
1484    return CreateType(cast<VectorType>(Ty), Unit);
1485  case Type::ObjCObjectPointer:
1486    return CreateType(cast<ObjCObjectPointerType>(Ty), Unit);
1487  case Type::ObjCObject:
1488    return CreateType(cast<ObjCObjectType>(Ty), Unit);
1489  case Type::ObjCInterface:
1490    return CreateType(cast<ObjCInterfaceType>(Ty), Unit);
1491  case Type::Builtin: return CreateType(cast<BuiltinType>(Ty));
1492  case Type::Complex: return CreateType(cast<ComplexType>(Ty), Unit);
1493  case Type::Pointer: return CreateType(cast<PointerType>(Ty), Unit);
1494  case Type::BlockPointer:
1495    return CreateType(cast<BlockPointerType>(Ty), Unit);
1496  case Type::Typedef: return CreateType(cast<TypedefType>(Ty), Unit);
1497  case Type::Record:
1498  case Type::Enum:
1499    return CreateType(cast<TagType>(Ty), Unit);
1500  case Type::FunctionProto:
1501  case Type::FunctionNoProto:
1502    return CreateType(cast<FunctionType>(Ty), Unit);
1503  case Type::ConstantArray:
1504  case Type::VariableArray:
1505  case Type::IncompleteArray:
1506    return CreateType(cast<ArrayType>(Ty), Unit);
1507
1508  case Type::LValueReference:
1509    return CreateType(cast<LValueReferenceType>(Ty), Unit);
1510
1511  case Type::MemberPointer:
1512    return CreateType(cast<MemberPointerType>(Ty), Unit);
1513
1514  case Type::TemplateSpecialization:
1515  case Type::Elaborated:
1516  case Type::SubstTemplateTypeParm:
1517  case Type::TypeOfExpr:
1518  case Type::TypeOf:
1519  case Type::Decltype:
1520    llvm_unreachable("type should have been unwrapped!");
1521    return llvm::DIType();
1522
1523  case Type::RValueReference:
1524    // FIXME: Implement!
1525    Diag = "rvalue references";
1526    break;
1527  }
1528
1529  assert(Diag && "Fall through without a diagnostic?");
1530  unsigned DiagID = CGM.getDiags().getCustomDiagID(Diagnostic::Error,
1531                               "debug information for %0 is not yet supported");
1532  CGM.getDiags().Report(DiagID)
1533    << Diag;
1534  return llvm::DIType();
1535}
1536
1537/// CreateMemberType - Create new member and increase Offset by FType's size.
1538llvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType,
1539                                           llvm::StringRef Name,
1540                                           uint64_t *Offset) {
1541  llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit);
1542  uint64_t FieldSize = CGM.getContext().getTypeSize(FType);
1543  unsigned FieldAlign = CGM.getContext().getTypeAlign(FType);
1544  llvm::DIType Ty = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member,
1545                                                   Unit, Name, Unit, 0,
1546                                                   FieldSize, FieldAlign,
1547                                                   *Offset, 0, FieldTy);
1548  *Offset += FieldSize;
1549  return Ty;
1550}
1551
1552/// EmitFunctionStart - Constructs the debug code for entering a function -
1553/// "llvm.dbg.func.start.".
1554void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType,
1555                                    llvm::Function *Fn,
1556                                    CGBuilderTy &Builder) {
1557
1558  llvm::StringRef Name;
1559  llvm::StringRef LinkageName;
1560
1561  FnBeginRegionCount.push_back(RegionStack.size());
1562
1563  const Decl *D = GD.getDecl();
1564  unsigned Flags = 0;
1565  llvm::DIFile Unit = getOrCreateFile(CurLoc);
1566  llvm::DIDescriptor FDContext(Unit);
1567  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1568    // If there is a DISubprogram for  this function available then use it.
1569    llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator
1570      FI = SPCache.find(FD);
1571    if (FI != SPCache.end()) {
1572      llvm::DIDescriptor SP(dyn_cast_or_null<llvm::MDNode>(&*FI->second));
1573      if (SP.isSubprogram() && llvm::DISubprogram(SP).isDefinition()) {
1574        llvm::MDNode *SPN = SP;
1575        RegionStack.push_back(SPN);
1576        RegionMap[D] = llvm::WeakVH(SP);
1577        return;
1578      }
1579    }
1580    Name = getFunctionName(FD);
1581    // Use mangled name as linkage name for c/c++ functions.
1582    LinkageName = CGM.getMangledName(GD);
1583    if (LinkageName == Name)
1584      LinkageName = llvm::StringRef();
1585    if (FD->hasPrototype())
1586      Flags |= llvm::DIDescriptor::FlagPrototyped;
1587    if (const NamespaceDecl *NSDecl =
1588        dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
1589      FDContext = getOrCreateNameSpace(NSDecl, Unit);
1590  } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) {
1591    Name = getObjCMethodName(OMD);
1592    Flags |= llvm::DIDescriptor::FlagPrototyped;
1593  } else {
1594    // Use llvm function name.
1595    Name = Fn->getName();
1596    Flags |= llvm::DIDescriptor::FlagPrototyped;
1597  }
1598  if (!Name.empty() && Name[0] == '\01')
1599    Name = Name.substr(1);
1600
1601  // It is expected that CurLoc is set before using EmitFunctionStart.
1602  // Usually, CurLoc points to the left bracket location of compound
1603  // statement representing function body.
1604  unsigned LineNo = getLineNumber(CurLoc);
1605  if (D->isImplicit())
1606    Flags |= llvm::DIDescriptor::FlagArtificial;
1607  llvm::DISubprogram SP =
1608    DebugFactory.CreateSubprogram(FDContext, Name, Name, LinkageName, Unit,
1609                                  LineNo, getOrCreateType(FnType, Unit),
1610                                  Fn->hasInternalLinkage(), true/*definition*/,
1611                                  0, 0, llvm::DIType(),
1612                                  Flags,
1613                                  CGM.getLangOptions().Optimize, Fn);
1614
1615  // Push function on region stack.
1616  llvm::MDNode *SPN = SP;
1617  RegionStack.push_back(SPN);
1618  RegionMap[D] = llvm::WeakVH(SP);
1619
1620  // Clear stack used to keep track of #line directives.
1621  LineDirectiveFiles.clear();
1622}
1623
1624
1625void CGDebugInfo::EmitStopPoint(CGBuilderTy &Builder) {
1626  if (CurLoc.isInvalid() || CurLoc.isMacroID()) return;
1627
1628  // Don't bother if things are the same as last time.
1629  SourceManager &SM = CGM.getContext().getSourceManager();
1630  if (CurLoc == PrevLoc
1631       || (SM.getInstantiationLineNumber(CurLoc) ==
1632           SM.getInstantiationLineNumber(PrevLoc)
1633           && SM.isFromSameFile(CurLoc, PrevLoc)))
1634    // New Builder may not be in sync with CGDebugInfo.
1635    if (!Builder.getCurrentDebugLocation().isUnknown())
1636      return;
1637
1638  // Update last state.
1639  PrevLoc = CurLoc;
1640
1641  llvm::MDNode *Scope = RegionStack.back();
1642  Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(getLineNumber(CurLoc),
1643                                                      getColumnNumber(CurLoc),
1644                                                      Scope));
1645}
1646
1647/// UpdateLineDirectiveRegion - Update region stack only if #line directive
1648/// has introduced scope change.
1649void CGDebugInfo::UpdateLineDirectiveRegion(CGBuilderTy &Builder) {
1650  if (CurLoc.isInvalid() || CurLoc.isMacroID() ||
1651      PrevLoc.isInvalid() || PrevLoc.isMacroID())
1652    return;
1653  SourceManager &SM = CGM.getContext().getSourceManager();
1654  PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc);
1655  PresumedLoc PPLoc = SM.getPresumedLoc(PrevLoc);
1656
1657  if (PCLoc.isInvalid() || PPLoc.isInvalid() ||
1658      !strcmp(PPLoc.getFilename(), PCLoc.getFilename()))
1659    return;
1660
1661  // If #line directive stack is empty then we are entering a new scope.
1662  if (LineDirectiveFiles.empty()) {
1663    EmitRegionStart(Builder);
1664    LineDirectiveFiles.push_back(PCLoc.getFilename());
1665    return;
1666  }
1667
1668  assert (RegionStack.size() >= LineDirectiveFiles.size()
1669          && "error handling  #line regions!");
1670
1671  bool SeenThisFile = false;
1672  // Chek if current file is already seen earlier.
1673  for(std::vector<const char *>::iterator I = LineDirectiveFiles.begin(),
1674        E = LineDirectiveFiles.end(); I != E; ++I)
1675    if (!strcmp(PCLoc.getFilename(), *I)) {
1676      SeenThisFile = true;
1677      break;
1678    }
1679
1680  // If #line for this file is seen earlier then pop out #line regions.
1681  if (SeenThisFile) {
1682    while (!LineDirectiveFiles.empty()) {
1683      const char *LastFile = LineDirectiveFiles.back();
1684      RegionStack.pop_back();
1685      LineDirectiveFiles.pop_back();
1686      if (!strcmp(PPLoc.getFilename(), LastFile))
1687        break;
1688    }
1689    return;
1690  }
1691
1692  // .. otherwise insert new #line region.
1693  EmitRegionStart(Builder);
1694  LineDirectiveFiles.push_back(PCLoc.getFilename());
1695
1696  return;
1697}
1698/// EmitRegionStart- Constructs the debug code for entering a declarative
1699/// region - "llvm.dbg.region.start.".
1700void CGDebugInfo::EmitRegionStart(CGBuilderTy &Builder) {
1701  llvm::DIDescriptor D =
1702    DebugFactory.CreateLexicalBlock(RegionStack.empty() ?
1703                                    llvm::DIDescriptor() :
1704                                    llvm::DIDescriptor(RegionStack.back()),
1705                                    getOrCreateFile(CurLoc),
1706                                    getLineNumber(CurLoc),
1707                                    getColumnNumber(CurLoc));
1708  llvm::MDNode *DN = D;
1709  RegionStack.push_back(DN);
1710}
1711
1712/// EmitRegionEnd - Constructs the debug code for exiting a declarative
1713/// region - "llvm.dbg.region.end."
1714void CGDebugInfo::EmitRegionEnd(CGBuilderTy &Builder) {
1715  assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
1716
1717  // Provide an region stop point.
1718  EmitStopPoint(Builder);
1719
1720  RegionStack.pop_back();
1721}
1722
1723/// EmitFunctionEnd - Constructs the debug code for exiting a function.
1724void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) {
1725  assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
1726  unsigned RCount = FnBeginRegionCount.back();
1727  assert(RCount <= RegionStack.size() && "Region stack mismatch");
1728
1729  // Pop all regions for this function.
1730  while (RegionStack.size() != RCount)
1731    EmitRegionEnd(Builder);
1732  FnBeginRegionCount.pop_back();
1733}
1734
1735// EmitTypeForVarWithBlocksAttr - Build up structure info for the byref.
1736// See BuildByRefType.
1737llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD,
1738                                                       uint64_t *XOffset) {
1739
1740  llvm::SmallVector<llvm::DIDescriptor, 5> EltTys;
1741
1742  QualType FType;
1743  uint64_t FieldSize, FieldOffset;
1744  unsigned FieldAlign;
1745
1746  llvm::DIFile Unit = getOrCreateFile(VD->getLocation());
1747  QualType Type = VD->getType();
1748
1749  FieldOffset = 0;
1750  FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
1751  EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset));
1752  EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset));
1753  FType = CGM.getContext().IntTy;
1754  EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset));
1755  EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset));
1756
1757  bool HasCopyAndDispose = CGM.BlockRequiresCopying(Type);
1758  if (HasCopyAndDispose) {
1759    FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
1760    EltTys.push_back(CreateMemberType(Unit, FType, "__copy_helper",
1761                                      &FieldOffset));
1762    EltTys.push_back(CreateMemberType(Unit, FType, "__destroy_helper",
1763                                      &FieldOffset));
1764  }
1765
1766  CharUnits Align = CGM.getContext().getDeclAlign(VD);
1767  if (Align > CharUnits::fromQuantity(
1768        CGM.getContext().Target.getPointerAlign(0) / 8)) {
1769    unsigned AlignedOffsetInBytes
1770      = llvm::RoundUpToAlignment(FieldOffset/8, Align.getQuantity());
1771    unsigned NumPaddingBytes
1772      = AlignedOffsetInBytes - FieldOffset/8;
1773
1774    if (NumPaddingBytes > 0) {
1775      llvm::APInt pad(32, NumPaddingBytes);
1776      FType = CGM.getContext().getConstantArrayType(CGM.getContext().CharTy,
1777                                                    pad, ArrayType::Normal, 0);
1778      EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset));
1779    }
1780  }
1781
1782  FType = Type;
1783  llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit);
1784  FieldSize = CGM.getContext().getTypeSize(FType);
1785  FieldAlign = Align.getQuantity()*8;
1786
1787  *XOffset = FieldOffset;
1788  FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
1789                                           VD->getName(), Unit,
1790                                           0, FieldSize, FieldAlign,
1791                                           FieldOffset, 0, FieldTy);
1792  EltTys.push_back(FieldTy);
1793  FieldOffset += FieldSize;
1794
1795  llvm::DIArray Elements =
1796    DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
1797
1798  unsigned Flags = llvm::DIDescriptor::FlagBlockByrefStruct;
1799
1800  return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type,
1801                                          Unit, "", Unit,
1802                                          0, FieldOffset, 0, 0, Flags,
1803                                          llvm::DIType(), Elements);
1804
1805}
1806/// EmitDeclare - Emit local variable declaration debug info.
1807void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
1808                              llvm::Value *Storage, CGBuilderTy &Builder) {
1809  assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
1810
1811  llvm::DIFile Unit = getOrCreateFile(VD->getLocation());
1812  llvm::DIType Ty;
1813  uint64_t XOffset = 0;
1814  if (VD->hasAttr<BlocksAttr>())
1815    Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset);
1816  else
1817    Ty = getOrCreateType(VD->getType(), Unit);
1818
1819  // If there is not any debug info for type then do not emit debug info
1820  // for this variable.
1821  if (!Ty)
1822    return;
1823
1824  // Get location information.
1825  unsigned Line = getLineNumber(VD->getLocation());
1826  unsigned Column = getColumnNumber(VD->getLocation());
1827  unsigned Flags = 0;
1828  if (VD->isImplicit())
1829    Flags |= llvm::DIDescriptor::FlagArtificial;
1830  llvm::MDNode *Scope = RegionStack.back();
1831
1832  llvm::StringRef Name = VD->getName();
1833  if (!Name.empty()) {
1834    // Create the descriptor for the variable.
1835    llvm::DIVariable D =
1836      DebugFactory.CreateVariable(Tag, llvm::DIDescriptor(Scope),
1837                                  Name, Unit, Line, Ty,
1838                                  CGM.getLangOptions().Optimize, Flags);
1839
1840    // Insert an llvm.dbg.declare into the current block.
1841    llvm::Instruction *Call =
1842      DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock());
1843
1844    Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
1845    return;
1846  }
1847
1848  // If VD is an anonymous union then Storage represents value for
1849  // all union fields.
1850  if (const RecordType *RT = dyn_cast<RecordType>(VD->getType()))
1851    if (const RecordDecl *RD = dyn_cast<RecordDecl>(RT->getDecl()))
1852      if (RD->isUnion()) {
1853        for (RecordDecl::field_iterator I = RD->field_begin(),
1854               E = RD->field_end();
1855             I != E; ++I) {
1856          FieldDecl *Field = *I;
1857          llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit);
1858          llvm::StringRef FieldName = Field->getName();
1859
1860          // Ignore unnamed fields. Do not ignore unnamed records.
1861          if (FieldName.empty() && !isa<RecordType>(Field->getType()))
1862            continue;
1863
1864          // Use VarDecl's Tag, Scope and Line number.
1865          llvm::DIVariable D =
1866            DebugFactory.CreateVariable(Tag, llvm::DIDescriptor(Scope),
1867                                        FieldName, Unit, Line, FieldTy,
1868                                        CGM.getLangOptions().Optimize, Flags);
1869
1870          // Insert an llvm.dbg.declare into the current block.
1871          llvm::Instruction *Call =
1872            DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock());
1873
1874          Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
1875        }
1876      }
1877}
1878
1879/// EmitDeclare - Emit local variable declaration debug info.
1880void CGDebugInfo::EmitDeclare(const BlockDeclRefExpr *BDRE, unsigned Tag,
1881                              llvm::Value *Storage, CGBuilderTy &Builder,
1882                              CodeGenFunction *CGF) {
1883  const ValueDecl *VD = BDRE->getDecl();
1884  assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
1885
1886  if (Builder.GetInsertBlock() == 0)
1887    return;
1888
1889  uint64_t XOffset = 0;
1890  llvm::DIFile Unit = getOrCreateFile(VD->getLocation());
1891  llvm::DIType Ty;
1892  if (VD->hasAttr<BlocksAttr>())
1893    Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset);
1894  else
1895    Ty = getOrCreateType(VD->getType(), Unit);
1896
1897  // Get location information.
1898  unsigned Line = getLineNumber(VD->getLocation());
1899  unsigned Column = getColumnNumber(VD->getLocation());
1900
1901  CharUnits offset = CGF->BlockDecls[VD];
1902  llvm::SmallVector<llvm::Value *, 9> addr;
1903  const llvm::Type *Int64Ty = llvm::Type::getInt64Ty(CGM.getLLVMContext());
1904  addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpDeref));
1905  addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpPlus));
1906  addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity()));
1907  if (BDRE->isByRef()) {
1908    addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpDeref));
1909    addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpPlus));
1910    // offset of __forwarding field
1911    offset = CharUnits::fromQuantity(CGF->LLVMPointerWidth/8);
1912    addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity()));
1913    addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpDeref));
1914    addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpPlus));
1915    // offset of x field
1916    offset = CharUnits::fromQuantity(XOffset/8);
1917    addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity()));
1918  }
1919
1920  // Create the descriptor for the variable.
1921  llvm::DIVariable D =
1922    DebugFactory.CreateComplexVariable(Tag,
1923                                       llvm::DIDescriptor(RegionStack.back()),
1924                                       VD->getName(), Unit, Line, Ty,
1925                                       addr.data(), addr.size());
1926  // Insert an llvm.dbg.declare into the current block.
1927  llvm::Instruction *Call =
1928    DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock());
1929
1930  llvm::MDNode *Scope = RegionStack.back();
1931  Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
1932}
1933
1934void CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD,
1935                                            llvm::Value *Storage,
1936                                            CGBuilderTy &Builder) {
1937  EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, Builder);
1938}
1939
1940void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
1941  const BlockDeclRefExpr *BDRE, llvm::Value *Storage, CGBuilderTy &Builder,
1942  CodeGenFunction *CGF) {
1943  EmitDeclare(BDRE, llvm::dwarf::DW_TAG_auto_variable, Storage, Builder, CGF);
1944}
1945
1946/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument
1947/// variable declaration.
1948void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI,
1949                                           CGBuilderTy &Builder) {
1950  EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, Builder);
1951}
1952
1953
1954
1955/// EmitGlobalVariable - Emit information about a global variable.
1956void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
1957                                     const VarDecl *D) {
1958
1959  // Create global variable debug descriptor.
1960  llvm::DIFile Unit = getOrCreateFile(D->getLocation());
1961  unsigned LineNo = getLineNumber(D->getLocation());
1962
1963  QualType T = D->getType();
1964  if (T->isIncompleteArrayType()) {
1965
1966    // CodeGen turns int[] into int[1] so we'll do the same here.
1967    llvm::APSInt ConstVal(32);
1968
1969    ConstVal = 1;
1970    QualType ET = CGM.getContext().getAsArrayType(T)->getElementType();
1971
1972    T = CGM.getContext().getConstantArrayType(ET, ConstVal,
1973                                           ArrayType::Normal, 0);
1974  }
1975  llvm::StringRef DeclName = D->getName();
1976  llvm::StringRef LinkageName;
1977  if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext()))
1978    LinkageName = Var->getName();
1979  if (LinkageName == DeclName)
1980    LinkageName = llvm::StringRef();
1981  llvm::DIDescriptor DContext =
1982    getContextDescriptor(dyn_cast<Decl>(D->getDeclContext()), Unit);
1983  DebugFactory.CreateGlobalVariable(DContext, DeclName, DeclName, LinkageName,
1984                                    Unit, LineNo, getOrCreateType(T, Unit),
1985                                    Var->hasInternalLinkage(),
1986                                    true/*definition*/, Var);
1987}
1988
1989/// EmitGlobalVariable - Emit information about an objective-c interface.
1990void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
1991                                     ObjCInterfaceDecl *ID) {
1992  // Create global variable debug descriptor.
1993  llvm::DIFile Unit = getOrCreateFile(ID->getLocation());
1994  unsigned LineNo = getLineNumber(ID->getLocation());
1995
1996  llvm::StringRef Name = ID->getName();
1997
1998  QualType T = CGM.getContext().getObjCInterfaceType(ID);
1999  if (T->isIncompleteArrayType()) {
2000
2001    // CodeGen turns int[] into int[1] so we'll do the same here.
2002    llvm::APSInt ConstVal(32);
2003
2004    ConstVal = 1;
2005    QualType ET = CGM.getContext().getAsArrayType(T)->getElementType();
2006
2007    T = CGM.getContext().getConstantArrayType(ET, ConstVal,
2008                                           ArrayType::Normal, 0);
2009  }
2010
2011  DebugFactory.CreateGlobalVariable(Unit, Name, Name, Name, Unit, LineNo,
2012                                    getOrCreateType(T, Unit),
2013                                    Var->hasInternalLinkage(),
2014                                    true/*definition*/, Var);
2015}
2016
2017/// EmitGlobalVariable - Emit global variable's debug info.
2018void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD,
2019                                     llvm::Constant *Init) {
2020  // Create the descriptor for the variable.
2021  llvm::DIFile Unit = getOrCreateFile(VD->getLocation());
2022  llvm::StringRef Name = VD->getName();
2023  llvm::DIType Ty = getOrCreateType(VD->getType(), Unit);
2024  if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(VD)) {
2025    if (const EnumDecl *ED = dyn_cast<EnumDecl>(ECD->getDeclContext()))
2026      Ty = CreateEnumType(ED, Unit);
2027  }
2028  // Do not use DIGlobalVariable for enums.
2029  if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type)
2030    return;
2031  DebugFactory.CreateGlobalVariable(Unit, Name, Name, Name, Unit,
2032                                    getLineNumber(VD->getLocation()),
2033                                    Ty, true, true, Init);
2034}
2035
2036/// getOrCreateNamesSpace - Return namespace descriptor for the given
2037/// namespace decl.
2038llvm::DINameSpace
2039CGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl,
2040                                  llvm::DIDescriptor Unit) {
2041  llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>::iterator I =
2042    NameSpaceCache.find(NSDecl);
2043  if (I != NameSpaceCache.end())
2044    return llvm::DINameSpace(cast<llvm::MDNode>(I->second));
2045
2046  unsigned LineNo = getLineNumber(NSDecl->getLocation());
2047  llvm::DIFile FileD = getOrCreateFile(NSDecl->getLocation());
2048  llvm::DIDescriptor Context =
2049    getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext()), Unit);
2050  llvm::DINameSpace NS =
2051    DebugFactory.CreateNameSpace(Context, NSDecl->getName(), FileD, LineNo);
2052  NameSpaceCache[NSDecl] = llvm::WeakVH(NS);
2053  return NS;
2054}
2055