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 "clang/AST/Type.h"
     18 #include "clang/AST/Expr.h"
     19 #include "clang/Basic/SourceLocation.h"
     20 #include "llvm/ADT/DenseMap.h"
     21 #include "llvm/Analysis/DebugInfo.h"
     22 #include "llvm/Analysis/DIBuilder.h"
     23 #include "llvm/Support/ValueHandle.h"
     24 #include "llvm/Support/Allocator.h"
     25 
     26 #include "CGBuilder.h"
     27 
     28 namespace llvm {
     29   class MDNode;
     30 }
     31 
     32 namespace clang {
     33   class VarDecl;
     34   class ObjCInterfaceDecl;
     35   class ClassTemplateSpecializationDecl;
     36   class GlobalDecl;
     37 
     38 namespace CodeGen {
     39   class CodeGenModule;
     40   class CodeGenFunction;
     41   class CGBlockInfo;
     42 
     43 /// CGDebugInfo - This class gathers all debug information during compilation
     44 /// and is responsible for emitting to llvm globals or pass directly to
     45 /// the backend.
     46 class CGDebugInfo {
     47   CodeGenModule &CGM;
     48   llvm::DIBuilder DBuilder;
     49   llvm::DICompileUnit TheCU;
     50   SourceLocation CurLoc, PrevLoc;
     51   llvm::DIType VTablePtrType;
     52 
     53   /// TypeCache - Cache of previously constructed Types.
     54   llvm::DenseMap<void *, llvm::WeakVH> TypeCache;
     55 
     56   /// CompleteTypeCache - Cache of previously constructed complete RecordTypes.
     57   llvm::DenseMap<void *, llvm::WeakVH> CompletedTypeCache;
     58 
     59   /// ReplaceMap - Cache of forward declared types to RAUW at the end of
     60   /// compilation.
     61   std::vector<std::pair<void *, llvm::WeakVH> >ReplaceMap;
     62 
     63   bool BlockLiteralGenericSet;
     64   llvm::DIType BlockLiteralGeneric;
     65 
     66   // LexicalBlockStack - Keep track of our current nested lexical block.
     67   std::vector<llvm::TrackingVH<llvm::MDNode> > LexicalBlockStack;
     68   llvm::DenseMap<const Decl *, llvm::WeakVH> RegionMap;
     69   // FnBeginRegionCount - Keep track of LexicalBlockStack counter at the
     70   // beginning of a function. This is used to pop unbalanced regions at
     71   // the end of a function.
     72   std::vector<unsigned> FnBeginRegionCount;
     73 
     74   /// DebugInfoNames - This is a storage for names that are
     75   /// constructed on demand. For example, C++ destructors, C++ operators etc..
     76   llvm::BumpPtrAllocator DebugInfoNames;
     77   StringRef CWDName;
     78 
     79   llvm::DenseMap<const char *, llvm::WeakVH> DIFileCache;
     80   llvm::DenseMap<const FunctionDecl *, llvm::WeakVH> SPCache;
     81   llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH> NameSpaceCache;
     82 
     83   /// Helper functions for getOrCreateType.
     84   llvm::DIType CreateType(const BuiltinType *Ty);
     85   llvm::DIType CreateType(const ComplexType *Ty);
     86   llvm::DIType CreateQualifiedType(QualType Ty, llvm::DIFile F);
     87   llvm::DIType CreateType(const TypedefType *Ty, llvm::DIFile F);
     88   llvm::DIType CreateType(const ObjCObjectPointerType *Ty,
     89                           llvm::DIFile F);
     90   llvm::DIType CreateType(const PointerType *Ty, llvm::DIFile F);
     91   llvm::DIType CreateType(const BlockPointerType *Ty, llvm::DIFile F);
     92   llvm::DIType CreateType(const FunctionType *Ty, llvm::DIFile F);
     93   llvm::DIType CreateType(const RecordType *Ty);
     94   llvm::DIType CreateLimitedType(const RecordType *Ty);
     95   llvm::DIType CreateType(const ObjCInterfaceType *Ty, llvm::DIFile F);
     96   llvm::DIType CreateType(const ObjCObjectType *Ty, llvm::DIFile F);
     97   llvm::DIType CreateType(const VectorType *Ty, llvm::DIFile F);
     98   llvm::DIType CreateType(const ArrayType *Ty, llvm::DIFile F);
     99   llvm::DIType CreateType(const LValueReferenceType *Ty, llvm::DIFile F);
    100   llvm::DIType CreateType(const RValueReferenceType *Ty, llvm::DIFile Unit);
    101   llvm::DIType CreateType(const MemberPointerType *Ty, llvm::DIFile F);
    102   llvm::DIType CreateType(const AtomicType *Ty, llvm::DIFile F);
    103   llvm::DIType CreateEnumType(const EnumDecl *ED);
    104   llvm::DIType getTypeOrNull(const QualType);
    105   llvm::DIType getCompletedTypeOrNull(const QualType);
    106   llvm::DIType getOrCreateMethodType(const CXXMethodDecl *Method,
    107                                      llvm::DIFile F);
    108   llvm::DIType getOrCreateFunctionType(const Decl *D, QualType FnType,
    109                                        llvm::DIFile F);
    110   llvm::DIType getOrCreateVTablePtrType(llvm::DIFile F);
    111   llvm::DINameSpace getOrCreateNameSpace(const NamespaceDecl *N);
    112   llvm::DIType CreatePointeeType(QualType PointeeTy, llvm::DIFile F);
    113   llvm::DIType CreatePointerLikeType(unsigned Tag,
    114                                      const Type *Ty, QualType PointeeTy,
    115                                      llvm::DIFile F);
    116 
    117   llvm::DISubprogram CreateCXXMemberFunction(const CXXMethodDecl *Method,
    118                                              llvm::DIFile F,
    119                                              llvm::DIType RecordTy);
    120 
    121   void CollectCXXMemberFunctions(const CXXRecordDecl *Decl,
    122                                  llvm::DIFile F,
    123                                  SmallVectorImpl<llvm::Value *> &E,
    124                                  llvm::DIType T);
    125 
    126   void CollectCXXFriends(const CXXRecordDecl *Decl,
    127                        llvm::DIFile F,
    128                        SmallVectorImpl<llvm::Value *> &EltTys,
    129                        llvm::DIType RecordTy);
    130 
    131   void CollectCXXBases(const CXXRecordDecl *Decl,
    132                        llvm::DIFile F,
    133                        SmallVectorImpl<llvm::Value *> &EltTys,
    134                        llvm::DIType RecordTy);
    135 
    136   llvm::DIArray
    137   CollectTemplateParams(const TemplateParameterList *TPList,
    138                         const TemplateArgumentList &TAList,
    139                         llvm::DIFile Unit);
    140   llvm::DIArray
    141   CollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit);
    142   llvm::DIArray
    143   CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TS,
    144                            llvm::DIFile F);
    145 
    146   llvm::DIType createFieldType(StringRef name, QualType type,
    147                                uint64_t sizeInBitsOverride, SourceLocation loc,
    148                                AccessSpecifier AS, uint64_t offsetInBits,
    149                                llvm::DIFile tunit,
    150                                llvm::DIDescriptor scope);
    151   void CollectRecordStaticVars(const RecordDecl *, llvm::DIType);
    152   void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile F,
    153                            SmallVectorImpl<llvm::Value *> &E,
    154                            llvm::DIType RecordTy);
    155 
    156   void CollectVTableInfo(const CXXRecordDecl *Decl,
    157                          llvm::DIFile F,
    158                          SmallVectorImpl<llvm::Value *> &EltTys);
    159 
    160   // CreateLexicalBlock - Create a new lexical block node and push it on
    161   // the stack.
    162   void CreateLexicalBlock(SourceLocation Loc);
    163 
    164 public:
    165   CGDebugInfo(CodeGenModule &CGM);
    166   ~CGDebugInfo();
    167 
    168   void finalize(void);
    169 
    170   /// setLocation - Update the current source location. If \arg loc is
    171   /// invalid it is ignored.
    172   void setLocation(SourceLocation Loc);
    173 
    174   /// EmitLocation - Emit metadata to indicate a change in line/column
    175   /// information in the source file.
    176   void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc);
    177 
    178   /// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate
    179   /// start of a new function.
    180   void EmitFunctionStart(GlobalDecl GD, QualType FnType,
    181                          llvm::Function *Fn, CGBuilderTy &Builder);
    182 
    183   /// EmitFunctionEnd - Constructs the debug code for exiting a function.
    184   void EmitFunctionEnd(CGBuilderTy &Builder);
    185 
    186   /// EmitLexicalBlockStart - Emit metadata to indicate the beginning of a
    187   /// new lexical block and push the block onto the stack.
    188   void EmitLexicalBlockStart(CGBuilderTy &Builder, SourceLocation Loc);
    189 
    190   /// EmitLexicalBlockEnd - Emit metadata to indicate the end of a new lexical
    191   /// block and pop the current block.
    192   void EmitLexicalBlockEnd(CGBuilderTy &Builder, SourceLocation Loc);
    193 
    194   /// EmitDeclareOfAutoVariable - Emit call to llvm.dbg.declare for an automatic
    195   /// variable declaration.
    196   void EmitDeclareOfAutoVariable(const VarDecl *Decl, llvm::Value *AI,
    197                                  CGBuilderTy &Builder);
    198 
    199   /// EmitDeclareOfBlockDeclRefVariable - Emit call to llvm.dbg.declare for an
    200   /// imported variable declaration in a block.
    201   void EmitDeclareOfBlockDeclRefVariable(const VarDecl *variable,
    202                                          llvm::Value *storage,
    203                                          CGBuilderTy &Builder,
    204                                          const CGBlockInfo &blockInfo);
    205 
    206   /// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument
    207   /// variable declaration.
    208   void EmitDeclareOfArgVariable(const VarDecl *Decl, llvm::Value *AI,
    209                                 unsigned ArgNo, CGBuilderTy &Builder);
    210 
    211   /// EmitDeclareOfBlockLiteralArgVariable - Emit call to
    212   /// llvm.dbg.declare for the block-literal argument to a block
    213   /// invocation function.
    214   void EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
    215                                             llvm::Value *addr,
    216                                             CGBuilderTy &Builder);
    217 
    218   /// EmitGlobalVariable - Emit information about a global variable.
    219   void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl);
    220 
    221   /// EmitGlobalVariable - Emit information about an objective-c interface.
    222   void EmitGlobalVariable(llvm::GlobalVariable *GV, ObjCInterfaceDecl *Decl);
    223 
    224   /// EmitGlobalVariable - Emit global variable's debug info.
    225   void EmitGlobalVariable(const ValueDecl *VD, llvm::Constant *Init);
    226 
    227   /// getOrCreateRecordType - Emit record type's standalone debug info.
    228   llvm::DIType getOrCreateRecordType(QualType Ty, SourceLocation L);
    229 
    230   /// getOrCreateInterfaceType - Emit an objective c interface type standalone
    231   /// debug info.
    232   llvm::DIType getOrCreateInterfaceType(QualType Ty,
    233 					SourceLocation Loc);
    234 
    235 private:
    236   /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration.
    237   void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI,
    238                    unsigned ArgNo, CGBuilderTy &Builder);
    239 
    240   // EmitTypeForVarWithBlocksAttr - Build up structure info for the byref.
    241   // See BuildByRefType.
    242   llvm::DIType EmitTypeForVarWithBlocksAttr(const ValueDecl *VD,
    243                                             uint64_t *OffSet);
    244 
    245   /// getContextDescriptor - Get context info for the decl.
    246   llvm::DIDescriptor getContextDescriptor(const Decl *Decl);
    247 
    248   /// createRecordFwdDecl - Create a forward decl for a RecordType in a given
    249   /// context.
    250   llvm::DIType createRecordFwdDecl(const RecordDecl *, llvm::DIDescriptor);
    251 
    252   /// createContextChain - Create a set of decls for the context chain.
    253   llvm::DIDescriptor createContextChain(const Decl *Decl);
    254 
    255   /// getCurrentDirname - Return current directory name.
    256   StringRef getCurrentDirname();
    257 
    258   /// CreateCompileUnit - Create new compile unit.
    259   void CreateCompileUnit();
    260 
    261   /// getOrCreateFile - Get the file debug info descriptor for the input
    262   /// location.
    263   llvm::DIFile getOrCreateFile(SourceLocation Loc);
    264 
    265   /// getOrCreateMainFile - Get the file info for main compile unit.
    266   llvm::DIFile getOrCreateMainFile();
    267 
    268   /// getOrCreateType - Get the type from the cache or create a new type if
    269   /// necessary.
    270   llvm::DIType getOrCreateType(QualType Ty, llvm::DIFile F);
    271 
    272   /// getOrCreateLimitedType - Get the type from the cache or create a new
    273   /// partial type if necessary.
    274   llvm::DIType getOrCreateLimitedType(QualType Ty, llvm::DIFile F);
    275 
    276   /// CreateTypeNode - Create type metadata for a source language type.
    277   llvm::DIType CreateTypeNode(QualType Ty, llvm::DIFile F);
    278 
    279   /// CreateLimitedTypeNode - Create type metadata for a source language
    280   /// type, but only partial types for records.
    281   llvm::DIType CreateLimitedTypeNode(QualType Ty, llvm::DIFile F);
    282 
    283   /// CreateMemberType - Create new member and increase Offset by FType's size.
    284   llvm::DIType CreateMemberType(llvm::DIFile Unit, QualType FType,
    285                                 StringRef Name, uint64_t *Offset);
    286 
    287   /// getFunctionDeclaration - Return debug info descriptor to describe method
    288   /// declaration for the given method definition.
    289   llvm::DISubprogram getFunctionDeclaration(const Decl *D);
    290 
    291   /// getFunctionName - Get function name for the given FunctionDecl. If the
    292   /// name is constructred on demand (e.g. C++ destructor) then the name
    293   /// is stored on the side.
    294   StringRef getFunctionName(const FunctionDecl *FD);
    295 
    296   /// getObjCMethodName - Returns the unmangled name of an Objective-C method.
    297   /// This is the display name for the debugging info.
    298   StringRef getObjCMethodName(const ObjCMethodDecl *FD);
    299 
    300   /// getSelectorName - Return selector name. This is used for debugging
    301   /// info.
    302   StringRef getSelectorName(Selector S);
    303 
    304   /// getClassName - Get class name including template argument list.
    305   StringRef getClassName(const RecordDecl *RD);
    306 
    307   /// getVTableName - Get vtable name for the given Class.
    308   StringRef getVTableName(const CXXRecordDecl *Decl);
    309 
    310   /// getLineNumber - Get line number for the location. If location is invalid
    311   /// then use current location.
    312   unsigned getLineNumber(SourceLocation Loc);
    313 
    314   /// getColumnNumber - Get column number for the location. If location is
    315   /// invalid then use current location.
    316   unsigned getColumnNumber(SourceLocation Loc);
    317 };
    318 } // namespace CodeGen
    319 } // namespace clang
    320 
    321 
    322 #endif
    323