Home | History | Annotate | Download | only in CodeGen
      1 //===--- CGDebugInfo.h - DebugInfo for LLVM CodeGen -------------*- C++ -*-===//
      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 is the source level debug info generator for llvm translation.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef CLANG_CODEGEN_CGDEBUGINFO_H
     15 #define CLANG_CODEGEN_CGDEBUGINFO_H
     16 
     17 #include "CGBuilder.h"
     18 #include "clang/AST/Expr.h"
     19 #include "clang/AST/Type.h"
     20 #include "clang/Basic/SourceLocation.h"
     21 #include "clang/Frontend/CodeGenOptions.h"
     22 #include "llvm/ADT/DenseMap.h"
     23 #include "llvm/DIBuilder.h"
     24 #include "llvm/DebugInfo.h"
     25 #include "llvm/Support/Allocator.h"
     26 #include "llvm/Support/ValueHandle.h"
     27 
     28 namespace llvm {
     29   class MDNode;
     30 }
     31 
     32 namespace clang {
     33   class CXXMethodDecl;
     34   class VarDecl;
     35   class ObjCInterfaceDecl;
     36   class ObjCIvarDecl;
     37   class ClassTemplateSpecializationDecl;
     38   class GlobalDecl;
     39   class UsingDecl;
     40 
     41 namespace CodeGen {
     42   class CodeGenModule;
     43   class CodeGenFunction;
     44   class CGBlockInfo;
     45 
     46 /// CGDebugInfo - This class gathers all debug information during compilation
     47 /// and is responsible for emitting to llvm globals or pass directly to
     48 /// the backend.
     49 class CGDebugInfo {
     50   friend class NoLocation;
     51   friend class ArtificialLocation;
     52   CodeGenModule &CGM;
     53   const CodeGenOptions::DebugInfoKind DebugKind;
     54   llvm::DIBuilder DBuilder;
     55   llvm::DICompileUnit TheCU;
     56   SourceLocation CurLoc, PrevLoc;
     57   llvm::DIType VTablePtrType;
     58   llvm::DIType ClassTy;
     59   llvm::DICompositeType ObjTy;
     60   llvm::DIType SelTy;
     61   llvm::DIType OCLImage1dDITy, OCLImage1dArrayDITy, OCLImage1dBufferDITy;
     62   llvm::DIType OCLImage2dDITy, OCLImage2dArrayDITy;
     63   llvm::DIType OCLImage3dDITy;
     64   llvm::DIType OCLEventDITy;
     65   llvm::DIType BlockLiteralGeneric;
     66 
     67   /// TypeCache - Cache of previously constructed Types.
     68   llvm::DenseMap<void *, llvm::WeakVH> TypeCache;
     69 
     70   /// ObjCInterfaceCache - Cache of previously constructed interfaces
     71   /// which may change. Storing a pair of DIType and checksum.
     72   llvm::DenseMap<void *, std::pair<llvm::WeakVH, unsigned> > ObjCInterfaceCache;
     73 
     74   /// RetainedTypes - list of interfaces we want to keep even if orphaned.
     75   std::vector<void *> RetainedTypes;
     76 
     77   /// CompleteTypeCache - Cache of previously constructed complete RecordTypes.
     78   llvm::DenseMap<void *, llvm::WeakVH> CompletedTypeCache;
     79 
     80   /// ReplaceMap - Cache of forward declared types to RAUW at the end of
     81   /// compilation.
     82   std::vector<std::pair<void *, llvm::WeakVH> >ReplaceMap;
     83 
     84   // LexicalBlockStack - Keep track of our current nested lexical block.
     85   std::vector<llvm::TrackingVH<llvm::MDNode> > LexicalBlockStack;
     86   llvm::DenseMap<const Decl *, llvm::WeakVH> RegionMap;
     87   // FnBeginRegionCount - Keep track of LexicalBlockStack counter at the
     88   // beginning of a function. This is used to pop unbalanced regions at
     89   // the end of a function.
     90   std::vector<unsigned> FnBeginRegionCount;
     91 
     92   /// DebugInfoNames - This is a storage for names that are
     93   /// constructed on demand. For example, C++ destructors, C++ operators etc..
     94   llvm::BumpPtrAllocator DebugInfoNames;
     95   StringRef CWDName;
     96 
     97   llvm::DenseMap<const char *, llvm::WeakVH> DIFileCache;
     98   llvm::DenseMap<const FunctionDecl *, llvm::WeakVH> SPCache;
     99   /// \brief Cache declarations relevant to DW_TAG_imported_declarations (C++
    100   /// using declarations) that aren't covered by other more specific caches.
    101   llvm::DenseMap<const Decl *, llvm::WeakVH> DeclCache;
    102   llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH> NameSpaceCache;
    103   llvm::DenseMap<const NamespaceAliasDecl *, llvm::WeakVH> NamespaceAliasCache;
    104   llvm::DenseMap<const Decl *, llvm::WeakVH> StaticDataMemberCache;
    105 
    106   /// Helper functions for getOrCreateType.
    107   unsigned Checksum(const ObjCInterfaceDecl *InterfaceDecl);
    108   llvm::DIType CreateType(const BuiltinType *Ty);
    109   llvm::DIType CreateType(const ComplexType *Ty);
    110   llvm::DIType CreateQualifiedType(QualType Ty, llvm::DIFile F, bool Declaration);
    111   llvm::DIType CreateType(const TypedefType *Ty, llvm::DIFile F, bool Declaration);
    112   llvm::DIType CreateType(const ObjCObjectPointerType *Ty,
    113                           llvm::DIFile F);
    114   llvm::DIType CreateType(const PointerType *Ty, llvm::DIFile F);
    115   llvm::DIType CreateType(const BlockPointerType *Ty, llvm::DIFile F);
    116   llvm::DIType CreateType(const FunctionType *Ty, llvm::DIFile F);
    117   llvm::DIType CreateType(const RecordType *Ty, bool Declaration);
    118   llvm::DIType CreateLimitedType(const RecordType *Ty);
    119   llvm::DIType CreateType(const ObjCInterfaceType *Ty, llvm::DIFile F);
    120   llvm::DIType CreateType(const ObjCObjectType *Ty, llvm::DIFile F);
    121   llvm::DIType CreateType(const VectorType *Ty, llvm::DIFile F);
    122   llvm::DIType CreateType(const ArrayType *Ty, llvm::DIFile F);
    123   llvm::DIType CreateType(const LValueReferenceType *Ty, llvm::DIFile F);
    124   llvm::DIType CreateType(const RValueReferenceType *Ty, llvm::DIFile Unit);
    125   llvm::DIType CreateType(const MemberPointerType *Ty, llvm::DIFile F);
    126   llvm::DIType CreateType(const AtomicType *Ty, llvm::DIFile F);
    127   llvm::DIType CreateEnumType(const EnumDecl *ED);
    128   llvm::DIType CreateSelfType(const QualType &QualTy, llvm::DIType Ty);
    129   llvm::DIType getTypeOrNull(const QualType);
    130   llvm::DIType getCompletedTypeOrNull(const QualType);
    131   llvm::DICompositeType getOrCreateMethodType(const CXXMethodDecl *Method,
    132                                               llvm::DIFile F);
    133   llvm::DICompositeType getOrCreateInstanceMethodType(
    134       QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit);
    135   llvm::DICompositeType getOrCreateFunctionType(const Decl *D, QualType FnType,
    136                                                 llvm::DIFile F);
    137   llvm::DIType getOrCreateVTablePtrType(llvm::DIFile F);
    138   llvm::DINameSpace getOrCreateNameSpace(const NamespaceDecl *N);
    139   llvm::DIType getOrCreateTypeDeclaration(QualType PointeeTy, llvm::DIFile F);
    140   llvm::DIType CreatePointerLikeType(unsigned Tag,
    141                                      const Type *Ty, QualType PointeeTy,
    142                                      llvm::DIFile F);
    143 
    144   llvm::Value *getCachedInterfaceTypeOrNull(const QualType Ty);
    145   llvm::DIType getOrCreateStructPtrType(StringRef Name, llvm::DIType &Cache);
    146 
    147   llvm::DISubprogram CreateCXXMemberFunction(const CXXMethodDecl *Method,
    148                                              llvm::DIFile F,
    149                                              llvm::DIType RecordTy);
    150 
    151   void CollectCXXMemberFunctions(const CXXRecordDecl *Decl,
    152                                  llvm::DIFile F,
    153                                  SmallVectorImpl<llvm::Value *> &E,
    154                                  llvm::DIType T);
    155 
    156   void CollectCXXFriends(const CXXRecordDecl *Decl,
    157                        llvm::DIFile F,
    158                        SmallVectorImpl<llvm::Value *> &EltTys,
    159                        llvm::DIType RecordTy);
    160 
    161   void CollectCXXBases(const CXXRecordDecl *Decl,
    162                        llvm::DIFile F,
    163                        SmallVectorImpl<llvm::Value *> &EltTys,
    164                        llvm::DIType RecordTy);
    165 
    166   llvm::DIArray
    167   CollectTemplateParams(const TemplateParameterList *TPList,
    168                         ArrayRef<TemplateArgument> TAList,
    169                         llvm::DIFile Unit);
    170   llvm::DIArray
    171   CollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit);
    172   llvm::DIArray
    173   CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TS,
    174                            llvm::DIFile F);
    175 
    176   llvm::DIType createFieldType(StringRef name, QualType type,
    177                                uint64_t sizeInBitsOverride, SourceLocation loc,
    178                                AccessSpecifier AS, uint64_t offsetInBits,
    179                                llvm::DIFile tunit,
    180                                llvm::DIDescriptor scope);
    181 
    182   // Helpers for collecting fields of a record.
    183   void CollectRecordLambdaFields(const CXXRecordDecl *CXXDecl,
    184                                  SmallVectorImpl<llvm::Value *> &E,
    185                                  llvm::DIType RecordTy);
    186   void CollectRecordStaticField(const VarDecl *Var,
    187                                 SmallVectorImpl<llvm::Value *> &E,
    188                                 llvm::DIType RecordTy);
    189   void CollectRecordNormalField(const FieldDecl *Field, uint64_t OffsetInBits,
    190                                 llvm::DIFile F,
    191                                 SmallVectorImpl<llvm::Value *> &E,
    192                                 llvm::DIType RecordTy);
    193   void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile F,
    194                            SmallVectorImpl<llvm::Value *> &E,
    195                            llvm::DIType RecordTy);
    196 
    197   void CollectVTableInfo(const CXXRecordDecl *Decl,
    198                          llvm::DIFile F,
    199                          SmallVectorImpl<llvm::Value *> &EltTys);
    200 
    201   // CreateLexicalBlock - Create a new lexical block node and push it on
    202   // the stack.
    203   void CreateLexicalBlock(SourceLocation Loc);
    204 
    205 public:
    206   CGDebugInfo(CodeGenModule &CGM);
    207   ~CGDebugInfo();
    208 
    209   void finalize();
    210 
    211   /// setLocation - Update the current source location. If \arg loc is
    212   /// invalid it is ignored.
    213   void setLocation(SourceLocation Loc);
    214 
    215   /// getLocation - Return the current source location.
    216   SourceLocation getLocation() const { return CurLoc; }
    217 
    218   /// EmitLocation - Emit metadata to indicate a change in line/column
    219   /// information in the source file.
    220   /// \param ForceColumnInfo  Assume DebugColumnInfo option is true.
    221   void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc,
    222                     bool ForceColumnInfo = false);
    223 
    224   /// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate
    225   /// start of a new function.
    226   void EmitFunctionStart(GlobalDecl GD, QualType FnType,
    227                          llvm::Function *Fn, CGBuilderTy &Builder);
    228 
    229   /// EmitFunctionEnd - Constructs the debug code for exiting a function.
    230   void EmitFunctionEnd(CGBuilderTy &Builder);
    231 
    232   /// EmitLexicalBlockStart - Emit metadata to indicate the beginning of a
    233   /// new lexical block and push the block onto the stack.
    234   void EmitLexicalBlockStart(CGBuilderTy &Builder, SourceLocation Loc);
    235 
    236   /// EmitLexicalBlockEnd - Emit metadata to indicate the end of a new lexical
    237   /// block and pop the current block.
    238   void EmitLexicalBlockEnd(CGBuilderTy &Builder, SourceLocation Loc);
    239 
    240   /// EmitDeclareOfAutoVariable - Emit call to llvm.dbg.declare for an automatic
    241   /// variable declaration.
    242   void EmitDeclareOfAutoVariable(const VarDecl *Decl, llvm::Value *AI,
    243                                  CGBuilderTy &Builder);
    244 
    245   /// EmitDeclareOfBlockDeclRefVariable - Emit call to llvm.dbg.declare for an
    246   /// imported variable declaration in a block.
    247   void EmitDeclareOfBlockDeclRefVariable(const VarDecl *variable,
    248                                          llvm::Value *storage,
    249                                          CGBuilderTy &Builder,
    250                                          const CGBlockInfo &blockInfo);
    251 
    252   /// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument
    253   /// variable declaration.
    254   void EmitDeclareOfArgVariable(const VarDecl *Decl, llvm::Value *AI,
    255                                 unsigned ArgNo, CGBuilderTy &Builder);
    256 
    257   /// EmitDeclareOfBlockLiteralArgVariable - Emit call to
    258   /// llvm.dbg.declare for the block-literal argument to a block
    259   /// invocation function.
    260   void EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
    261                                             llvm::Value *Arg,
    262                                             llvm::Value *LocalAddr,
    263                                             CGBuilderTy &Builder);
    264 
    265   /// EmitGlobalVariable - Emit information about a global variable.
    266   void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl);
    267 
    268   /// EmitGlobalVariable - Emit information about an objective-c interface.
    269   void EmitGlobalVariable(llvm::GlobalVariable *GV, ObjCInterfaceDecl *Decl);
    270 
    271   /// EmitGlobalVariable - Emit global variable's debug info.
    272   void EmitGlobalVariable(const ValueDecl *VD, llvm::Constant *Init);
    273 
    274   /// \brief - Emit C++ using directive.
    275   void EmitUsingDirective(const UsingDirectiveDecl &UD);
    276 
    277   /// \brief - Emit C++ using declaration.
    278   void EmitUsingDecl(const UsingDecl &UD);
    279 
    280   /// \brief - Emit C++ namespace alias.
    281   llvm::DIImportedEntity EmitNamespaceAlias(const NamespaceAliasDecl &NA);
    282 
    283   /// getOrCreateRecordType - Emit record type's standalone debug info.
    284   llvm::DIType getOrCreateRecordType(QualType Ty, SourceLocation L);
    285 
    286   /// getOrCreateInterfaceType - Emit an objective c interface type standalone
    287   /// debug info.
    288   llvm::DIType getOrCreateInterfaceType(QualType Ty,
    289                                         SourceLocation Loc);
    290 
    291   void completeFwdDecl(const RecordDecl &TD);
    292 
    293 private:
    294   /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration.
    295   void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI,
    296                    unsigned ArgNo, CGBuilderTy &Builder);
    297 
    298   // EmitTypeForVarWithBlocksAttr - Build up structure info for the byref.
    299   // See BuildByRefType.
    300   llvm::DIType EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
    301                                             uint64_t *OffSet);
    302 
    303   /// getContextDescriptor - Get context info for the decl.
    304   llvm::DIScope getContextDescriptor(const Decl *Decl);
    305 
    306   llvm::DIScope getCurrentContextDescriptor(const Decl *Decl);
    307 
    308   /// createRecordFwdDecl - Create a forward decl for a RecordType in a given
    309   /// context.
    310   llvm::DIType createRecordFwdDecl(const RecordDecl *, llvm::DIDescriptor);
    311 
    312   /// createContextChain - Create a set of decls for the context chain.
    313   llvm::DIDescriptor createContextChain(const Decl *Decl);
    314 
    315   /// getCurrentDirname - Return current directory name.
    316   StringRef getCurrentDirname();
    317 
    318   /// CreateCompileUnit - Create new compile unit.
    319   void CreateCompileUnit();
    320 
    321   /// getOrCreateFile - Get the file debug info descriptor for the input
    322   /// location.
    323   llvm::DIFile getOrCreateFile(SourceLocation Loc);
    324 
    325   /// getOrCreateMainFile - Get the file info for main compile unit.
    326   llvm::DIFile getOrCreateMainFile();
    327 
    328   /// getOrCreateType - Get the type from the cache or create a new type if
    329   /// necessary.
    330   llvm::DIType getOrCreateType(QualType Ty, llvm::DIFile F, bool Declaration = false);
    331 
    332   /// getOrCreateLimitedType - Get the type from the cache or create a new
    333   /// partial type if necessary.
    334   llvm::DIType getOrCreateLimitedType(QualType Ty, llvm::DIFile F);
    335 
    336   /// CreateTypeNode - Create type metadata for a source language type.
    337   llvm::DIType CreateTypeNode(QualType Ty, llvm::DIFile F, bool Declaration);
    338 
    339   /// getObjCInterfaceDecl - return the underlying ObjCInterfaceDecl
    340   /// if Ty is an ObjCInterface or a pointer to one.
    341   ObjCInterfaceDecl* getObjCInterfaceDecl(QualType Ty);
    342 
    343   /// CreateLimitedTypeNode - Create type metadata for a source language
    344   /// type, but only partial types for records.
    345   llvm::DIType CreateLimitedTypeNode(QualType Ty, llvm::DIFile F);
    346 
    347   /// CreateMemberType - Create new member and increase Offset by FType's size.
    348   llvm::DIType CreateMemberType(llvm::DIFile Unit, QualType FType,
    349                                 StringRef Name, uint64_t *Offset);
    350 
    351   /// \brief Retrieve the DIDescriptor, if any, for the canonical form of this
    352   /// declaration.
    353   llvm::DIDescriptor getDeclarationOrDefinition(const Decl *D);
    354 
    355   /// getFunctionDeclaration - Return debug info descriptor to describe method
    356   /// declaration for the given method definition.
    357   llvm::DISubprogram getFunctionDeclaration(const Decl *D);
    358 
    359   /// getStaticDataMemberDeclaration - Return debug info descriptor to
    360   /// describe in-class static data member declaration for the given
    361   /// out-of-class definition.
    362   llvm::DIDerivedType getStaticDataMemberDeclaration(const Decl *D);
    363 
    364   /// getFunctionName - Get function name for the given FunctionDecl. If the
    365   /// name is constructred on demand (e.g. C++ destructor) then the name
    366   /// is stored on the side.
    367   StringRef getFunctionName(const FunctionDecl *FD);
    368 
    369   /// getObjCMethodName - Returns the unmangled name of an Objective-C method.
    370   /// This is the display name for the debugging info.
    371   StringRef getObjCMethodName(const ObjCMethodDecl *FD);
    372 
    373   /// getSelectorName - Return selector name. This is used for debugging
    374   /// info.
    375   StringRef getSelectorName(Selector S);
    376 
    377   /// getClassName - Get class name including template argument list.
    378   StringRef getClassName(const RecordDecl *RD);
    379 
    380   /// getVTableName - Get vtable name for the given Class.
    381   StringRef getVTableName(const CXXRecordDecl *Decl);
    382 
    383   /// getLineNumber - Get line number for the location. If location is invalid
    384   /// then use current location.
    385   unsigned getLineNumber(SourceLocation Loc);
    386 
    387   /// getColumnNumber - Get column number for the location. If location is
    388   /// invalid then use current location.
    389   /// \param Force  Assume DebugColumnInfo option is true.
    390   unsigned getColumnNumber(SourceLocation Loc, bool Force=false);
    391 };
    392 
    393 /// NoLocation - An RAII object that temporarily disables debug
    394 /// locations. This is useful for emitting instructions that should be
    395 /// counted towards the function prologue.
    396 class NoLocation {
    397   SourceLocation SavedLoc;
    398   CGDebugInfo *DI;
    399   CGBuilderTy &Builder;
    400 public:
    401   NoLocation(CodeGenFunction &CGF, CGBuilderTy &B);
    402   /// ~NoLocation - Autorestore everything back to normal.
    403   ~NoLocation();
    404 };
    405 
    406 /// ArtificialLocation - An RAII object that temporarily switches to
    407 /// an artificial debug location that has a valid scope, but no line
    408 /// information. This is useful when emitting compiler-generated
    409 /// helper functions that have no source location associated with
    410 /// them. The DWARF specification allows the compiler to use the
    411 /// special line number 0 to indicate code that can not be attributed
    412 /// to any source location.
    413 ///
    414 /// This is necessary because passing an empty SourceLocation to
    415 /// CGDebugInfo::setLocation() will result in the last valid location
    416 /// being reused.
    417 class ArtificialLocation {
    418   SourceLocation SavedLoc;
    419   CGDebugInfo *DI;
    420   CGBuilderTy &Builder;
    421 public:
    422   ArtificialLocation(CodeGenFunction &CGF, CGBuilderTy &B);
    423 
    424   /// Set the current location to line 0, but within the current scope
    425   /// (= the top of the LexicalBlockStack).
    426   void Emit();
    427 
    428   /// ~ArtificialLocation - Autorestore everything back to normal.
    429   ~ArtificialLocation();
    430 };
    431 
    432 
    433 } // namespace CodeGen
    434 } // namespace clang
    435 
    436 
    437 #endif
    438