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