From 4433f1cf8a2704395e509d020d8f79da4e273458 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Tue, 26 Jan 2010 05:19:50 +0000 Subject: [PATCH] Fix the test I broke, and also fix a crash when declaring a virtual destructor. Add debug info support for pure virtual member functions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94519 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDebugInfo.cpp | 46 ++++++++++++---------- lib/CodeGen/CGDebugInfo.h | 2 +- test/CodeGenCXX/PR4890-debug-info-dtor.cpp | 6 --- test/CodeGenCXX/debug-info.cpp | 17 ++++++++ 4 files changed, 43 insertions(+), 28 deletions(-) delete mode 100644 test/CodeGenCXX/PR4890-debug-info-dtor.cpp diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 14f34a7c72..e1aeb5ed8c 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -521,27 +521,21 @@ CollectRecordFields(const RecordDecl *Decl, /// CreateCXXMemberFunction - A helper function to create a DISubprogram for /// a single member function GlobalDecl. llvm::DISubprogram -CGDebugInfo::CreateCXXMemberFunction(GlobalDecl GD, +CGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, llvm::DICompileUnit Unit, llvm::DICompositeType &RecordTy) { - const CXXMethodDecl *Method = cast(GD.getDecl()); - - llvm::StringRef MethodName; + bool IsCtorOrDtor = + isa(Method) || isa(Method); + + llvm::StringRef MethodName = getFunctionName(Method); llvm::StringRef MethodLinkageName; llvm::DIType MethodTy = getOrCreateType(Method->getType(), Unit); - if (const CXXConstructorDecl *CDecl = dyn_cast(Method)) { - (void)CDecl; - MethodName = Method->getName(); - // FIXME : Find linkage name. - } else if (const CXXDestructorDecl *DDecl = dyn_cast(Method)) { - (void)DDecl; - MethodName = getFunctionName(Method); - // FIXME : Find linkage name. - } else { - // regular method - MethodName = getFunctionName(Method); + + // Since a single ctor/dtor corresponds to multiple functions, it doesn't + // make sense to give a single ctor/dtor a linkage name. + if (!IsCtorOrDtor) MethodLinkageName = CGM.getMangledName(Method); - } + SourceManager &SM = CGM.getContext().getSourceManager(); // Get the location for the method. @@ -559,10 +553,17 @@ CGDebugInfo::CreateCXXMemberFunction(GlobalDecl GD, llvm::DIType ContainingType; unsigned Virtuality = 0; unsigned VIndex = 0; + if (Method->isVirtual()) { - // FIXME: Identify pure virtual functions. - Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; - VIndex = CGM.getVtableInfo().getMethodVtableIndex(Method); + if (Method->isPure()) + Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual; + else + Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; + + // It doesn't make sense to give a virtual destructor a vtable index, + // since a single destructor has two entries in the vtable. + if (!isa(Method)) + VIndex = CGM.getVtableInfo().getMethodVtableIndex(Method); ContainingType = RecordTy; } @@ -573,8 +574,11 @@ CGDebugInfo::CreateCXXMemberFunction(GlobalDecl GD, MethodTy, /*isLocalToUnit=*/false, Method->isThisDeclarationADefinition(), Virtuality, VIndex, ContainingType); - if (Method->isThisDeclarationADefinition()) - SPCache[cast(Method)] = llvm::WeakVH(SP.getNode()); + + // Don't cache ctors or dtors since we have to emit multiple functions for + // a single ctor or dtor. + if (!IsCtorOrDtor && Method->isThisDeclarationADefinition()) + SPCache[Method] = llvm::WeakVH(SP.getNode()); return SP; } diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index e785bef101..405f02ba7b 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -88,7 +88,7 @@ class CGDebugInfo { const Type *Ty, QualType PointeeTy, llvm::DICompileUnit U); - llvm::DISubprogram CreateCXXMemberFunction(GlobalDecl GD, + llvm::DISubprogram CreateCXXMemberFunction(const CXXMethodDecl *Method, llvm::DICompileUnit Unit, llvm::DICompositeType &RecordTy); diff --git a/test/CodeGenCXX/PR4890-debug-info-dtor.cpp b/test/CodeGenCXX/PR4890-debug-info-dtor.cpp deleted file mode 100644 index bcaf1b9627..0000000000 --- a/test/CodeGenCXX/PR4890-debug-info-dtor.cpp +++ /dev/null @@ -1,6 +0,0 @@ -// RUN: %clang_cc1 -emit-llvm-only -g %s -struct X { - ~X(); -}; - -X::~X() { } diff --git a/test/CodeGenCXX/debug-info.cpp b/test/CodeGenCXX/debug-info.cpp index cb6e830a49..f18e9b08a0 100644 --- a/test/CodeGenCXX/debug-info.cpp +++ b/test/CodeGenCXX/debug-info.cpp @@ -24,3 +24,20 @@ namespace EmptyNameCrash { typedef struct { A x; } B; B x; } + +// PR4890 +namespace PR4890 { + struct X { + ~X(); + }; + + X::~X() { } +} + +namespace VirtualDtor { + struct Y { + virtual ~Y(); + }; + + Y::~Y() { } +} -- 2.50.1