]> granicus.if.org Git - clang/commitdiff
Fix the test I broke, and also fix a crash when declaring a virtual destructor. Add...
authorAnders Carlsson <andersca@mac.com>
Tue, 26 Jan 2010 05:19:50 +0000 (05:19 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 26 Jan 2010 05:19:50 +0000 (05:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94519 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CGDebugInfo.h
test/CodeGenCXX/PR4890-debug-info-dtor.cpp [deleted file]
test/CodeGenCXX/debug-info.cpp

index 14f34a7c7295093af7ff301c01f7536f355492bc..e1aeb5ed8ccee9092f500cb61d2321f18446c1c8 100644 (file)
@@ -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<CXXMethodDecl>(GD.getDecl());
-
-  llvm::StringRef MethodName;
+  bool IsCtorOrDtor = 
+    isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method);
+  
+  llvm::StringRef MethodName = getFunctionName(Method);
   llvm::StringRef MethodLinkageName;
   llvm::DIType MethodTy = getOrCreateType(Method->getType(), Unit);
-  if (const CXXConstructorDecl *CDecl = dyn_cast<CXXConstructorDecl>(Method)) {
-    (void)CDecl;
-    MethodName = Method->getName();
-    // FIXME : Find linkage name.
-  } else if (const CXXDestructorDecl *DDecl = dyn_cast<CXXDestructorDecl>(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<CXXDestructorDecl>(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<FunctionDecl>(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;
 }
index e785bef1016bcde9e7bc15ffe99fcc4befed0bf6..405f02ba7bf231d97fea05f0ce00ab8c4f9d7d48 100644 (file)
@@ -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 (file)
index bcaf1b9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-// RUN: %clang_cc1 -emit-llvm-only -g %s
-struct X {
-  ~X();
-};
-
-X::~X() { }
index cb6e830a49e0e10e3195d12eb594403ec5307bcf..f18e9b08a0226f0ccfba9d33cfcb892636410d2b 100644 (file)
@@ -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() { }
+}