17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===--- CGDebugInfo.h - DebugInfo for LLVM CodeGen -------------*- C++ -*-===//
27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//                     The LLVM Compiler Infrastructure
47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source
67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details.
77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This is the source level debug info generator for llvm translation.
117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#ifndef CLANG_CODEGEN_CGDEBUGINFO_H
157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define CLANG_CODEGEN_CGDEBUGINFO_H
167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGBuilder.h"
187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Expr.h"
197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Type.h"
207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceLocation.h"
2113c976710415041fca5aba25cc02d3813c74b990Eric Christopher#include "clang/Frontend/CodeGenOptions.h"
227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/DenseMap.h"
237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/DIBuilder.h"
247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/DebugInfo.h"
257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Allocator.h"
267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/ValueHandle.h"
277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace llvm {
297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class MDNode;
307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace clang {
337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class CXXMethodDecl;
347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class VarDecl;
357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class ObjCInterfaceDecl;
364919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl  class ObjCIvarDecl;
377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class ClassTemplateSpecializationDecl;
387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class GlobalDecl;
399faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  class UsingDecl;
407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace CodeGen {
427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class CodeGenModule;
437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class CodeGenFunction;
447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  class CGBlockInfo;
457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CGDebugInfo - This class gathers all debug information during compilation
477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// and is responsible for emitting to llvm globals or pass directly to
487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the backend.
497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass CGDebugInfo {
50ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  friend class NoLocation;
51b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian Prantl  friend class ArtificialLocation;
527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CodeGenModule &CGM;
533a7d82c4852dfd1e78f7ce7bdd94cc5eb1e4a0bcEric Christopher  const CodeGenOptions::DebugInfoKind DebugKind;
547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIBuilder DBuilder;
557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DICompileUnit TheCU;
567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation CurLoc, PrevLoc;
577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType VTablePtrType;
587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType ClassTy;
59f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher  llvm::DICompositeType ObjTy;
607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType SelTy;
61b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  llvm::DIType OCLImage1dDITy, OCLImage1dArrayDITy, OCLImage1dBufferDITy;
62b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  llvm::DIType OCLImage2dDITy, OCLImage2dArrayDITy;
63b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  llvm::DIType OCLImage3dDITy;
64e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei  llvm::DIType OCLEventDITy;
65688cf5b05713055d27bf53460f7c20a776440767Eric Christopher  llvm::DIType BlockLiteralGeneric;
667c811dc4874124ea083a2f812d227cf53027290bEric Christopher
677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// TypeCache - Cache of previously constructed Types.
687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DenseMap<void *, llvm::WeakVH> TypeCache;
697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
704919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl  /// ObjCInterfaceCache - Cache of previously constructed interfaces
714919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl  /// which may change. Storing a pair of DIType and checksum.
720f855a9c2517fc80803ab81a4aa0bb015918cf21Eric Christopher  llvm::DenseMap<void *, std::pair<llvm::WeakVH, unsigned> > ObjCInterfaceCache;
734919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl
74ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl  /// RetainedTypes - list of interfaces we want to keep even if orphaned.
75ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl  std::vector<void *> RetainedTypes;
76ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl
777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// CompleteTypeCache - Cache of previously constructed complete RecordTypes.
787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DenseMap<void *, llvm::WeakVH> CompletedTypeCache;
797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// ReplaceMap - Cache of forward declared types to RAUW at the end of
817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// compilation.
827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::vector<std::pair<void *, llvm::WeakVH> >ReplaceMap;
837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // LexicalBlockStack - Keep track of our current nested lexical block.
857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::vector<llvm::TrackingVH<llvm::MDNode> > LexicalBlockStack;
867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DenseMap<const Decl *, llvm::WeakVH> RegionMap;
877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FnBeginRegionCount - Keep track of LexicalBlockStack counter at the
887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // beginning of a function. This is used to pop unbalanced regions at
897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // the end of a function.
907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::vector<unsigned> FnBeginRegionCount;
917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// DebugInfoNames - This is a storage for names that are
937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// constructed on demand. For example, C++ destructors, C++ operators etc..
947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::BumpPtrAllocator DebugInfoNames;
957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef CWDName;
967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DenseMap<const char *, llvm::WeakVH> DIFileCache;
987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DenseMap<const FunctionDecl *, llvm::WeakVH> SPCache;
999faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  /// \brief Cache declarations relevant to DW_TAG_imported_declarations (C++
1009faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  /// using declarations) that aren't covered by other more specific caches.
1019faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  llvm::DenseMap<const Decl *, llvm::WeakVH> DeclCache;
1027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH> NameSpaceCache;
103fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie  llvm::DenseMap<const NamespaceAliasDecl *, llvm::WeakVH> NamespaceAliasCache;
1040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  llvm::DenseMap<const Decl *, llvm::WeakVH> StaticDataMemberCache;
1057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// Helper functions for getOrCreateType.
1074919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl  unsigned Checksum(const ObjCInterfaceDecl *InterfaceDecl);
1087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const BuiltinType *Ty);
1097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const ComplexType *Ty);
1105f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie  llvm::DIType CreateQualifiedType(QualType Ty, llvm::DIFile F, bool Declaration);
1115f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie  llvm::DIType CreateType(const TypedefType *Ty, llvm::DIFile F, bool Declaration);
1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const ObjCObjectPointerType *Ty,
1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          llvm::DIFile F);
1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const PointerType *Ty, llvm::DIFile F);
1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const BlockPointerType *Ty, llvm::DIFile F);
1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const FunctionType *Ty, llvm::DIFile F);
1175f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie  llvm::DIType CreateType(const RecordType *Ty, bool Declaration);
1187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateLimitedType(const RecordType *Ty);
1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const ObjCInterfaceType *Ty, llvm::DIFile F);
1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const ObjCObjectType *Ty, llvm::DIFile F);
1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const VectorType *Ty, llvm::DIFile F);
1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const ArrayType *Ty, llvm::DIFile F);
1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const LValueReferenceType *Ty, llvm::DIFile F);
1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const RValueReferenceType *Ty, llvm::DIFile Unit);
1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const MemberPointerType *Ty, llvm::DIFile F);
1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateType(const AtomicType *Ty, llvm::DIFile F);
1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateEnumType(const EnumDecl *ED);
128e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl  llvm::DIType CreateSelfType(const QualType &QualTy, llvm::DIType Ty);
1297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType getTypeOrNull(const QualType);
1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType getCompletedTypeOrNull(const QualType);
1319a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie  llvm::DICompositeType getOrCreateMethodType(const CXXMethodDecl *Method,
1329a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie                                              llvm::DIFile F);
1339a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie  llvm::DICompositeType getOrCreateInstanceMethodType(
1349c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie      QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit);
1359a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie  llvm::DICompositeType getOrCreateFunctionType(const Decl *D, QualType FnType,
1369a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie                                                llvm::DIFile F);
1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType getOrCreateVTablePtrType(llvm::DIFile F);
1387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DINameSpace getOrCreateNameSpace(const NamespaceDecl *N);
139b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie  llvm::DIType getOrCreateTypeDeclaration(QualType PointeeTy, llvm::DIFile F);
1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreatePointerLikeType(unsigned Tag,
1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                     const Type *Ty, QualType PointeeTy,
1427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                     llvm::DIFile F);
143b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei
144ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl  llvm::Value *getCachedInterfaceTypeOrNull(const QualType Ty);
145b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  llvm::DIType getOrCreateStructPtrType(StringRef Name, llvm::DIType &Cache);
146b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei
1477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DISubprogram CreateCXXMemberFunction(const CXXMethodDecl *Method,
1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             llvm::DIFile F,
1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             llvm::DIType RecordTy);
1507c811dc4874124ea083a2f812d227cf53027290bEric Christopher
1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void CollectCXXMemberFunctions(const CXXRecordDecl *Decl,
1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 llvm::DIFile F,
1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 SmallVectorImpl<llvm::Value *> &E,
1547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 llvm::DIType T);
1557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void CollectCXXFriends(const CXXRecordDecl *Decl,
1577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       llvm::DIFile F,
1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       SmallVectorImpl<llvm::Value *> &EltTys,
1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       llvm::DIType RecordTy);
1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void CollectCXXBases(const CXXRecordDecl *Decl,
1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       llvm::DIFile F,
1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       SmallVectorImpl<llvm::Value *> &EltTys,
1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       llvm::DIType RecordTy);
1657c811dc4874124ea083a2f812d227cf53027290bEric Christopher
1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIArray
1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CollectTemplateParams(const TemplateParameterList *TPList,
16835178dc09d97bb2e0612813def09833866e3ad82David Blaikie                        ArrayRef<TemplateArgument> TAList,
1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        llvm::DIFile Unit);
1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIArray
1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit);
1727c811dc4874124ea083a2f812d227cf53027290bEric Christopher  llvm::DIArray
1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TS,
1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           llvm::DIFile F);
1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType createFieldType(StringRef name, QualType type,
1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               uint64_t sizeInBitsOverride, SourceLocation loc,
1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               AccessSpecifier AS, uint64_t offsetInBits,
1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               llvm::DIFile tunit,
1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               llvm::DIDescriptor scope);
1810395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher
1820395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  // Helpers for collecting fields of a record.
1830395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  void CollectRecordLambdaFields(const CXXRecordDecl *CXXDecl,
1840395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher                                 SmallVectorImpl<llvm::Value *> &E,
1850395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher                                 llvm::DIType RecordTy);
1860395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  void CollectRecordStaticField(const VarDecl *Var,
1870395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher                                SmallVectorImpl<llvm::Value *> &E,
1880395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher                                llvm::DIType RecordTy);
1890395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  void CollectRecordNormalField(const FieldDecl *Field, uint64_t OffsetInBits,
1900395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher                                llvm::DIFile F,
1910395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher                                SmallVectorImpl<llvm::Value *> &E,
1920395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher                                llvm::DIType RecordTy);
1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile F,
1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           SmallVectorImpl<llvm::Value *> &E,
1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           llvm::DIType RecordTy);
1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void CollectVTableInfo(const CXXRecordDecl *Decl,
1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                         llvm::DIFile F,
1997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                         SmallVectorImpl<llvm::Value *> &EltTys);
2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // CreateLexicalBlock - Create a new lexical block node and push it on
2027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // the stack.
2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void CreateLexicalBlock(SourceLocation Loc);
2047c811dc4874124ea083a2f812d227cf53027290bEric Christopher
2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CGDebugInfo(CodeGenModule &CGM);
2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ~CGDebugInfo();
2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void finalize();
2107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// setLocation - Update the current source location. If \arg loc is
2127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// invalid it is ignored.
2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void setLocation(SourceLocation Loc);
2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
21559f0a5a5481a6dcfafd092dd944e6cfb7d146d4cAdrian Prantl  /// getLocation - Return the current source location.
21659f0a5a5481a6dcfafd092dd944e6cfb7d146d4cAdrian Prantl  SourceLocation getLocation() const { return CurLoc; }
21759f0a5a5481a6dcfafd092dd944e6cfb7d146d4cAdrian Prantl
2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitLocation - Emit metadata to indicate a change in line/column
2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// information in the source file.
22000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl  /// \param ForceColumnInfo  Assume DebugColumnInfo option is true.
22100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl  void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc,
22200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl                    bool ForceColumnInfo = false);
2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate
2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// start of a new function.
2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitFunctionStart(GlobalDecl GD, QualType FnType,
2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                         llvm::Function *Fn, CGBuilderTy &Builder);
2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitFunctionEnd - Constructs the debug code for exiting a function.
2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitFunctionEnd(CGBuilderTy &Builder);
2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitLexicalBlockStart - Emit metadata to indicate the beginning of a
2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// new lexical block and push the block onto the stack.
2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitLexicalBlockStart(CGBuilderTy &Builder, SourceLocation Loc);
2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitLexicalBlockEnd - Emit metadata to indicate the end of a new lexical
2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// block and pop the current block.
2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitLexicalBlockEnd(CGBuilderTy &Builder, SourceLocation Loc);
2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitDeclareOfAutoVariable - Emit call to llvm.dbg.declare for an automatic
2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// variable declaration.
2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitDeclareOfAutoVariable(const VarDecl *Decl, llvm::Value *AI,
2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 CGBuilderTy &Builder);
2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitDeclareOfBlockDeclRefVariable - Emit call to llvm.dbg.declare for an
2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// imported variable declaration in a block.
2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitDeclareOfBlockDeclRefVariable(const VarDecl *variable,
2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         llvm::Value *storage,
2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         CGBuilderTy &Builder,
2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         const CGBlockInfo &blockInfo);
2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument
2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// variable declaration.
2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitDeclareOfArgVariable(const VarDecl *Decl, llvm::Value *AI,
2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                unsigned ArgNo, CGBuilderTy &Builder);
2567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitDeclareOfBlockLiteralArgVariable - Emit call to
2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// llvm.dbg.declare for the block-literal argument to a block
2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// invocation function.
2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
261836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl                                            llvm::Value *Arg,
262836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl                                            llvm::Value *LocalAddr,
2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                            CGBuilderTy &Builder);
2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitGlobalVariable - Emit information about a global variable.
2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl);
2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitGlobalVariable - Emit information about an objective-c interface.
2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitGlobalVariable(llvm::GlobalVariable *GV, ObjCInterfaceDecl *Decl);
2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitGlobalVariable - Emit global variable's debug info.
2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitGlobalVariable(const ValueDecl *VD, llvm::Constant *Init);
2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
274957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie  /// \brief - Emit C++ using directive.
275957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie  void EmitUsingDirective(const UsingDirectiveDecl &UD);
276957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie
2779faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  /// \brief - Emit C++ using declaration.
2789faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  void EmitUsingDecl(const UsingDecl &UD);
2799faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie
280fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie  /// \brief - Emit C++ namespace alias.
281fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie  llvm::DIImportedEntity EmitNamespaceAlias(const NamespaceAliasDecl &NA);
282fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie
2837c811dc4874124ea083a2f812d227cf53027290bEric Christopher  /// getOrCreateRecordType - Emit record type's standalone debug info.
2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType getOrCreateRecordType(QualType Ty, SourceLocation L);
2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getOrCreateInterfaceType - Emit an objective c interface type standalone
2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// debug info.
2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType getOrCreateInterfaceType(QualType Ty,
28913c976710415041fca5aba25cc02d3813c74b990Eric Christopher                                        SourceLocation Loc);
2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
291076f51fd1f306cafc3b1f1d323d25ac81bf7d4f7David Blaikie  void completeFwdDecl(const RecordDecl &TD);
292eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie
2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiprivate:
2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration.
2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI,
2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                   unsigned ArgNo, CGBuilderTy &Builder);
2977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2987c811dc4874124ea083a2f812d227cf53027290bEric Christopher  // EmitTypeForVarWithBlocksAttr - Build up structure info for the byref.
2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // See BuildByRefType.
3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                            uint64_t *OffSet);
3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getContextDescriptor - Get context info for the decl.
304bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie  llvm::DIScope getContextDescriptor(const Decl *Decl);
3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3069faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  llvm::DIScope getCurrentContextDescriptor(const Decl *Decl);
3079faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie
3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// createRecordFwdDecl - Create a forward decl for a RecordType in a given
3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// context.
3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType createRecordFwdDecl(const RecordDecl *, llvm::DIDescriptor);
3117c811dc4874124ea083a2f812d227cf53027290bEric Christopher
3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// createContextChain - Create a set of decls for the context chain.
3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIDescriptor createContextChain(const Decl *Decl);
3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getCurrentDirname - Return current directory name.
3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef getCurrentDirname();
3177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// CreateCompileUnit - Create new compile unit.
3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void CreateCompileUnit();
3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3217c811dc4874124ea083a2f812d227cf53027290bEric Christopher  /// getOrCreateFile - Get the file debug info descriptor for the input
3227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// location.
3237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIFile getOrCreateFile(SourceLocation Loc);
3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getOrCreateMainFile - Get the file info for main compile unit.
3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIFile getOrCreateMainFile();
3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getOrCreateType - Get the type from the cache or create a new type if
3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// necessary.
3305f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie  llvm::DIType getOrCreateType(QualType Ty, llvm::DIFile F, bool Declaration = false);
3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getOrCreateLimitedType - Get the type from the cache or create a new
3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// partial type if necessary.
3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType getOrCreateLimitedType(QualType Ty, llvm::DIFile F);
3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// CreateTypeNode - Create type metadata for a source language type.
3375f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie  llvm::DIType CreateTypeNode(QualType Ty, llvm::DIFile F, bool Declaration);
3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3394919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl  /// getObjCInterfaceDecl - return the underlying ObjCInterfaceDecl
3404919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl  /// if Ty is an ObjCInterface or a pointer to one.
3414919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl  ObjCInterfaceDecl* getObjCInterfaceDecl(QualType Ty);
3424919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl
3437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// CreateLimitedTypeNode - Create type metadata for a source language
3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// type, but only partial types for records.
3457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateLimitedTypeNode(QualType Ty, llvm::DIFile F);
3467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// CreateMemberType - Create new member and increase Offset by FType's size.
3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DIType CreateMemberType(llvm::DIFile Unit, QualType FType,
3497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                StringRef Name, uint64_t *Offset);
3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3519faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  /// \brief Retrieve the DIDescriptor, if any, for the canonical form of this
3529faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  /// declaration.
3539faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie  llvm::DIDescriptor getDeclarationOrDefinition(const Decl *D);
3549faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie
3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getFunctionDeclaration - Return debug info descriptor to describe method
3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// declaration for the given method definition.
3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DISubprogram getFunctionDeclaration(const Decl *D);
3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3590395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  /// getStaticDataMemberDeclaration - Return debug info descriptor to
3600395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  /// describe in-class static data member declaration for the given
3610395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  /// out-of-class definition.
3620395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher  llvm::DIDerivedType getStaticDataMemberDeclaration(const Decl *D);
3630395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher
3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getFunctionName - Get function name for the given FunctionDecl. If the
3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// name is constructred on demand (e.g. C++ destructor) then the name
3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// is stored on the side.
3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef getFunctionName(const FunctionDecl *FD);
3687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getObjCMethodName - Returns the unmangled name of an Objective-C method.
3707c811dc4874124ea083a2f812d227cf53027290bEric Christopher  /// This is the display name for the debugging info.
3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef getObjCMethodName(const ObjCMethodDecl *FD);
3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getSelectorName - Return selector name. This is used for debugging
3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// info.
3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef getSelectorName(Selector S);
3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getClassName - Get class name including template argument list.
3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef getClassName(const RecordDecl *RD);
3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getVTableName - Get vtable name for the given Class.
3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef getVTableName(const CXXRecordDecl *Decl);
3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// getLineNumber - Get line number for the location. If location is invalid
3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// then use current location.
3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned getLineNumber(SourceLocation Loc);
3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3877c811dc4874124ea083a2f812d227cf53027290bEric Christopher  /// getColumnNumber - Get column number for the location. If location is
3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// invalid then use current location.
38900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl  /// \param Force  Assume DebugColumnInfo option is true.
39000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl  unsigned getColumnNumber(SourceLocation Loc, bool Force=false);
3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
392ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl
393ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl/// NoLocation - An RAII object that temporarily disables debug
394ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl/// locations. This is useful for emitting instructions that should be
395ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl/// counted towards the function prologue.
396ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantlclass NoLocation {
397ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  SourceLocation SavedLoc;
398ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  CGDebugInfo *DI;
399ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  CGBuilderTy &Builder;
400ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantlpublic:
401ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  NoLocation(CodeGenFunction &CGF, CGBuilderTy &B);
402ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  /// ~NoLocation - Autorestore everything back to normal.
403ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  ~NoLocation();
404ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl};
405ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl
406b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian Prantl/// ArtificialLocation - An RAII object that temporarily switches to
407b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian Prantl/// an artificial debug location that has a valid scope, but no line
408ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl/// information. This is useful when emitting compiler-generated
409ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl/// helper functions that have no source location associated with
410b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl/// them. The DWARF specification allows the compiler to use the
411b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl/// special line number 0 to indicate code that can not be attributed
412b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl/// to any source location.
413ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl///
414b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl/// This is necessary because passing an empty SourceLocation to
415ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl/// CGDebugInfo::setLocation() will result in the last valid location
416ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl/// being reused.
417b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian Prantlclass ArtificialLocation {
418ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  SourceLocation SavedLoc;
419ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  CGDebugInfo *DI;
420ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl  CGBuilderTy &Builder;
421ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantlpublic:
422b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian Prantl  ArtificialLocation(CodeGenFunction &CGF, CGBuilderTy &B);
423b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl
424b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl  /// Set the current location to line 0, but within the current scope
42509ade336e928e8b3e325fc46a53cd5f4d1d46252Adrian Prantl  /// (= the top of the LexicalBlockStack).
426b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl  void Emit();
427b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl
428b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl  /// ~ArtificialLocation - Autorestore everything back to normal.
429b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian Prantl  ~ArtificialLocation();
430ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl};
431ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl
432ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl
4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // namespace CodeGen
4347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // namespace clang
4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
438