diff options
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.h')
| -rw-r--r-- | lib/CodeGen/CGDebugInfo.h | 421 | 
1 files changed, 220 insertions, 201 deletions
| diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index 0be032c1d790..8509e0770db6 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -43,47 +43,50 @@ namespace CodeGen {    class CodeGenFunction;    class CGBlockInfo; -/// CGDebugInfo - This class gathers all debug information during compilation +/// \brief This class gathers all debug information during compilation  /// and is responsible for emitting to llvm globals or pass directly to  /// the backend.  class CGDebugInfo { -  friend class ArtificialLocation; +  friend class ApplyDebugLocation;    friend class SaveAndRestoreLocation;    CodeGenModule &CGM;    const CodeGenOptions::DebugInfoKind DebugKind;    llvm::DIBuilder DBuilder; -  llvm::DICompileUnit TheCU; +  llvm::DICompileUnit *TheCU = nullptr;    SourceLocation CurLoc; -  llvm::DIType VTablePtrType; -  llvm::DIType ClassTy; -  llvm::DICompositeType ObjTy; -  llvm::DIType SelTy; -  llvm::DIType OCLImage1dDITy, OCLImage1dArrayDITy, OCLImage1dBufferDITy; -  llvm::DIType OCLImage2dDITy, OCLImage2dArrayDITy; -  llvm::DIType OCLImage3dDITy; -  llvm::DIType OCLEventDITy; -  llvm::DIType BlockLiteralGeneric; - -  /// TypeCache - Cache of previously constructed Types. +  llvm::DIType *VTablePtrType = nullptr; +  llvm::DIType *ClassTy = nullptr; +  llvm::DICompositeType *ObjTy = nullptr; +  llvm::DIType *SelTy = nullptr; +  llvm::DIType *OCLImage1dDITy = nullptr; +  llvm::DIType *OCLImage1dArrayDITy = nullptr; +  llvm::DIType *OCLImage1dBufferDITy = nullptr; +  llvm::DIType *OCLImage2dDITy = nullptr; +  llvm::DIType *OCLImage2dArrayDITy = nullptr; +  llvm::DIType *OCLImage3dDITy = nullptr; +  llvm::DIType *OCLEventDITy = nullptr; +  llvm::DIType *BlockLiteralGeneric = nullptr; + +  /// \brief Cache of previously constructed Types.    llvm::DenseMap<const void *, llvm::TrackingMDRef> TypeCache;    struct ObjCInterfaceCacheEntry {      const ObjCInterfaceType *Type; -    llvm::DIType Decl; -    llvm::DIFile Unit; -    ObjCInterfaceCacheEntry(const ObjCInterfaceType *Type, llvm::DIType Decl, -                            llvm::DIFile Unit) +    llvm::DIType *Decl; +    llvm::DIFile *Unit; +    ObjCInterfaceCacheEntry(const ObjCInterfaceType *Type, llvm::DIType *Decl, +                            llvm::DIFile *Unit)          : Type(Type), Decl(Decl), Unit(Unit) {}    }; -  /// ObjCInterfaceCache - Cache of previously constructed interfaces +  /// \brief Cache of previously constructed interfaces    /// which may change.    llvm::SmallVector<ObjCInterfaceCacheEntry, 32> ObjCInterfaceCache; -  /// RetainedTypes - list of interfaces we want to keep even if orphaned. +  /// \brief list of interfaces we want to keep even if orphaned.    std::vector<void *> RetainedTypes; -  /// ReplaceMap - Cache of forward declared types to RAUW at the end of +  /// \brief Cache of forward declared types to RAUW at the end of    /// compilation.    std::vector<std::pair<const TagType *, llvm::TrackingMDRef>> ReplaceMap; @@ -93,14 +96,14 @@ class CGDebugInfo {        FwdDeclReplaceMap;    // LexicalBlockStack - Keep track of our current nested lexical block. -  std::vector<llvm::TrackingMDNodeRef> LexicalBlockStack; +  std::vector<llvm::TypedTrackingMDRef<llvm::DIScope>> LexicalBlockStack;    llvm::DenseMap<const Decl *, llvm::TrackingMDRef> RegionMap;    // FnBeginRegionCount - Keep track of LexicalBlockStack counter at the    // beginning of a function. This is used to pop unbalanced regions at    // the end of a function.    std::vector<unsigned> FnBeginRegionCount; -  /// DebugInfoNames - This is a storage for names that are +  /// \brief This is a storage for names that are    /// constructed on demand. For example, C++ destructors, C++ operators etc..    llvm::BumpPtrAllocator DebugInfoNames;    StringRef CWDName; @@ -117,95 +120,94 @@ class CGDebugInfo {    /// Helper functions for getOrCreateType.    unsigned Checksum(const ObjCInterfaceDecl *InterfaceDecl); -  llvm::DIType CreateType(const BuiltinType *Ty); -  llvm::DIType CreateType(const ComplexType *Ty); -  llvm::DIType CreateQualifiedType(QualType Ty, llvm::DIFile Fg); -  llvm::DIType CreateType(const TypedefType *Ty, llvm::DIFile Fg); -  llvm::DIType CreateType(const TemplateSpecializationType *Ty, llvm::DIFile Fg); -  llvm::DIType CreateType(const ObjCObjectPointerType *Ty, -                          llvm::DIFile F); -  llvm::DIType CreateType(const PointerType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const BlockPointerType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const FunctionType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const RecordType *Tyg); -  llvm::DIType CreateTypeDefinition(const RecordType *Ty); -  llvm::DICompositeType CreateLimitedType(const RecordType *Ty); -  void CollectContainingType(const CXXRecordDecl *RD, llvm::DICompositeType CT); -  llvm::DIType CreateType(const ObjCInterfaceType *Ty, llvm::DIFile F); -  llvm::DIType CreateTypeDefinition(const ObjCInterfaceType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const ObjCObjectType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const VectorType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const ArrayType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const LValueReferenceType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const RValueReferenceType *Ty, llvm::DIFile Unit); -  llvm::DIType CreateType(const MemberPointerType *Ty, llvm::DIFile F); -  llvm::DIType CreateType(const AtomicType *Ty, llvm::DIFile F); -  llvm::DIType CreateEnumType(const EnumType *Ty); -  llvm::DIType CreateTypeDefinition(const EnumType *Ty); -  llvm::DIType CreateSelfType(const QualType &QualTy, llvm::DIType Ty); -  llvm::DIType getTypeOrNull(const QualType); -  llvm::DICompositeType getOrCreateMethodType(const CXXMethodDecl *Method, -                                              llvm::DIFile F); -  llvm::DICompositeType getOrCreateInstanceMethodType( -      QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit); -  llvm::DICompositeType getOrCreateFunctionType(const Decl *D, QualType FnType, -                                                llvm::DIFile F); -  llvm::DIType getOrCreateVTablePtrType(llvm::DIFile F); -  llvm::DINameSpace getOrCreateNameSpace(const NamespaceDecl *N); -  llvm::DIType getOrCreateTypeDeclaration(QualType PointeeTy, llvm::DIFile F); -  llvm::DIType CreatePointerLikeType(llvm::dwarf::Tag Tag, -                                     const Type *Ty, QualType PointeeTy, -                                     llvm::DIFile F); +  llvm::DIType *CreateType(const BuiltinType *Ty); +  llvm::DIType *CreateType(const ComplexType *Ty); +  llvm::DIType *CreateQualifiedType(QualType Ty, llvm::DIFile *Fg); +  llvm::DIType *CreateType(const TypedefType *Ty, llvm::DIFile *Fg); +  llvm::DIType *CreateType(const TemplateSpecializationType *Ty, +                           llvm::DIFile *Fg); +  llvm::DIType *CreateType(const ObjCObjectPointerType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const PointerType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const BlockPointerType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const FunctionType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const RecordType *Tyg); +  llvm::DIType *CreateTypeDefinition(const RecordType *Ty); +  llvm::DICompositeType *CreateLimitedType(const RecordType *Ty); +  void CollectContainingType(const CXXRecordDecl *RD, +                             llvm::DICompositeType *CT); +  llvm::DIType *CreateType(const ObjCInterfaceType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateTypeDefinition(const ObjCInterfaceType *Ty, +                                     llvm::DIFile *F); +  llvm::DIType *CreateType(const ObjCObjectType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const VectorType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const ArrayType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const LValueReferenceType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const RValueReferenceType *Ty, llvm::DIFile *Unit); +  llvm::DIType *CreateType(const MemberPointerType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateType(const AtomicType *Ty, llvm::DIFile *F); +  llvm::DIType *CreateEnumType(const EnumType *Ty); +  llvm::DIType *CreateTypeDefinition(const EnumType *Ty); +  llvm::DIType *CreateSelfType(const QualType &QualTy, llvm::DIType *Ty); +  llvm::DIType *getTypeOrNull(const QualType); +  llvm::DISubroutineType *getOrCreateMethodType(const CXXMethodDecl *Method, +                                                llvm::DIFile *F); +  llvm::DISubroutineType * +  getOrCreateInstanceMethodType(QualType ThisPtr, const FunctionProtoType *Func, +                                llvm::DIFile *Unit); +  llvm::DISubroutineType * +  getOrCreateFunctionType(const Decl *D, QualType FnType, llvm::DIFile *F); +  llvm::DIType *getOrCreateVTablePtrType(llvm::DIFile *F); +  llvm::DINamespace *getOrCreateNameSpace(const NamespaceDecl *N); +  llvm::DIType *getOrCreateTypeDeclaration(QualType PointeeTy, llvm::DIFile *F); +  llvm::DIType *CreatePointerLikeType(llvm::dwarf::Tag Tag, const Type *Ty, +                                      QualType PointeeTy, llvm::DIFile *F);    llvm::Value *getCachedInterfaceTypeOrNull(const QualType Ty); -  llvm::DIType getOrCreateStructPtrType(StringRef Name, llvm::DIType &Cache); +  llvm::DIType *getOrCreateStructPtrType(StringRef Name, llvm::DIType *&Cache); -  llvm::DISubprogram CreateCXXMemberFunction(const CXXMethodDecl *Method, -                                             llvm::DIFile F, -                                             llvm::DIType RecordTy); +  llvm::DISubprogram *CreateCXXMemberFunction(const CXXMethodDecl *Method, +                                              llvm::DIFile *F, +                                              llvm::DIType *RecordTy); -  void CollectCXXMemberFunctions(const CXXRecordDecl *Decl, llvm::DIFile F, +  void CollectCXXMemberFunctions(const CXXRecordDecl *Decl, llvm::DIFile *F,                                   SmallVectorImpl<llvm::Metadata *> &E, -                                 llvm::DIType T); +                                 llvm::DIType *T); -  void CollectCXXBases(const CXXRecordDecl *Decl, llvm::DIFile F, +  void CollectCXXBases(const CXXRecordDecl *Decl, llvm::DIFile *F,                         SmallVectorImpl<llvm::Metadata *> &EltTys, -                       llvm::DIType RecordTy); - -  llvm::DIArray -  CollectTemplateParams(const TemplateParameterList *TPList, -                        ArrayRef<TemplateArgument> TAList, -                        llvm::DIFile Unit); -  llvm::DIArray -  CollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit); -  llvm::DIArray +                       llvm::DIType *RecordTy); + +  llvm::DINodeArray CollectTemplateParams(const TemplateParameterList *TPList, +                                          ArrayRef<TemplateArgument> TAList, +                                          llvm::DIFile *Unit); +  llvm::DINodeArray CollectFunctionTemplateParams(const FunctionDecl *FD, +                                                  llvm::DIFile *Unit); +  llvm::DINodeArray    CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TS, -                           llvm::DIFile F); +                           llvm::DIFile *F); -  llvm::DIType createFieldType(StringRef name, QualType type, -                               uint64_t sizeInBitsOverride, SourceLocation loc, -                               AccessSpecifier AS, -                               uint64_t offsetInBits, -                               llvm::DIFile tunit, -                               llvm::DIScope scope, -                               const RecordDecl* RD = nullptr); +  llvm::DIType *createFieldType(StringRef name, QualType type, +                                uint64_t sizeInBitsOverride, SourceLocation loc, +                                AccessSpecifier AS, uint64_t offsetInBits, +                                llvm::DIFile *tunit, llvm::DIScope *scope, +                                const RecordDecl *RD = nullptr);    // Helpers for collecting fields of a record.    void CollectRecordLambdaFields(const CXXRecordDecl *CXXDecl,                                   SmallVectorImpl<llvm::Metadata *> &E, -                                 llvm::DIType RecordTy); -  llvm::DIDerivedType CreateRecordStaticField(const VarDecl *Var, -                                              llvm::DIType RecordTy, -                                              const RecordDecl* RD); +                                 llvm::DIType *RecordTy); +  llvm::DIDerivedType *CreateRecordStaticField(const VarDecl *Var, +                                               llvm::DIType *RecordTy, +                                               const RecordDecl *RD);    void CollectRecordNormalField(const FieldDecl *Field, uint64_t OffsetInBits, -                                llvm::DIFile F, +                                llvm::DIFile *F,                                  SmallVectorImpl<llvm::Metadata *> &E, -                                llvm::DIType RecordTy, const RecordDecl *RD); -  void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile F, +                                llvm::DIType *RecordTy, const RecordDecl *RD); +  void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile *F,                             SmallVectorImpl<llvm::Metadata *> &E, -                           llvm::DICompositeType RecordTy); +                           llvm::DICompositeType *RecordTy); -  void CollectVTableInfo(const CXXRecordDecl *Decl, llvm::DIFile F, +  void CollectVTableInfo(const CXXRecordDecl *Decl, llvm::DIFile *F,                           SmallVectorImpl<llvm::Metadata *> &EltTys);    // CreateLexicalBlock - Create a new lexical block node and push it on @@ -218,20 +220,15 @@ public:    void finalize(); -  /// setLocation - Update the current source location. If \arg loc is +  /// \brief Update the current source location. If \arg loc is    /// invalid it is ignored.    void setLocation(SourceLocation Loc); -  /// getLocation - Return the current source location. -  SourceLocation getLocation() const { return CurLoc; } - -  /// EmitLocation - Emit metadata to indicate a change in line/column +  /// \brief Emit metadata to indicate a change in line/column    /// information in the source file. -  /// \param ForceColumnInfo  Assume DebugColumnInfo option is true. -  void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, -                    bool ForceColumnInfo = false); +  void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc); -  /// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate +  /// \brief Emit a call to llvm.dbg.function.start to indicate    /// start of a new function.    /// \param Loc       The location of the function header.    /// \param ScopeLoc  The location of the function body. @@ -240,23 +237,23 @@ public:                           QualType FnType, llvm::Function *Fn,                           CGBuilderTy &Builder); -  /// EmitFunctionEnd - Constructs the debug code for exiting a function. +  /// \brief Constructs the debug code for exiting a function.    void EmitFunctionEnd(CGBuilderTy &Builder); -  /// EmitLexicalBlockStart - Emit metadata to indicate the beginning of a +  /// \brief Emit metadata to indicate the beginning of a    /// new lexical block and push the block onto the stack.    void EmitLexicalBlockStart(CGBuilderTy &Builder, SourceLocation Loc); -  /// EmitLexicalBlockEnd - Emit metadata to indicate the end of a new lexical +  /// \brief Emit metadata to indicate the end of a new lexical    /// block and pop the current block.    void EmitLexicalBlockEnd(CGBuilderTy &Builder, SourceLocation Loc); -  /// EmitDeclareOfAutoVariable - Emit call to llvm.dbg.declare for an automatic +  /// \brief Emit call to llvm.dbg.declare for an automatic    /// variable declaration.    void EmitDeclareOfAutoVariable(const VarDecl *Decl, llvm::Value *AI,                                   CGBuilderTy &Builder); -  /// EmitDeclareOfBlockDeclRefVariable - Emit call to llvm.dbg.declare for an +  /// \brief Emit call to llvm.dbg.declare for an    /// imported variable declaration in a block.    void EmitDeclareOfBlockDeclRefVariable(const VarDecl *variable,                                           llvm::Value *storage, @@ -264,12 +261,12 @@ public:                                           const CGBlockInfo &blockInfo,                                           llvm::Instruction *InsertPoint = 0); -  /// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument +  /// \brief Emit call to llvm.dbg.declare for an argument    /// variable declaration.    void EmitDeclareOfArgVariable(const VarDecl *Decl, llvm::Value *AI,                                  unsigned ArgNo, CGBuilderTy &Builder); -  /// EmitDeclareOfBlockLiteralArgVariable - Emit call to +  /// \brief Emit call to    /// llvm.dbg.declare for the block-literal argument to a block    /// invocation function.    void EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, @@ -277,31 +274,30 @@ public:                                              llvm::Value *LocalAddr,                                              CGBuilderTy &Builder); -  /// EmitGlobalVariable - Emit information about a global variable. +  /// \brief Emit information about a global variable.    void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl); -  /// EmitGlobalVariable - Emit global variable's debug info. +  /// \brief Emit global variable's debug info.    void EmitGlobalVariable(const ValueDecl *VD, llvm::Constant *Init); -  /// \brief - Emit C++ using directive. +  /// \brief Emit C++ using directive.    void EmitUsingDirective(const UsingDirectiveDecl &UD); -  /// EmitExplicitCastType - Emit the type explicitly casted to. +  /// \brief Emit the type explicitly casted to.    void EmitExplicitCastType(QualType Ty); -  /// \brief - Emit C++ using declaration. +  /// \brief Emit C++ using declaration.    void EmitUsingDecl(const UsingDecl &UD); -  /// \brief - Emit C++ namespace alias. -  llvm::DIImportedEntity EmitNamespaceAlias(const NamespaceAliasDecl &NA); +  /// \brief Emit C++ namespace alias. +  llvm::DIImportedEntity *EmitNamespaceAlias(const NamespaceAliasDecl &NA); -  /// getOrCreateRecordType - Emit record type's standalone debug info. -  llvm::DIType getOrCreateRecordType(QualType Ty, SourceLocation L); +  /// \brief Emit record type's standalone debug info. +  llvm::DIType *getOrCreateRecordType(QualType Ty, SourceLocation L); -  /// getOrCreateInterfaceType - Emit an objective c interface type standalone +  /// \brief Emit an objective c interface type standalone    /// debug info. -  llvm::DIType getOrCreateInterfaceType(QualType Ty, -                                        SourceLocation Loc); +  llvm::DIType *getOrCreateInterfaceType(QualType Ty, SourceLocation Loc);    void completeType(const EnumDecl *ED);    void completeType(const RecordDecl *RD); @@ -311,133 +307,129 @@ public:    void completeTemplateDefinition(const ClassTemplateSpecializationDecl &SD);  private: -  /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration. +  /// \brief Emit call to llvm.dbg.declare for a variable declaration.    /// Tag accepts custom types DW_TAG_arg_variable and DW_TAG_auto_variable,    /// otherwise would be of type llvm::dwarf::Tag. -  void EmitDeclare(const VarDecl *decl, llvm::dwarf::LLVMConstants Tag, -                   llvm::Value *AI, unsigned ArgNo, CGBuilderTy &Builder); +  void EmitDeclare(const VarDecl *decl, llvm::dwarf::Tag Tag, llvm::Value *AI, +                   unsigned ArgNo, CGBuilderTy &Builder);    // EmitTypeForVarWithBlocksAttr - Build up structure info for the byref.    // See BuildByRefType. -  llvm::DIType EmitTypeForVarWithBlocksAttr(const VarDecl *VD, -                                            uint64_t *OffSet); +  llvm::DIType *EmitTypeForVarWithBlocksAttr(const VarDecl *VD, +                                             uint64_t *OffSet); -  /// getContextDescriptor - Get context info for the decl. -  llvm::DIScope getContextDescriptor(const Decl *Decl); +  /// \brief Get context info for the decl. +  llvm::DIScope *getContextDescriptor(const Decl *Decl); -  llvm::DIScope getCurrentContextDescriptor(const Decl *Decl); +  llvm::DIScope *getCurrentContextDescriptor(const Decl *Decl);    /// \brief Create a forward decl for a RecordType in a given context. -  llvm::DICompositeType getOrCreateRecordFwdDecl(const RecordType *, -                                                 llvm::DIDescriptor); - -  /// createContextChain - Create a set of decls for the context chain. -  llvm::DIDescriptor createContextChain(const Decl *Decl); +  llvm::DICompositeType *getOrCreateRecordFwdDecl(const RecordType *, +                                                  llvm::DIScope *); -  /// getCurrentDirname - Return current directory name. +  /// \brief Return current directory name.    StringRef getCurrentDirname(); -  /// CreateCompileUnit - Create new compile unit. +  /// \brief Create new compile unit.    void CreateCompileUnit(); -  /// getOrCreateFile - Get the file debug info descriptor for the input +  /// \brief Get the file debug info descriptor for the input    /// location. -  llvm::DIFile getOrCreateFile(SourceLocation Loc); +  llvm::DIFile *getOrCreateFile(SourceLocation Loc); -  /// getOrCreateMainFile - Get the file info for main compile unit. -  llvm::DIFile getOrCreateMainFile(); +  /// \brief Get the file info for main compile unit. +  llvm::DIFile *getOrCreateMainFile(); -  /// getOrCreateType - Get the type from the cache or create a new type if +  /// \brief Get the type from the cache or create a new type if    /// necessary. -  llvm::DIType getOrCreateType(QualType Ty, llvm::DIFile Fg); +  llvm::DIType *getOrCreateType(QualType Ty, llvm::DIFile *Fg); -  /// getOrCreateLimitedType - Get the type from the cache or create a new +  /// \brief Get the type from the cache or create a new    /// partial type if necessary. -  llvm::DIType getOrCreateLimitedType(const RecordType *Ty, llvm::DIFile F); +  llvm::DIType *getOrCreateLimitedType(const RecordType *Ty, llvm::DIFile *F); -  /// CreateTypeNode - Create type metadata for a source language type. -  llvm::DIType CreateTypeNode(QualType Ty, llvm::DIFile Fg); +  /// \brief Create type metadata for a source language type. +  llvm::DIType *CreateTypeNode(QualType Ty, llvm::DIFile *Fg); -  /// getObjCInterfaceDecl - return the underlying ObjCInterfaceDecl +  /// \brief return the underlying ObjCInterfaceDecl    /// if Ty is an ObjCInterface or a pointer to one.    ObjCInterfaceDecl* getObjCInterfaceDecl(QualType Ty); -  /// CreateMemberType - Create new member and increase Offset by FType's size. -  llvm::DIType CreateMemberType(llvm::DIFile Unit, QualType FType, -                                StringRef Name, uint64_t *Offset); +  /// \brief Create new member and increase Offset by FType's size. +  llvm::DIType *CreateMemberType(llvm::DIFile *Unit, QualType FType, +                                 StringRef Name, uint64_t *Offset);    /// \brief Retrieve the DIDescriptor, if any, for the canonical form of this    /// declaration. -  llvm::DIDescriptor getDeclarationOrDefinition(const Decl *D); +  llvm::DINode *getDeclarationOrDefinition(const Decl *D); -  /// getFunctionDeclaration - Return debug info descriptor to describe method +  /// \brief Return debug info descriptor to describe method    /// declaration for the given method definition. -  llvm::DISubprogram getFunctionDeclaration(const Decl *D); +  llvm::DISubprogram *getFunctionDeclaration(const Decl *D);    /// Return debug info descriptor to describe in-class static data member    /// declaration for the given out-of-class definition. -  llvm::DIDerivedType +  llvm::DIDerivedType *    getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D); -  /// \brief Create a DISubprogram describing the forward +  /// \brief Create a subprogram describing the forward    /// decalration represented in the given FunctionDecl. -  llvm::DISubprogram getFunctionForwardDeclaration(const FunctionDecl *FD); +  llvm::DISubprogram *getFunctionForwardDeclaration(const FunctionDecl *FD); -  /// \brief Create a DIGlobalVariable describing the forward -  /// decalration represented in the given VarDecl. -  llvm::DIGlobalVariable getGlobalVariableForwardDeclaration(const VarDecl *VD); +  /// \brief Create a global variable describing the forward decalration +  /// represented in the given VarDecl. +  llvm::DIGlobalVariable * +  getGlobalVariableForwardDeclaration(const VarDecl *VD);    /// Return a global variable that represents one of the collection of    /// global variables created for an anonmyous union. -  llvm::DIGlobalVariable -  CollectAnonRecordDecls(const RecordDecl *RD, llvm::DIFile Unit, unsigned LineNo, -                         StringRef LinkageName, llvm::GlobalVariable *Var, -                         llvm::DIDescriptor DContext); +  llvm::DIGlobalVariable * +  CollectAnonRecordDecls(const RecordDecl *RD, llvm::DIFile *Unit, +                         unsigned LineNo, StringRef LinkageName, +                         llvm::GlobalVariable *Var, llvm::DIScope *DContext); -  /// getFunctionName - Get function name for the given FunctionDecl. If the +  /// \brief Get function name for the given FunctionDecl. If the    /// name is constructed on demand (e.g. C++ destructor) then the name    /// is stored on the side.    StringRef getFunctionName(const FunctionDecl *FD); -  /// getObjCMethodName - Returns the unmangled name of an Objective-C method. +  /// \brief Returns the unmangled name of an Objective-C method.    /// This is the display name for the debugging info.    StringRef getObjCMethodName(const ObjCMethodDecl *FD); -  /// getSelectorName - Return selector name. This is used for debugging +  /// \brief Return selector name. This is used for debugging    /// info.    StringRef getSelectorName(Selector S); -  /// getClassName - Get class name including template argument list. +  /// \brief Get class name including template argument list.    StringRef getClassName(const RecordDecl *RD); -  /// getVTableName - Get vtable name for the given Class. +  /// \brief Get vtable name for the given Class.    StringRef getVTableName(const CXXRecordDecl *Decl); -  /// getLineNumber - Get line number for the location. If location is invalid +  /// \brief Get line number for the location. If location is invalid    /// then use current location.    unsigned getLineNumber(SourceLocation Loc); -  /// getColumnNumber - Get column number for the location. If location is +  /// \brief Get column number for the location. If location is    /// invalid then use current location.    /// \param Force  Assume DebugColumnInfo option is true.    unsigned getColumnNumber(SourceLocation Loc, bool Force=false);    /// \brief Collect various properties of a FunctionDecl.    /// \param GD  A GlobalDecl whose getDecl() must return a FunctionDecl. -  void collectFunctionDeclProps(GlobalDecl GD, -                                llvm::DIFile Unit, +  void collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit,                                  StringRef &Name, StringRef &LinkageName, -                                llvm::DIDescriptor &FDContext, -                                llvm::DIArray &TParamsArray, +                                llvm::DIScope *&FDContext, +                                llvm::DINodeArray &TParamsArray,                                  unsigned &Flags);    /// \brief Collect various properties of a VarDecl. -  void collectVarDeclProps(const VarDecl *VD, llvm::DIFile &Unit, -                           unsigned &LineNo, QualType &T, -                           StringRef &Name, StringRef &LinkageName, -                           llvm::DIDescriptor &VDContext); +  void collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit, +                           unsigned &LineNo, QualType &T, StringRef &Name, +                           StringRef &LinkageName, llvm::DIScope *&VDContext); -  /// internString - Allocate a copy of \p A using the DebugInfoNames allocator +  /// \brief Allocate a copy of \p A using the DebugInfoNames allocator    /// and return a reference to it. If multiple arguments are given the strings    /// are concatenated.    StringRef internString(StringRef A, StringRef B = StringRef()) { @@ -448,33 +440,60 @@ private:    }  }; +/// \brief A scoped helper to set the current debug location to the specified +/// location or preferred location of the specified Expr.  class ApplyDebugLocation { -protected: +private: +  void init(SourceLocation TemporaryLocation, bool DefaultToEmpty = false); +  ApplyDebugLocation(CodeGenFunction &CGF, bool DefaultToEmpty, +                     SourceLocation TemporaryLocation); +    llvm::DebugLoc OriginalLocation;    CodeGenFunction &CGF; -  public: -  ApplyDebugLocation(CodeGenFunction &CGF, -                     SourceLocation TemporaryLocation = SourceLocation(), -                     bool ForceColumnInfo = false); + +  /// \brief Set the location to the (valid) TemporaryLocation. +  ApplyDebugLocation(CodeGenFunction &CGF, SourceLocation TemporaryLocation); +  ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E);    ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc); +    ~ApplyDebugLocation(); -}; -/// ArtificialLocation - An RAII object that temporarily switches to -/// an artificial debug location that has a valid scope, but no line -/// information. This is useful when emitting compiler-generated -/// helper functions that have no source location associated with -/// them. The DWARF specification allows the compiler to use the -/// special line number 0 to indicate code that can not be attributed -/// to any source location. -/// -/// This is necessary because passing an empty SourceLocation to -/// CGDebugInfo::setLocation() will result in the last valid location -/// being reused. -class ArtificialLocation : public ApplyDebugLocation { -public: -  ArtificialLocation(CodeGenFunction &CGF); +  /// \brief Apply TemporaryLocation if it is valid. Otherwise switch to an +  /// artificial debug location that has a valid scope, but no line information. +  /// +  /// Artificial locations are useful when emitting compiler-generated helper +  /// functions that have no source location associated with them. The DWARF +  /// specification allows the compiler to use the special line number 0 to +  /// indicate code that can not be attributed to any source location. Note that +  /// passing an empty SourceLocation to CGDebugInfo::setLocation() will result +  /// in the last valid location being reused. +  static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF) { +    return ApplyDebugLocation(CGF, false, SourceLocation()); +  } +  /// \brief Apply TemporaryLocation if it is valid. Otherwise switch to an +  /// artificial debug location that has a valid scope, but no line information. +  static ApplyDebugLocation CreateDefaultArtificial(CodeGenFunction &CGF, +                                             SourceLocation TemporaryLocation) { +    return ApplyDebugLocation(CGF, false, TemporaryLocation); +  } + +  /// \brief Set the IRBuilder to not attach debug locations.  Note that passing +  /// an empty SourceLocation to CGDebugInfo::setLocation() will result in the +  /// last valid location being reused.  Note that all instructions that do not +  /// have a location at the beginning of a function are counted towards to +  /// funciton prologue. +  static ApplyDebugLocation CreateEmpty(CodeGenFunction &CGF) { +    return ApplyDebugLocation(CGF, true, SourceLocation()); +  } + +  /// \brief Apply TemporaryLocation if it is valid. Otherwise set the IRBuilder +  /// to not attach debug locations. +  static ApplyDebugLocation CreateDefaultEmpty(CodeGenFunction &CGF, +                                             SourceLocation TemporaryLocation) { +    return ApplyDebugLocation(CGF, true, TemporaryLocation); +  } +  }; | 
