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