From: Anders Carlsson Date: Fri, 6 Nov 2009 19:19:55 +0000 (+0000) Subject: Simplify the debug info code, handle lvalue references and template specializations. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a031b35ba4da13e105a349493f5351014cfb3354;p=clang Simplify the debug info code, handle lvalue references and template specializations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86277 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index e7e581b00a..8f4aeb400a 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -242,32 +242,37 @@ llvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DICompileUnit U llvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, llvm::DICompileUnit Unit) { - llvm::DIType EltTy = getOrCreateType(Ty->getPointeeType(), Unit); - - // Bit size, align and offset of the type. - uint64_t Size = M->getContext().getTypeSize(Ty); - uint64_t Align = M->getContext().getTypeAlign(Ty); - llvm::DIType DbgTy = - DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, Unit, - "", llvm::DICompileUnit(), - 0, Size, Align, 0, 0, EltTy); + CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, + Ty->getPointeeType(), Unit); TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = DbgTy.getNode(); return DbgTy; } llvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, llvm::DICompileUnit Unit) { - llvm::DIType EltTy = getOrCreateType(Ty->getPointeeType(), Unit); + return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, + Ty->getPointeeType(), Unit); +} + +llvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, + const Type *Ty, + QualType PointeeTy, + llvm::DICompileUnit Unit) { + llvm::DIType EltTy = getOrCreateType(PointeeTy, Unit); // Bit size, align and offset of the type. - uint64_t Size = M->getContext().getTypeSize(Ty); + + // Size is always the size of a pointer. We can't use getTypeSize here + // because that does not return the correct value for references. + uint64_t Size = + M->getContext().Target.getPointerWidth(PointeeTy.getAddressSpace()); uint64_t Align = M->getContext().getTypeAlign(Ty); return - DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, Unit, - "", llvm::DICompileUnit(), + DebugFactory.CreateDerivedType(Tag, Unit, "", llvm::DICompileUnit(), 0, Size, Align, 0, 0, EltTy); + } llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, @@ -802,6 +807,11 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, return DbgTy; } +llvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty, + llvm::DICompileUnit Unit) { + return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, + Ty, Ty->getPointeeType(), Unit); +} /// getOrCreateType - Get the type from the cache or create a new /// one if necessary. @@ -890,6 +900,14 @@ llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, return CreateTypeNode(T->getReplacementType(), Unit); } + case Type::TemplateSpecialization: { + const TemplateSpecializationType *T = cast(Ty); + return CreateTypeNode(T->desugar(), Unit); + } + + case Type::LValueReference: + return CreateType(cast(Ty), Unit); + } } diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index 2e44e09d25..ffb1af4056 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -73,7 +73,11 @@ class CGDebugInfo { llvm::DIType CreateType(const ObjCInterfaceType *Ty, llvm::DICompileUnit U); llvm::DIType CreateType(const EnumType *Ty, llvm::DICompileUnit U); llvm::DIType CreateType(const ArrayType *Ty, llvm::DICompileUnit U); + llvm::DIType CreateType(const LValueReferenceType *Ty, llvm::DICompileUnit U); + llvm::DIType CreatePointerLikeType(unsigned Tag, + const Type *Ty, QualType PointeeTy, + llvm::DICompileUnit U); public: CGDebugInfo(CodeGenModule *m); ~CGDebugInfo(); diff --git a/test/CodeGenCXX/debug-info.cpp b/test/CodeGenCXX/debug-info.cpp index 2a141857cf..ac9aee4cb2 100644 --- a/test/CodeGenCXX/debug-info.cpp +++ b/test/CodeGenCXX/debug-info.cpp @@ -4,3 +4,5 @@ template struct Identity { }; void f(Identity::Type a) {} +void f(Identity a) {} +void f(int& a) { }