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