diff options
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.h')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.h | 94 |
1 files changed, 61 insertions, 33 deletions
diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index 0ca274f56881..fc3f434991fa 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// // -// This is the source level debug info generator for llvm translation. +// This is the source-level debug info generator for llvm translation. // //===----------------------------------------------------------------------===// @@ -20,10 +20,10 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Frontend/CodeGenOptions.h" #include "llvm/ADT/DenseMap.h" -#include "llvm/DIBuilder.h" -#include "llvm/DebugInfo.h" +#include "llvm/IR/DIBuilder.h" +#include "llvm/IR/DebugInfo.h" +#include "llvm/IR/ValueHandle.h" #include "llvm/Support/Allocator.h" -#include "llvm/Support/ValueHandle.h" namespace llvm { class MDNode; @@ -47,8 +47,8 @@ namespace CodeGen { /// and is responsible for emitting to llvm globals or pass directly to /// the backend. class CGDebugInfo { - friend class NoLocation; friend class ArtificialLocation; + friend class SaveAndRestoreLocation; CodeGenModule &CGM; const CodeGenOptions::DebugInfoKind DebugKind; llvm::DIBuilder DBuilder; @@ -65,21 +65,27 @@ class CGDebugInfo { llvm::DIType BlockLiteralGeneric; /// TypeCache - Cache of previously constructed Types. - llvm::DenseMap<void *, llvm::WeakVH> TypeCache; + llvm::DenseMap<const void *, llvm::WeakVH> TypeCache; + + struct ObjCInterfaceCacheEntry { + const ObjCInterfaceType *Type; + 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 - /// which may change. Storing a pair of DIType and checksum. - llvm::DenseMap<void *, std::pair<llvm::WeakVH, unsigned> > ObjCInterfaceCache; + /// which may change. + llvm::SmallVector<ObjCInterfaceCacheEntry, 32> ObjCInterfaceCache; /// RetainedTypes - list of interfaces we want to keep even if orphaned. std::vector<void *> RetainedTypes; - /// CompleteTypeCache - Cache of previously constructed complete RecordTypes. - llvm::DenseMap<void *, llvm::WeakVH> CompletedTypeCache; - /// ReplaceMap - Cache of forward declared types to RAUW at the end of /// compilation. - std::vector<std::pair<void *, llvm::WeakVH> >ReplaceMap; + std::vector<std::pair<const TagType *, llvm::WeakVH>> ReplaceMap; // LexicalBlockStack - Keep track of our current nested lexical block. std::vector<llvm::TrackingVH<llvm::MDNode> > LexicalBlockStack; @@ -109,6 +115,7 @@ class CGDebugInfo { 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); @@ -119,6 +126,7 @@ class CGDebugInfo { 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); @@ -127,9 +135,9 @@ class CGDebugInfo { 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::DIType getCompletedTypeOrNull(const QualType); llvm::DICompositeType getOrCreateMethodType(const CXXMethodDecl *Method, llvm::DIFile F); llvm::DICompositeType getOrCreateInstanceMethodType( @@ -139,7 +147,7 @@ class CGDebugInfo { llvm::DIType getOrCreateVTablePtrType(llvm::DIFile F); llvm::DINameSpace getOrCreateNameSpace(const NamespaceDecl *N); llvm::DIType getOrCreateTypeDeclaration(QualType PointeeTy, llvm::DIFile F); - llvm::DIType CreatePointerLikeType(unsigned Tag, + llvm::DIType CreatePointerLikeType(llvm::dwarf::Tag Tag, const Type *Ty, QualType PointeeTy, llvm::DIFile F); @@ -219,8 +227,12 @@ public: /// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate /// start of a new function. - void EmitFunctionStart(GlobalDecl GD, QualType FnType, - llvm::Function *Fn, CGBuilderTy &Builder); + /// \param Loc The location of the function header. + /// \param ScopeLoc The location of the function body. + void EmitFunctionStart(GlobalDecl GD, + SourceLocation Loc, SourceLocation ScopeLoc, + QualType FnType, llvm::Function *Fn, + CGBuilderTy &Builder); /// EmitFunctionEnd - Constructs the debug code for exiting a function. void EmitFunctionEnd(CGBuilderTy &Builder); @@ -261,9 +273,6 @@ public: /// EmitGlobalVariable - Emit information about a global variable. void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl); - /// EmitGlobalVariable - Emit information about an objective-c interface. - void EmitGlobalVariable(llvm::GlobalVariable *GV, ObjCInterfaceDecl *Decl); - /// EmitGlobalVariable - Emit global variable's debug info. void EmitGlobalVariable(const ValueDecl *VD, llvm::Constant *Init); @@ -284,14 +293,19 @@ public: llvm::DIType getOrCreateInterfaceType(QualType Ty, SourceLocation Loc); + void completeType(const EnumDecl *ED); void completeType(const RecordDecl *RD); void completeRequiredType(const RecordDecl *RD); void completeClassData(const RecordDecl *RD); + void completeTemplateDefinition(const ClassTemplateSpecializationDecl &SD); + private: /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration. - void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI, - unsigned ArgNo, CGBuilderTy &Builder); + /// 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); // EmitTypeForVarWithBlocksAttr - Build up structure info for the byref. // See BuildByRefType. @@ -342,9 +356,9 @@ private: 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 + /// \brief Retrieve the DIScope, if any, for the canonical form of this /// declaration. - llvm::DIDescriptor getDeclarationOrDefinition(const Decl *D); + llvm::DIScope getDeclarationOrDefinition(const Decl *D); /// getFunctionDeclaration - Return debug info descriptor to describe method /// declaration for the given method definition. @@ -355,6 +369,13 @@ private: llvm::DIDerivedType getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D); + /// 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); + /// getFunctionName - 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. @@ -394,16 +415,26 @@ private: } }; -/// NoLocation - An RAII object that temporarily disables debug -/// locations. This is useful for emitting instructions that should be -/// counted towards the function prologue. -class NoLocation { +/// SaveAndRestoreLocation - An RAII object saves the current location +/// and automatically restores it to the original value. +class SaveAndRestoreLocation { +protected: SourceLocation SavedLoc; CGDebugInfo *DI; CGBuilderTy &Builder; public: + SaveAndRestoreLocation(CodeGenFunction &CGF, CGBuilderTy &B); + /// Autorestore everything back to normal. + ~SaveAndRestoreLocation(); +}; + +/// NoLocation - An RAII object that temporarily disables debug +/// locations. This is useful for emitting instructions that should be +/// counted towards the function prologue. +class NoLocation : public SaveAndRestoreLocation { +public: NoLocation(CodeGenFunction &CGF, CGBuilderTy &B); - /// ~NoLocation - Autorestore everything back to normal. + /// Autorestore everything back to normal. ~NoLocation(); }; @@ -418,10 +449,7 @@ public: /// This is necessary because passing an empty SourceLocation to /// CGDebugInfo::setLocation() will result in the last valid location /// being reused. -class ArtificialLocation { - SourceLocation SavedLoc; - CGDebugInfo *DI; - CGBuilderTy &Builder; +class ArtificialLocation : public SaveAndRestoreLocation { public: ArtificialLocation(CodeGenFunction &CGF, CGBuilderTy &B); @@ -429,7 +457,7 @@ public: /// (= the top of the LexicalBlockStack). void Emit(); - /// ~ArtificialLocation - Autorestore everything back to normal. + /// Autorestore everything back to normal. ~ArtificialLocation(); }; |