From 443f6773029a45a705ae2873fb620904289513dd Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Fri, 6 Nov 2009 19:19:55 +0000 Subject: [PATCH] Simplify the debug info code, handle lvalue references and template specializations. llvm-svn: 86277 --- clang/lib/CodeGen/CGDebugInfo.cpp | 44 ++++++++++++++++++++-------- clang/lib/CodeGen/CGDebugInfo.h | 4 +++ clang/test/CodeGenCXX/debug-info.cpp | 2 ++ 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index e7e581b00a0c..8f4aeb400a16 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/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/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h index 2e44e09d2590..ffb1af405673 100644 --- a/clang/lib/CodeGen/CGDebugInfo.h +++ b/clang/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/clang/test/CodeGenCXX/debug-info.cpp b/clang/test/CodeGenCXX/debug-info.cpp index 2a141857cfe6..ac9aee4cb2f4 100644 --- a/clang/test/CodeGenCXX/debug-info.cpp +++ b/clang/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) { }